2014-10-08 78 views
1

我正在編寫一個跨平臺的應用程序,它在某些情況下在一段時間內控制所有用戶輸入。如何在Windows上抓取鼠標

在GNU/Linux上,我使用了gtk +,它允許我檢索鼠標和鍵盤事件,如移動或按下。這是我的應用程序響應它們時需要的。它還有一個用gtk +創建的小圖形界面。

我一直在試圖搶在Windows上的鼠標輸入沒有成功,因爲gtk確實很好地圖形工作,但不搶用戶輸入。我已經使用BlockIntput()嘗試,但它並沒有按預期工作,因爲:

  1. 我需要管理員權限的運行該應用程序
  2. 我看不懂鼠標也沒有鍵盤輸入

是有沒有辦法在Windows上抓住鼠標和鍵盤輸入,並仍然能夠讀取他們的輸入沒有管理權限?

+1

這是你在找什麼? http://stackoverflow.com/questions/1789883/grab-exclusively-release-mouse-in-application-windows-c甚至這個:http://msdn.microsoft.com/en-us/library/windows/desktop /ms645533(v=vs.85).aspx – marc 2014-10-08 12:09:53

回答

1

我終於找到了符合我要求的解決方案。 Marc的一個鏈接指導我使用Windows上的鉤子,但是我已經嘗試過沒有成功,但是我最終實現了它們的鍵盤和鼠標抓取。

我的Windows代碼使用Windows庫,當我需要阻止輸入創建該調用一個函數線程:

DWORD dwThread; 
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MouseHooker, NULL, 0, &dwThread); 

然後我安裝鉤子:

DWORD WINAPI MouseHooker(LPVOID lpParameter) { 
HINSTANCE hExe = GetModuleHandle(NULL); 

//The thread's parameter is the first command line argument which is the path to our executable. 
if (!hExe) //If it fails we will try to actually load ourselves as a library. 
    hExe = LoadLibrary((LPCSTR) lpParameter); 
if (!hExe) 
    return 1; 
//Install the hook as a low level mouse hook thats calls mouseEvent 
hMouseHook = SetWindowsHookEx (WH_MOUSE_LL, (HOOKPROC)MouseEvent, hExe, 0); 
... 
UnhookWindowsHookEx(hMouseHook); 
return 0; 

}

並在每個鼠標事件代碼被調用:

if (nCode == HC_ACTION && ...) { //HC_ACTION means we may process this event, we may add specific mouse events 
    //We block mouse input here and do our thing 
} 
//return CallNextHookEx(hKeyHook, nCode, wParam, lParam); 
return 1; 

因此,我們不會繼續鉤鏈輸入永遠不會得到處理,工作站被阻止。

代碼按預期在Windows 7上運行。我一直在Windows上使用gtk +,因爲我仍然可以生成我的GUI並使用gdk檢索鼠標輸入。 在GNU/Linux代碼上只能使用GTK +庫,因爲我在抓取輸入時沒有問題。

相關問題