2014-01-25 84 views
0

我想知道從效率(CPU /內存使用情況)角度來說,暫時掛起/繞過低級別鼠標/鍵盤掛鉤的最佳方法是什麼。暫停低級別掛鉤的最佳方法(winapi)

目前的解決方案,我發現是在爲例來設置一個全局變量,「doHook」,在鉤PROC測試,如果沒有設置讓它與CallNextHookEx方法傳遞這樣的:

if ((nCode < 0) || (!doHook)) 
    { 
     return CallNextHookEx(NULL, nCode, wParam, lParam); 
    } 

是這是一個好的解決方案更好的方法?

感謝

回答

2

你有2種選擇:

  • 完全通過調用UnhookWindowsHookEx的勾去掉。
  • 將掛鉤留在原位並跳過正常操作。

低電平keyboardmouse鉤有些昂貴,因爲它們引入用於處理輸入事件的附加的上下文切換:

的[...]鉤沒有注入到另一種方法。相反,上下文切換回安裝鉤子的進程,並在其原始上下文中調用它。然後上下文切換回生成事件的應用程序。

實質上,對於所有輸入事件,您的執行無關鉤仍會耗用數千個時鐘週期來進行上下文切換。爲了最大限度地減少整體影響,您應該考慮徹底卸載掛鉤並在必要時重新安裝。

+0

感謝您的信息。 –

+0

對於我目前正在執行的程序,我需要以光速啓用鉤子,所以我認爲完全卸載並重新安裝鉤子不是一種選擇,因爲我認爲重啓要比我的解決方案慢得多(或者它可能不如我想象的那麼慢?)。我想到了另一種解決方案:是不是可以創建一個專用於鉤子的線程並暫停/暫停它然後恢復它? (我對線程還是比較新的)不應該有可能嗎? –

+0

暫停的線程就是這樣:一個不會被安排執行的線程。當執行一個鉤子鏈時,沒有設施會跳過這個特定的線程。由於您關心的是性能,您應該使用分析器來衡量當前的性能,比較不同的實現,並做出明智的決定。 – IInspectable