2017-10-19 16 views
-3

私はGoogleとMicrosoftのフックのドキュメントを検索していますが、フックを作る方法はたくさんありますが、私はすでにその方法を知っています。メッセージを受信するために、フック(この場合はキーボードフック)をキューに入れるにはどうすればよいですか?他のキーフックが入力を変更するのを防ぐために、可能な限りハードウェア入力に近づけるようにしています。 I.E:App1は、KBDLLHOOKのフラグをスプーフィングして注入しないようにするためのキーフックを実行します。 LLKHF_INJECTEDからフラグを変更する前に、そのメッセージにどうやって行くのですか?私のWindowsHookを他の人の手前で処理する

TL; DRキーインジェクションを防ぐために私のフックが別のメッセージの前にどのようにメッセージを受け取るのですか?私は、メッセージキューは、最後に一次に行く承知していますが、どういうわけか、私は前に私のプログラムを関係なく起動した場合やApp1の後に、それはまだ取得します。私は

LRESULT CALLBACK keybdProc(int n, WPARAM w, LPARAM l) 
{ 
    KBDLLHOOKSTRUCT *kbdll = (KBDLLHOOKSTRUCT*)l; 
    if (w == WM_KEYDOWN) 
    { 
     switch (kbdll->flags) 
     { 
     case LLKHF_INJECTED: 
      printf("%d/%c is an Injected Key Press (Reject)\n", kbdll->vkCode, char(kbdll->vkCode)); 
      break; 
     default: 
      printf("%d/%c Not injected (Continue)\n", kbdll->vkCode, char(kbdll->vkCode)); 
      break; 
     } 
    } 
    return 0; //CallNextHookEx(NULL, n, w, l); 
} 

int main() 
{ 
    HHOOK keybdHk = SetWindowsHookEx(WH_KEYBOARD_LL, keybdProc, GetModuleHandle(NULL), 0); 
    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)>0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    UnhookWindowsHookEx(keybdHk); 
    return 0; 
} 

編集をテストするために使用しています

簡単なコード私のKeyhookの前に入力し、NextHookを呼び出さない(私のフックは決してそれを取得しない)か、それを偽装する。

+6

思考実験:まず自分自身を置く方法があるとします。他のフックプログラム*もそうしないでしょうか? – Blorgbeard

+0

はい、私の計画はそれ自体が最初に置かれた後です。それがx分ごとにリフレッシュされたら、x-1分前にリフレッシュします。何らかの「武器競争」状況を作り出す。 @Blorgbeard – Exsanity

+1

ドキュメントでは、 'WH_KEYBOARD'フックは' WH_KEYBOARD_LL'の前に実行されることに言及しています。あなたが本当に最初になりたいなら、何もドライバーを打ち負かすことはありませんが、それはおそらくトップにあるでしょう。文書化されていない土地に入ると、メモリが使えば、後に登録された(低レベルの)キーボードフックが後に実行されるのを見たことがあります。 – chris

答えて

1

フックは、フックプロシージャが先頭から順番に実行されるhook chainsで管理されます。 documented通り:

SetWindowsHookEx関数は常にフックチェーンの先頭にフックプロシージャをインストールします。特定の種類のフックによって監視されるイベントが発生すると、システムはフックに関連付けられたフックチェーンの先頭でプロシージャを呼び出します。チェーンの各フックプロシージャは、イベントを次のプロシージャに渡すかどうかを決定します。

フックを最初に呼び出すには、最後にインストールする必要があります。これは容易に確立できますが、フックチェーン内のその位置を維持することは不可能です。

関連する問題