2009-08-03 14 views
18

        Ich habe bereits eine Anwendung erstellt, die Befehle an ein aktiviertes Fenster sendet. Ich möchte in der Lage sein, den Computer zu benutzen, während mein Prozess läuft, denn sobald ich den Fokus auf ein anderes Fenster umschalte, werden die Tasten, die über die Send-Tasten gesendet werden, in das Fenster gehen, in das ich gerade gewechselt habe.Wie sende ich Keystrokes an ein Fenster, ohne es über die Windows API zu aktivieren?

        Derzeit verwende ich Findwindow, IsIconic und Showwindow aus dem Windows-API. Ich muss überprüfen, ob das Fenster mit FindWindow da ist und mein Objekt auf das bestimmte Fenster setzen, das mit diesem Aufruf zurückgegeben wird, dann überprüfe ich, ob es mit IsIconic minimiert ist und rufe ShowWindow auf, wenn es ist, und dann muss ich endlich anrufen Interaction.AppActivate, um den Fokus auf dieses Fenster zu setzen. All dies geschieht, bevor ich überhaupt Tastenanschläge sende. Scheint so, als ob es eine Möglichkeit geben sollte, nur Schlüsselstriche zu senden, ohne das Fenster anzeigen zu müssen und es zu aktivieren. Das große Ding ist, während meine Anwendung die Schlüsselanschläge ausführt, kann ich nichts auf meinem Computer tun.

+0

Welches Betriebssystem benutzen Sie? –

+0

Ich benutze Windows Vista. Ich verwende auch .NET 3.5 SP1 Framework mit Visual Studio 2008 in C#. – SlipToFall

+0

Es gibt gute Gründe dafür, dass Sie die Tastatureingabe nur auf das aktive Fenster beschränken können. Sie sind irgendwie subtil, aber sie sind da. –

Antwort

24

In Ordnung, das ist irgendwie enttäuschend, ich bin sicher, aber Sie grundsätzlich können dies mit 100% Zuverlässigkeit nicht tun.

Windows geht davon aus, dass das aktive Fenster derjenige ist, der die Tastatureingabe erhält. Der richtige Weg, um die Tastatureingabe zu fälschen, ist SendInput, und Sie werden feststellen, dass Nachrichten nur an das aktive Fenster gesendet werden.

Dass gesagt wird, können Sie SendMessageWM_KEYUP, WM_CHAR und WM_KEYDOWN Meldungen und (je nach WndProc sie zu empfangen) mit ihm vielleicht weg. Aber denken Sie daran, seine going to break unter bestimmten Umständen, Zeitraum.

6

Klingt, als ob Sie keybd_event() oder SendInput() verwenden, die beide Tastenanschläge an das gerade aktive Fenster senden. Um Tastenanschläge auf ein bestimmtes Fenster zu richten, unabhängig davon, ob diese Widnow fokussiert ist oder nicht, müssen Sie zuerst das HWND-Handle finden und dann entsprechend formatierte WM_KEYUP/DOWN- und WM_CHAR-Nachrichten direkt an sie senden.

0

Sobald Sie die Windows-HWND haben, können Sie die Nachrichten WM_KEYDOWN und WM_KEYUP direkt an SendMessage() senden. Das Fenster muss nicht aktiv sein.

Allerdings verstehen, dass dies davon abhängt, wie die Zielanwendung Tastatureingabe verarbeitet. Es gibt verschiedene Möglichkeiten, damit umzugehen.

WM_KEYUP/WM_KEYDOWN ist am üblichsten und einige Anwendungen verarbeiten nur das eine oder das andere (normalerweise WM_KEYDOWN).

WM_CHAR ist auch

Einige Programme verwenden GetAsyncKeyState, GetKeyState oder GetKeyboardState ziemlich verbreitet. Dies ist äußerst ungewöhnlich, verhindert jedoch effektiv die Injektion von Tastendruck mit SendMessage(). Wenn dies der Fall ist, greifen Sie zurück auf keybd_event(), was direkt vom Tastaturtreiber gehandhabt wird. Natürlich muss das Fenster aktiv sein.