49 votes

Comment obtenir le mot sous le curseur sous Windows?

Je veux créer une application qui obtient le mot sous le curseur (pas seulement pour les champs de texte), mais je ne trouve pas comment faire. L'utilisation de l'OCR est assez dur. La seule chose que j'ai vu travailler est la Deskperience composants. Ils soutiennent un "indigène", mais je ils coûtent beaucoup. Maintenant, je suis à essayer de comprendre ce qu'est cette "native" de façon (peut-être en quelque sorte d'accrochage). Toute aide sera appréciée.

EDIT: J'ai trouvé un moyen, mais c'est seulement le texte intégral de la commande. Aucune idée comment faire pour obtenir uniquement le mot sous le curseur de l'ensemble du texte?

50voto

Simon Mourier Points 49585

Sur les versions récentes de Windows, la méthode recommandée pour recueillir des informations à partir d'une application à l'autre (si vous n'avez pas l'application ciblée, bien sûr) est à utiliser l' INTERFACE utilisateur de l'Automatisationde la technologie. Wikipédia est assez bonne pour plus d'informations sur ce: Microsoft UI Automation

Fondamentalement, UI automation va utiliser tous les moyens nécessaires pour rassembler ce qui peut l'être réunis

Voici une petite application console code espion de l'INTERFACE utilisateur d'autres applications. Lancez-le et déplacez la souris sur les différentes applications. Chaque application dispose d'une prise en charge différentes pour les différents "UI automation modèles". Par exemple, il y a la Valeur de modèle et le modèle de Texte tel que démontré ici.

static void Main(string[] args)
{
    do
    {
        System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position; // use Windows forms mouse code instead of WPF
        AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
        if (element == null)
        {
            // no element under mouse
            return;
        }

        Console.WriteLine("Element at position " + mouse + " is '" + element.Current.Name + "'");

        object pattern;
        // the "Value" pattern is supported by many application (including IE & FF)
        if (element.TryGetCurrentPattern(ValuePattern.Pattern, out pattern))
        {
            ValuePattern valuePattern = (ValuePattern)pattern;
            Console.WriteLine(" Value=" + valuePattern.Current.Value);
        }

        // the "Text" pattern is supported by some applications (including Notepad)and returns the current selection for example
        if (element.TryGetCurrentPattern(TextPattern.Pattern, out pattern))
        {
            TextPattern textPattern = (TextPattern)pattern;
            foreach(TextPatternRange range in textPattern.GetSelection())
            {
                Console.WriteLine(" SelectionRange=" + range.GetText(-1));
            }
        }
        Thread.Sleep(1000);
        Console.WriteLine(); Console.WriteLine();
    }
    while (true);
}

UI automation est en fait pris en charge par Internet Explorer et Firefox, mais pas par Chrome à ma connaissance. Voir ce lien: Quand Google Chrome être accessible?

Maintenant, c'est juste le début du travail pour vous :-), parce que:

  • La plupart du temps, tout cela a une lourde incidence sur la sécurité. L'utilisation de cette technologie (ou de demander à Windows de la technologie tels que WindowFromPoint) nécessitera des droits suffisants pour le faire (comme le fait d'être un administrateur). Et je ne pense pas DExperience a aucune façon de surmonter ces limitations, à moins d'installer un pilote de noyau sur l'ordinateur.

  • Certaines applications ne seront pas d'exposer quelque chose à quelqu'un, même avec des droits appropriés. Par exemple, si j'écris une application bancaire, je ne veux pas vous espionner ce que mon écran :-). D'autres applications telles que Outlook avec DRM ne seront pas d'exposer quoi que ce soit pour les mêmes raisons.

  • Seule la UI automation modèle de Texte de soutien peut donner plus d'informations (comme le mot) que de simplement l'ensemble du texte. Hélas, cette spécificité n'est pas pris en charge par IE ni FF, même s'ils prennent en charge l'INTERFACE utilisateur de l'automatisation à l'échelle mondiale.

Donc, si tout cela ne fonctionne pas pour vous, vous aurez à plonger plus profond et l'utilisation de ROC ou de reconnaissance de formes techniques. Même avec cela, il y aura des cas où vous ne serez pas en mesure de le faire (à cause des droits en matière de sécurité).

7voto

baalazamon Points 1728

Si l'application a besoin pour traiter non seulement .Net apps je voudrais commencer par l'importation de fonctions (P/Invoke):

Plus tard, vous pouvez effectuer une itération sur les contrôles et essayer d'obtenir le texte de l'intérieur en fonction de leur type. Si je vais trouver un peu de temps je vais essayer de publier un tel code.

Après quelques vérifications, il ressemble à la meilleure façon (malheureusement, le dur aussi) est de s'accrocher dans GDI rendu de texte à une discussion

5voto

Jonathan Wood Points 26443

J'avais écho à ce Patricker dit, mais je pense qu'il n'y a aucun moyen fiable de faire ce que vous voulez.

Vous avez probablement obtenu le texte de la fenêtre ou quelque chose comme ça. Mais que faire si le curseur est au dessus d'une fenêtre qui n'utilise pas le texte de la fenêtre pour stocker son contenu? Les fenêtres sont sous aucune obligation de stocker leurs données d'une manière particulière.

Cela finit par vous diriger vers la reconnaissance de caractères qui permet de voir les pixels sous le curseur et essayer de comprendre ce que les mots sont là. Mais ce n'est pas seulement très non-trivial, il n'est pas non plus infaillible. Ce que si une partie de la parole n'est pas visible car il s'étend hors de la fenêtre?

Ce n'est certainement pas anodin. Il ya un couple de façons de l'aborder. Mais il n'y a aucun moyen fiable qui fonctionne avec tous les windows.

2voto

Giorgi Points 15760

Il existe un sdk pour obtenir le texte en utilisant l'OCR. Ce n'est pas gratuit, mais c'est assez bon marché comparé à d'autres produits: http://www.screenocr.com/screen-ocr-library-sdk.htm Ils ont une application qui fournit les mêmes fonctionnalités pour vous permettre d'essayer la démo.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X