Ich möchte Tastatureingaben an ein Fenster in einem anderen Prozess senden, ohne dieses Fenster in den Vordergrund zu bringen. Ich kann PostMessage
verwenden, um die WM_KEYDOWN
und WM_KEYUP
vorzutäuschen; alles, was ich wissen muss, ist, welches Fensterhandle die Tastatureingabe erhalten sollte - dh, etwas wie GetFocus , aber für eine andere, nicht aktive Anwendung.
Die GetGUIThreadInfo API sieht vielversprechend aus - sie gibt ein% co_de zurück % für eine andere App Aber ich hatte kein Glück, dass es von C # auf meinem 64-Bit-Betriebssystem funktioniert. Ich habe die Erklärungen von pinvoke.net kopiert (und dann weiter optimiert), aber alles, was ich jemals zurückbekomme, ist ein allgemeiner Fehlercode (mehr Details unten) ).
Ich setze cbSize, bevor ich GetGUIThreadInfo anrufe, also habe ich das offensichtlichste potentielle Problem vermieden.
Ich verwende 64-Bit-Vista, daher weiß ich nicht, ob das Problem darin besteht, dass ich die API nicht richtig verwende oder dass sie in 64-Bit anders funktioniert - ich muss noch einen Code finden Probe, die ausdrücklich sagt, dass es in Win64 erfolgreich funktioniert.
Hier ist ein Beispielcode. Ich verwende GetWindowThreadProcessId wie empfohlen , also denke ich nicht Problem hat mit Thread-IDs mit Thread-Handles zu tun:
%Vor% hwndFocus
ist ein gültiges Fensterhandle; window
gibt ein Thread-Handle ungleich Null zurück. Aber der Aufruf von GetWindowThreadProcessId
gibt immer GetGUIThreadInfo
zurück, und die Ausnahmebedingungsnachricht lautet immer "Der Parameter ist falsch".
Nur für den Fall, dass false
irgendwie keine 64-Bit-Version hat, habe ich versucht, alle 8-byte GetGUIThreadInfo
s in der IntPtr
-Deklaration zu 4-byte GuiThreadInfo
s zu ändern , aber ich habe immer noch den gleichen Fehler.
Hat jemand ein funktionierendes C # -Sample von int
auf Win64? Oder gibt es eine andere Möglichkeit zu finden, was der fokussierte Kind-Fenster-Griff in einer anderen App wäre, ohne diese App aktiv zu machen?
Ich habe es nicht zu genau betrachtet, aber eines springt heraus. In Ihrem GetGUIThreadInfo-Aufruf übergeben Sie die GUIThreadInfo-Struktur durch Ref, aber Sie haben es als eine Klasse definiert, so dass Sie eine Referenz von ref senden, mit anderen Worten einen Zeiger auf einen Zeiger. Ändern Sie entweder Ihre GUIThreadInfo in eine Struktur oder entfernen Sie die Referenz für den Parameter, und fügen Sie [In, Out] -Attribute hinzu.