Wie bekomme ich den markierten text aus der aktiven Fensters mit systemeigenen Win32-API?
Meine app. wird auf dem system ausgeführt werden, versuchen Sie die überwachung für einen hotkey; wenn der Benutzer text in das Fenster und drückt einen hotkey, wie bekomme ich den markierten text, wenn ich die WM_HOTKEY-Nachricht?
Erfassen den text in die Zwischenablage kopieren, ich habe versucht, per Strg + C Verwendung keybd_event()
und SendInput()
an das aktive Fenster (GetActiveWindow()
) und forground-Fenster (GetForegroundWindow()
); versucht, Kombinationen von diesen; alles vergeblich. Bekomme ich den markierten text des aktiven Fensters in Windows mit einfachen Win32-system-APIs?
- Sind Sie sicher, dass Sie immer die richtige Fenster-handle? Sie können dies testen, mit Spy++. Auch haben Sie versucht, die guten alten WM_GETTEXT?
- Welche Windows-version?
- Windows XP und höher, 32-und 64 bit; im Grunde bin Portierung meiner app (artha.sourceforge.net) zu Windows und ich brauche diese Funktion, um fortzufahren.
- Danke! Während WM_GETTEXT nur bringt mich die Klasse name, aber der Tipp mit Spy++ hat geholfen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR: ja, es ist ein Weg, dies zu tun, verwenden einfache win32-system-APIs, aber es ist schwierig, korrekt implementieren.
WM_COPY und WM_GETTEXT arbeiten kann, aber nicht in allen Fällen. Sie sind auf der empfangende Fenster-handling die Anfrage korrekt - und in vielen Fällen ist es nicht. Lassen Sie mich führen Sie durch eine mögliche Art, dies zu tun. Es ist vielleicht nicht so einfach, wie Sie gehofft hatten, aber was ist in die Abenteuer-Welt der win32-Programmierung? Sind Sie bereit? Ok. Let ' s go.
Zuerst müssen wir die HWND-id des Ziel-Fenster. Es gibt viele Möglichkeiten, dies zu tun. Ein solcher Ansatz ist der, die Sie oben erwähnt: Holen Sie sich die Vordergrund-Fenster und dann das Fenster mit Fokus, etc. Es gibt jedoch eine riesige gotcha, dass viele Menschen vergessen. Nachdem Sie das Vordergrund-Fenster, das Sie muss
AttachThreadInput
um das Fenster mit Fokus. AnsonstenGetFocus()
wird einfach zurückNULL
.Gibt es einen viel einfacheren Weg. Einfach (miss)Gebrauch der GUITREADINFO Funktionen. Es ist viel sicherer, als es vermeidet alle versteckten Gefahren, die mit dem anbringen Ihres Eingangs-thread mit einem anderen Programm.
Senden der Tastendrücke um den text zu kopieren ist etwas komplizierter...
Verwenden wir SendInput statt keybd_event weil es schneller ist, und, am wichtigsten ist, kann nicht verhunzt werden durch concurrent-user-input oder anderen Programmen, die Simulation von Tastenanschlägen.
Bedeutet dies, dass das Programm wird benötigt, um die Ausführung auf Windows XP oder später, aber so, sorry, wenn Ihr mit 98!
Gibt. Das war nicht so schlimm, es war?
Nun müssen wir nur nehmen Sie einen Blick an, was Sie in die Zwischenablage. Dies ist nicht so einfach, wie Sie zunächst denken. Die "Zwischenablage" kann eigentlich mehrere Darstellungen ein und derselben Sache. Die Anwendung, die aktiv ist, wenn Sie kopieren in die Zwischenablage hat Kontrolle darüber, was genau zu platzieren in die Zwischenablage.
Beim kopieren von text aus Microsoft Office, zum Beispiel Orte, die RTF-Daten in die Zwischenablage, neben einer plain-text-Darstellung des gleichen Textes. Auf diese Weise können Sie fügen Sie Sie in wordpad und Editor. Wordpad möchten, verwenden Sie die rich-text-format, während Editor möchten, verwenden Sie die nur-text-format.
Für dieses einfache Beispiel, aber nehmen wir nur daran interessiert sind, im Klartext.
Und dort haben Sie es! So stellen Sie sicher, kopieren, lpstr, um einige Variablen, die Sie verwenden möchten, nicht verwenden LPTSTR direkt, da wir abtreten der Kontrolle des Inhalts der Zwischenablage, bevor wir es schließen.
Win32-Programmierung kann ziemlich einschüchternd auf den ersten, aber nach einer Weile... es ist immer noch erschreckend.
Prost!
Ctrl + Alt + S
und in der WM_HOTKEY, rief ich mit SendInputCtrl + C
. Aber wenn der Benutzer drücktCtrl + Alt + S
,Alt
noch nach unten sein, wenn ich nahezu passCtrl + C
; wenn ich verändert Sie den hotkey zumWindows + S
es funktionierte perfekt. In einen hotkey mitAlt
in der Kombination, wenn ich praktisch unpressAlt
(KEYEVENTF_KEYUP), es funktioniert auch.Ctrl + C
(Kopie) allein an den OS? Grund ich will ist es, den Kopiervorgang behindert wird durch Tasten, wieShift
oderAlt
wenn Sie gedrückt, wenn ich den passCtrl + C
.attachThreadInput
und b) bekommen Sie das Fenster mit dem Tastaturfokus. Dann geh ich zu erklären, der nicht verwandtenSendInput
Methode, die keine HWND-Eigenschaft-ids. Die zwei Ideen sind nicht so sauber getrennt, wie Sie sein sollten.Versuchen Sie, ein
Sleep()
nach jedem SendInput(). Einige apps sind einfach nicht schnell in den Fang von Tastatureingaben.Versuchen SendMessage(WM_COPY, etc. ).