用钩子实现快捷键,用来启动别的程序。无论是内部钩子还是全局钩子,一次按键都有可能启动多个程序实例。如一次可能打开三个或一个记事本。
请问是什么原因?会不会是电脑的问题,四年的笔记本了
如何在一次按键时只启动一个实例?LRESULT CALLBACK KeyboardProc(          int code,
    WPARAM wParam,
    LPARAM lParam
)
{
        //ALT + 1
if((0x31 == wParam) && ((lParam>>29) & 1))
{
//MessageBox(NULL,L"Hello",L"he",MB_OK);
                WinExec("Notepad.exe", SW_SHOW);
}
return 0;
}

解决方案 »

  1.   

    ((lParam>>29) & 1))换成(lParam&0x20000000)&&(!(lParam&0x80000000))return 0;换成return CallNextHookEx(glhHook,nCode,wParam,lParam);没测试过。。不知道行不行
      

  2.   


    HHOOK  hHook = NULL;
    KBDLLHOOKSTRUCT* kb;LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if (nCode == HC_ACTION && wParam == WM_KEYDOWN)
    {
    kb = (KBDLLHOOKSTRUCT*)lParam; if (GetAsyncKeyState(VK_CONTROL)&0x8000 && GetAsyncKeyState(VK_MENU))
    {
    if (kb->vkCode=='X')
    {
    //按下Ctrl+ALT+X键
    }

    if (kb->vkCode == 'Z')
    {
    //按下Ctrl+ALT+Z键
    }
    }
    } return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    BOOL CyhwbDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标

    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, theApp.m_hInstance, NULL); if (!hHook)
    {
    MessageBox(TEXT("HOOK 失败!"));
    return FALSE;
    }
      

  3.   


    行。
    呵呵,看来是需要判断lParam结构中的第31位,否则会有按下弹起等多个按键消息,因而触发了多次。
    查了下MSDN:31 Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released
    自己理解的不透彻,依葫芦画瓢写的钩子
    于是用定时器限定了间隔时间,“曲线救国”了一把