3

低レベルのキーボードフックを使用して、キーボードの文字「a」を完全に無効にしようとしています。問題は、keyboardproc から 0 を返すとキーが無効にならず、1 を返すと無効になることです。CallNextHookEx を呼び出さずに keyboardproc から戻ると、メッセージがブロックされると思いました。0 を返すことと 1 を返すことに違いはありますか。

LRESULT CALLBACK LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT* details = (KBDLLHOOKSTRUCT*) lParam;

    if(code == HC_ACTION && wParam == WM_KEYDOWN)
    {
        if(details->vkCode == 0x41)
        {
            return 1;
        }
    }

    return CallNextHookEx(g_hhkKeyboard, code, wParam, lParam);     
}
4

2 に答える 2

8

LowLevelKeyboardProcMSDN ドキュメントから:

フック プロシージャがメッセージを処理した場合、システムがフック チェーンの残りまたはターゲット ウィンドウ プロシージャにメッセージを渡さないようにするために、 0 以外の値が返される場合があります。

[鉱山を強調]

したがって、完全に文書化されているわけではありません。実際にreturn 0. とにかく、この値により、システムはチェーン内の次のフック プロシージャを呼び出し、最終的には既定のウィンドウ プロシージャによって処理されると思います。

LowLevelKeyboardProc私は最近、Caps Lock を切り替えるために Caps Lock を一定時間押し続ける必要がある単純なアプリを作成しました。

CallNextHookEx( NULL, nCode, wParam, lParam );

追加メモ: NT/XP/2003 以降のシステムをターゲットにしている場合はNULL、最初のCallNextHookExパラメーターを渡すことができます。これは無視されるためです。

于 2009-05-07T08:51:21.033 に答える
1

CallNextHook() を実行すると、チェーン内の次のフックが呼び出されます。0 以外を返すと、ターゲット ウィンドウはメッセージを受信しません (したがって、ウィンドウはキーボード メッセージを受信できません)。ゼロを返すと、メッセージはターゲット ウィンドウによって受信されます。

望ましい動作は、押されたキーが「a」の場合はゼロ以外を返し、それ以外の場合はゼロを返すことです。

于 2009-06-07T19:51:35.920 に答える