L’application de fenêtre C # extrait le mot de la position du curseur de l’autre application

J’ai une application de fenêtre C # et je souhaite obtenir du texte à l’endroit où se trouve actuellement le curseur ou le texte sélectionné dans une autre application, telle que le bloc-notes, le bloc-notes ++ ou n’importe quel navigateur, etc.

Avez-vous déjà consulté cet article de CodeProject ? Cela pourrait être un début même si ce n’est pas exactement ce que vous recherchez.

Voir http://msdn.microsoft.com/en-us/library/windows/desktop/ms632604(v=vs.85).aspx .

Si cela ne résout pas votre problème, consultez http://msdn.microsoft.com/en-us/library/system.windows.automation.textpattern.getselection(v=vs.110).aspx , comme suggéré dans les commentaires.

Obtenir le texte sous le curseur (ou à partir du curseur) nécessite le support UI Automation et TextPattern de l’application. Le problème est que toutes les applications ne supportent pas cela, et plus l’application est ancienne, moins il est probable que TextPattern soit supporté.

Obtenir le texte sélectionné est, assez ironiquement, un peu plus facile, bien que pas encore à 100%. J’ai esquissé une solution dans cette réponse . Cela implique de gérer le focus et de manipuler le presse-papiers pour obtenir la solution la plus générale, et il n’est en aucun cas parfait.

Une autre option, qui implique une tonne de travail, consiste à utiliser un pilote miroir pour capturer le contenu de l’écran, puis à utiliser d’autres technologies (OCR, etc.) pour capturer le texte. Je ne le recommande pas vraiment; il n’est pas pris en charge par Windows 8 et les versions ultérieures, mais si vous devez absolument disposer d’une assistance à 100% pour toutes les applications ayant le moins d’impact, alors c’est une possibilité. C’est beaucoup de travail, cependant. Certainement pas pour les fous.

Ceci est possible avec les technologies d’accessibilité (comme les lecteurs d’écran). Cependant, il faudra beaucoup de dépannage:

La réponse à propos de MSAA à la question suivante est l’endroit où vous devrez commencer.

Meilleur moyen d’obtenir le “mot avant le curseur” dans le champ de texte d’une application ouverte

De plus, la question suivante est utile pour l’implémenter:

Comment obtenir le mot sous le curseur sous Windows?

Le problème est que vous essayez d’obtenir des données d’une autre application. À moins que cette application ne prenne en charge un moyen de vous fournir cette information, ce sera très difficile.

Il serait beaucoup plus facile de récupérer les informations à partir de l’application, comme dans une zone de texte ou un contrôle de texte enrichi sur un formulaire.

Vous pouvez utiliser clipborad pour copier ou obtenir ce texte, puis le transférer dans la fenêtre de votre choix.

Vous pouvez utiliser la classe SendKeys pour illustrer le clavier.

Par exemple, vous pouvez utiliser SendKeys.Send("^C") dans votre programme, puis un code permettant de se concentrer sur Notepad ++, puis sur SendKeys.Send("^V") .

 SendKeys.Send("^C"); // code to change active window and focus on Notepad++. SendKeys.Send("^V"); 

Merci de m’aider.

Je ne parviens toujours pas à obtenir le texte de la position du curseur. Donc, finalement, je récupère tout le texte de la fenêtre active et récupère mon texte avec Regex.

  private ssortingng SelectText(IntPtr hWnd) { ssortingng text = ssortingng.Empty; Regex regex = new Regex(@"(\d{3}-\w{5,8})"); if (InputSimulator.IsKeyDown(VirtualKeyCode.SHIFT)) { InputSimulator.SimulateKeyUp(VirtualKeyCode.SHIFT); } if (InputSimulator.IsKeyDown(VirtualKeyCode.MENU)) { InputSimulator.SimulateKeyUp(VirtualKeyCode.MENU); } InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C); text = Clipboard.GetText(); if (!ssortingng.IsNullOrEmpty(text) && regex.IsMatch(text)) { Thread.Sleep(100); text.Trim(); ssortingng[] textArr = text.Split(' '); text = textArr[textArr.Length - 1]; } else { InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_A); InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C); ClickOnPoint(); Thread.Sleep(100); text = Clipboard.GetText(); MatchCollection matchCollection = regex.Matches(text); if (matchCollection.Count > 0) { text = matchCollection[0].Value; } else { text = ssortingng.Empty; } } Clipboard.Clear(); return text; }