2009-08-03 54 views
18
 

     我已經提出的申請已經將命令發送到激活的窗口。我希望能夠在我的進程正在運行時使用計算機,因爲只要我將焦點切換到另一個窗口,通過發送鍵發送的擊鍵就會轉到我剛切換到的窗口。如何將按鍵發送到窗口而無需使用Windows API激活它?

       目前我使用FindWindow函數,IsIconic和的ShowWindow從Windows API。我必須檢查窗口是否在FindWindow中,並將對象設置爲與該調用一起返回的特定窗口,然後檢查是否使用IsIconic最小化,如果是,則調用ShowWindow,最後我必須調用Interaction.AppActivate將焦點設置到該窗口。所有這些都是在我發送擊鍵之前完成的。似乎應該有一種方法來發送按鍵而不必顯示窗口並將其激活。最重要的是,當我的應用程序運行關鍵筆畫時,我無法在計算機上執行任何操作。

+0

你在使用什麼操作系統? – 2009-08-03 11:38:24

回答

24

好吧,這是一種令人失望的我敢肯定,但你根本無法做到這一點 100%可靠。

Windows假定活動窗口是一個獲取鍵盤輸入。假鍵盤輸入的正確方法是使用SendInput,您會注意到它僅將消息發送到活動窗口。

話雖這麼說,你可以SendMessageWM_KEYUPWM_CHARWM_KEYDOWN消息和(取決於接收的WndProc他們)可能逃脫它。但請記住,在某些情況下,它的going to break期間。

6

聽起來你正在使用keybd_event()或SendInput(),這兩者發送鍵擊當前活動窗口。要將鍵擊指向特定的窗口,無論該窗口是否爲焦點,您需要先找到它的HWND句柄,然後將適當格式化的WM_KEYUP/DOWN和WM_CHAR消息直接發送給它。

0

一旦你的窗口HWND,你可以直接SendMessage函數()的WM_KEYDOWN和WM_KEYUP消息發送到其消息隊列。該窗口不必是活動的。

但是,明白這取決於目標應用程序如何處理鍵盤輸入。有幾種不同的方式來處理它。

WM_KEYUP/WM_KEYDOWN是最常見的和一些應用程序僅處理一個或另一個(通常是WM_KEYDOWN)。

WM_CHAR也相當普遍

某些程序使用GetAsyncKeyState,函數GetKeyState,或GetKeyboardState。這是非常不尋常的,但有效地防止使用SendMessage()進行按鍵注入。如果這種情況回退到由鍵盤驅動程序直接處理的keybd_event()。當然窗口必須是活動的

相關問題