2009-08-03 10 views
18

      Zrobiłem już aplikację, która wysyła polecenia do aktywowanego okna. Chcę móc korzystać z komputera podczas mojego procesu, ponieważ gdy tylko przełączę fokus na inne okno, naciśnięcia klawiszy wysyłane za pomocą klawiszy wysyłania zostaną przeniesione do okna, które właśnie przełączyłem.Jak wysłać naciśnięcia klawiszy do okna bez konieczności aktywowania go za pomocą interfejsu API systemu Windows?

        Obecnie używam FindWindow, IsIconic i ShowWindow z Windows API. Muszę sprawdzić, czy okno jest tam z FindWindow i ustawić mój obiekt na konkretne okno, które jest zwracane z tym wywołaniem, wtedy sprawdzam, czy jest on zminimalizowany z IsIconic i wywołuje ShowWindow, jeśli tak jest, i wreszcie muszę zadzwonić Interakcja.AppAktywuj, aby ustawić ostrość na to okno. Wszystko to odbywa się, zanim jeszcze wyślę kluczowe pociągnięcia. Wygląda na to, że powinien istnieć sposób wysyłania naciśnięć klawiszy bez konieczności wyświetlania okna i aktywowania go. Najważniejsze, że podczas gdy moja aplikacja uruchamia naciśnięcia klawiszy, nic nie mogę zrobić na moim komputerze.

+0

Z jakiego systemu operacyjnego korzystasz? –

+0

Używam systemu Windows Vista. Korzystam również ze środowiska .NET 3.5 SP1 z Visual Studio 2008 w języku C#. – SlipToFall

+0

Istnieją powody, dla których nie można skierować klawiatury na nic poza aktywnym oknem. Są trochę subtelne, ale są tam. –

Odpowiedz

24

W porządku, to jest trochę rozczarowujące, jestem pewien, ale zasadniczo nie może tego zrobić ze 100% niezawodnością.

System Windows zakłada, że ​​aktywne okno uzyskuje wejście klawiatury. Właściwym sposobem na wprowadzenie fałszywej klawiatury jest SendInput, a zauważysz, że wysyła wiadomości tylko do aktywnego okna.

Mając na uwadze powyższe, można SendMessageWM_KEYUP, WM_CHAR i WM_KEYDOWN wiadomości oraz (w zależności od WndProc je otrzymuje) może uciec z nim. Ale pamiętajcie, że w pewnych okolicznościach okres.

6

Wygląda na to, że używasz keybd_event() lub SendInput(), które wysyłają naciśnięcia klawiszy do aktualnie aktywnego okna. Aby skierować naciśnięcia klawiszy do określonego okna, niezależnie od tego, czy widnow jest skupiony, czy nie, najpierw musisz znaleźć jego uchwyt HWND, a następnie wysłać bezpośrednio do niego odpowiednio sformatowane wiadomości WM_KEYUP/DOWN i WM_CHAR.

0

Po uzyskaniu okna HWND można bezpośrednio Wysłać SendMessage() wiadomości WM_KEYDOWN i WM_KEYUP do kolejki komunikatów. Okno nie musi być aktywne.

Należy jednak pamiętać, że zależy to od tego, w jaki sposób aplikacja docelowa przetwarza dane z klawiatury. Istnieje kilka różnych sposobów radzenia sobie z tym.

WM_KEYUP/WM_KEYDOWN jest najczęstszym i niektóre aplikacje przetwarzają tylko jeden lub drugi (zwykle WM_KEYDOWN).

WM_CHAR jest również dość powszechne

Niektóre programy używają GetAsyncKeyState, GetKeyState lub GetKeyboardState. Jest to niezwykle nietypowe, ale skutecznie zapobiega iniekcji naciśnięcia przy pomocy SendMessage(). W takim przypadku należy powrócić do keybd_event(), który jest obsługiwany bezpośrednio przez sterownik klawiatury. Oczywiście okno będzie musiało być aktywne

Powiązane problemy