C# 全局键盘钩子发射两次

C# 全局键盘钩子发射两次,c#,windows,hook,C#,Windows,Hook,我有以下方法,试图截获全局按下ALT+Z键: private int KbHookProc(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { var hookStruct = (KbLLHookStruct)Marshal.PtrToStructure(lParam, typeof(KbLLHookStruct)); bool altDown = GetKeyState

我有以下方法,试图截获全局按下ALT+Z键:

private int KbHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0)
    {
        var hookStruct = (KbLLHookStruct)Marshal.PtrToStructure(lParam, typeof(KbLLHookStruct));

        bool altDown = GetKeyState(VK_ALT) != 0;

        if (altDown) 
        {
            if(hookStruct.vkCode == 0x5A) //alt + z
            {
                MessageBox.Show("ALT + Z"); 
            }
        }
    }

    return CallNextHookEx(_hookHandle, nCode, wParam, lParam);
}
这种方法几乎可以工作,但是每次输入key命令时,都会显示两次消息“ALT+Z”

起初,我认为我捕获了两次事件,一次是在按下
Z
时,一次是在释放
Z
时。我试图修改代码来检查
wParam
变量,以查看事件是键向上还是键向下事件

public const int WM_KEYDOWN = 0x0100;

...

if(hookStruct.vkCode == 0x5A && wParam == (IntPtr)WM_KEYDOWN) //alt + z
{
    MessageBox.Show("ALT + Z"); 
}
但是,在这种情况下,当我输入key命令时,不会显示任何消息


我错过了什么

为什么要在有API调用时使用钩子呢?这确实让事情变得简单多了!:)谢谢