Comment puis-je obtenir le texte sélectionné dans la fenêtre à l'aide des API Win32 natif?
Mon application. seront en cours d'exécution sur le système d'essayer de surveillance pour une touche de raccourci; lorsque l'utilisateur sélectionne du texte dans n'importe quelle fenêtre et appuie sur une touche de raccourci, comment puis-je obtenir le texte sélectionné, quand je reçois la WM_HOTKEY message?
Pour capturer le texte dans le presse-papiers, j'ai essayé d'envoyer des Ctrl + C à l'aide de keybd_event()
et SendInput()
de la fenêtre active (GetActiveWindow()
) et présente une fenêtre (GetForegroundWindow()
); essayé des combinaisons entre ces; le tout en vain. Puis-je obtenir le texte sélectionné de la fenêtre dans Windows avec la plaine Win32 Api du système?
- Êtes-vous sûr d'obtenir la bonne poignée de fenêtre? Vous pouvez le tester avec Spy++. Aussi, avez-vous essayé la bonne vieille WM_GETTEXT?
- La version Windows?
- Windows XP et versions ultérieures; 32 et 64 bits; fondamentalement suis le portage de mon application (artha.sourceforge.net) pour Windows et j'ai besoin de cette fonctionnalité pour continuer.
- Merci! Alors que WM_GETTEXT seulement me met le nom de la classe mais l'astuce sur l'utilisation de Spy++ aidé 🙂
Vous devez vous connecter pour publier un commentaire.
TL;DR: Oui, il y a une manière de le faire en utilisant un système win32 Api, mais il est difficile de mettre en œuvre correctement.
WM_COPY et WM_GETTEXT peut fonctionner, mais pas dans tous les cas. Ils dépendent de la fenêtre de réception du traitement de la demande correctement et dans de nombreux cas, il ne sera pas. Permettez-moi de passer par une voie possible de le faire. Il peut ne pas être aussi simple que vous l'espériez, mais ce qui est dans l'aventure remplie de monde de la programmation win32? Est-il prêt? Ok. Let's go.
Nous avons d'abord besoin d'obtenir le HWND de l'id de la fenêtre cible. Il y a beaucoup de façons de le faire. Une telle approche est celui que vous avez mentionné ci-dessus: obtenir la fenêtre de premier plan, puis la fenêtre ayant le focus, etc. Cependant, il y a un énorme comprends que beaucoup de gens oublient. Après que vous obtenez la fenêtre de premier plan vous doit
AttachThreadInput
pour obtenir la fenêtre qui a le focus. SinonGetFocus()
renvoie simplementNULL
.Il y a un moyen beaucoup plus facile. Il suffit de (miss)utiliser le GUITREADINFO fonctions. Il est beaucoup plus sûr, car il évite tous les dangers cachés associés avec le fait d'attacher votre entrée de fil avec un autre programme.
L'envoi de la séquence de touches pour copier le texte est un peu plus compliqué...
Nous allons utiliser SendInput au lieu de keybd_event car il est plus rapide, et, plus important encore, ne peut pas être sali par simultanée de l'utilisateur, ou d'autres programmes de simulation de frappe clavier.
Cela signifie que le programme devra être exécuté sur Windows XP ou plus tard, si, si, désolé, si votre exécution de 98!
Là. Ce n'était pas si mauvais, était-il?
Maintenant nous avons juste à prendre un coup d'oeil à ce qui est dans le presse-papiers. Ce n'est pas aussi simple que vous le souhaitez d'abord penser. Le "presse-papiers" peut contenir de multiples représentations de la même chose. L'application est active lorsque vous copiez dans le presse-papiers a le contrôle sur ce qu'est exactement à la place dans le presse-papiers.
Lorsque vous copiez du texte à partir de Microsoft Office, par exemple, il place les données au format RTF dans le presse-papiers, à côté d'un texte brut de la représentation d'un même texte. De cette façon, vous pouvez le coller dans wordpad et le bloc-notes. Wordpad serait d'utiliser le format de texte enrichi, tandis que le bloc-notes serait d'utiliser le format de texte brut.
Pour cet exemple simple, mais, supposons que nous sommes seulement intéressés en clair.
Et là vous l'avez! Assurez-vous de copier lpstr à une variable que vous souhaitez utiliser, ne pas utiliser de lpstr directement, puisque nous avons à céder le contrôle du contenu du presse-papiers avant de nous la fermer.
De la programmation Win32 peut être assez intimidant au premier abord, mais après un certain temps... c'est toujours intimidant.
Cheers!
Ctrl + Alt + S
et dans le WM_HOTKEY, j'ai appelé SendInput avecCtrl + C
. Mais lorsque l'utilisateur appuie surCtrl + Alt + S
,Alt
seront encore en baisse quand j'ai pratiquement passCtrl + C
; quand j'ai changé le raccourci clavier pourWindows + S
il a parfaitement fonctionné. Dans un raccourci clavier avecAlt
dans la combinaison, lorsque j'ai pratiquement unpressAlt
(KEYEVENTF_KEYUP), il travaille trop.Ctrl + C
(copie) seul est transmis à l'OS? Raison pour laquelle je veux c'est que l'opération de copie est entravée par des touches deShift
ouAlt
quand ils sont pressés, lorsque je passeCtrl + C
.attachThreadInput
, et b) obtenir la fenêtre avec le focus du clavier. Puis-je aller pour expliquer la non reliésSendInput
méthode qui n'utilise pas les HWND id. Les deux idées ne sont pas aussi clairement séparées comme elles devraient l'être.Essayez d'ajouter un
Sleep()
après chaque SendInput(). Certaines applications ne sont pas si rapide dans la capture de la saisie au clavier.Essayer SendMessage(WM_COPY, etc. ).