2014-02-27 36 views
0

我寫了一個使用GetAsyncKeyState()的小程序,它自行工作正常。GetAsyncKeyState() - 外部程序干擾它

問題是,當我運行某個外部應用程序(不是我的)時,我的GetAsyncKeyState()完全停止接收輸入。我希望能夠運行這兩個應用程序。

我能做些什麼來強制我的程序再次接收鍵盤輸入嗎?什麼可能導致這個問題?

謝謝!

**更多詳情* *

我使用MFC和處理導致捕獲鍵盤輸入WM_TIMER消息。我所做的輸入配置,然後我打電話

if(GetAsyncKeyState(chVirtualKey) < 0) { //stuff happens } 

**更新* * 我又測試程序(非MFC)建立一個鉤與我對他們有限的知識:

SetWindowsHookEx(WH_KEYBOARD_LL, &LowLevelKeyboardProc, hInstance, NULL); 

然後對其進行處理:

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HC_ACTION) 
    { 
     KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam; 

     if (p->vkCode == VK_SPACE) // spacebar key 
     { 
      SetCursorPos(400, 400); //just to test 
     } 
    } 
    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

這個鉤子的作品,但只有當另一個應用程序沒有運行,所以我仍然卡...

+0

所以即使你的應用程序有焦點,你仍然失去鍵盤輸入? –

+1

你是什麼意思,它停止接收輸入? 'GetAsyncKeyState'本身不會「接收輸入」。你什麼時候打電話?你在投票嗎?呼籲迴應消息?顯示一些源代碼... –

+1

'Get(Async)KeyState()'依靠在調用線程中本地高速緩存的鍵盤數據。外部進程干擾的唯一方式是使用['BlockInput()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms646290.aspx),或者在使用鉤子到達線程的消息隊列之前攔截並丟棄/修改鍵盤消息。 –

回答

0

談到支持其他應用程序後,我的問題得到解決。 我所要做的只是讓我的應用以管理員模式運行。

感謝大家的幫忙!我確實學到了一些鉤子的新技巧。