2012-08-17 105 views
3

我寫了一個c#應用程序,其中包含一個WinAPI低級別鍵盤鉤子,用於防止除字母數字鍵以外的所有其他鍵。全局低級別鍵盤鉤子 - 競爭條件

問題是 - 其他程序(那些以登錄開始的程序)也有鍵盤掛鉤(用於啓動計算器,瀏覽器等應用程序)。這些程序已經在我的鉤子回調已經達到之前打開了這些應用程序,因此,我無法停止該操作。

有什麼辦法可以確保我的鉤子在任何其他之前被調用?


編輯

要清理混亂 - 我的應用程序是沒有安裝的可執行文件。它按需運行。

我需要能夠接管其他鉤子 - 或者只是強制我的鉤子回調被首先調用 - 即使其他人已經調用了SetWindowsHookEx方法。

+2

只是好奇心,你爲什麼需要這個? – 2012-08-17 18:56:23

+0

@HassanBoutougha:你爲什麼說間諜?我的帖子明確指出我正在阻止擊鍵。 – 2012-08-17 19:32:13

+1

@ L.B:我寫了一個應用程序,允許我的寶貝兒子在鍵盤上輸入而不會造成任何問題。除了他不斷打開我的瀏覽器和計算器。 – 2012-08-17 19:33:13

回答

0

無法您使用的安裝程序來編輯

[HKEY_CURRENT_USER \軟件\微軟\的Windows \ CurrentVersion \ Run中]

註冊表值?我從來沒有明確地試圖做到你正在做的事情......我不確定你是否可以從安裝程序重新排序這些關鍵值,但是這應該足夠早地捕捉它...

或者其中一種: [HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \ Run中] [HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \的RunOnce] [HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \ RunServices] [HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ RunServicesOnce] [HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ Userinit]

+0

這不會工作。我的應用程序未安裝。它是按需運行的單個可執行文件。我需要一些強制我的應用程序在其運行時僅在鉤子回調中處於第一位的東西。 – 2012-08-17 19:37:19

1

儘管它沒有回答如何如果我們從另一個角度來看,可能會有一個可接受的解決方案來解決您的具體問題...

如何去二手商店,購買便宜的USB鍵盤,以及然後剪下你不想讓兒子使用的鑰匙的連接?然後,您可以將USB連接到現有鍵盤的USB端口,並在您的兒子玩遊戲時將鍵盤推開。

完成後,斷開兒子的鍵盤並將其移回原位。

否則,我認爲你可能需要安裝WH_DEBUG鉤子來獲取鍵盤消息,然後它傳遞給任何其他鉤子。

DebugProc功能

系統調用與任何類型的鉤子相關聯的鉤子程序 之前調用此函數。系統將要調用的鉤子的信息傳遞給DebugProc鉤子程序,該鉤子程序檢查信息並確定是否允許鉤子被調用。

的DebugProc將獲得通過鉤子被稱爲wParam中(你的情況WH_KEYBOARD_LL)的類型,以及DEBUGHOOKINFO結構,lParam中包含將被傳遞給鉤子鏈中的實際WH_KEYBOARD_LL鉤信息。

+0

謝謝。目標是拉起一個快速的應用程序,讓他鍵入,保存文本(或發送電子郵件),並關閉它 - 然後恢復正常。你的建議需要很長時間,我永遠不會這樣做。 – 2012-08-17 22:22:43

+0

至於WH_DEBUG掛鉤 - 有一件事我不清楚。 「爲了防止系統調用鉤子......」是什麼意思?它是否跳過所有鉤子(並允許按下該鍵)?還是取消了按鍵,就像在WH_KEYBOARD_LL鉤子中一樣? – 2012-08-17 22:24:05

+0

實際上,您是調試器。如果您允許,您將在掛鉤之前收到通知,並可以訪問將傳遞給掛鉤的數據。 – GalacticJello 2012-08-21 12:50:00