钩子与快捷键

acdbxzyw 2011-02-06 06:58:02
用钩子实现快捷键,用来启动别的程序。无论是内部钩子还是全局钩子,一次按键都有可能启动多个程序实例。如一次可能打开三个或一个记事本。
请问是什么原因?会不会是电脑的问题,四年的笔记本了。。。
如何在一次按键时只启动一个实例?

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;
}
...全文
101 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
acdbxzyw 2011-02-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fishion 的回复:]

((lParam>>29) & 1))换成(lParam&0x20000000)&&(!(lParam&0x80000000))

return 0;换成return CallNextHookEx(glhHook,nCode,wParam,lParam);

没测试过。。不知道行不行
[/Quote]

行。
呵呵,看来是需要判断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
自己理解的不透彻,依葫芦画瓢写的钩子。。。
于是用定时器限定了间隔时间,“曲线救国”了一把。。。
zwfgdlc 2011-02-06
  • 打赏
  • 举报
回复

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;
}
fishion 2011-02-06
  • 打赏
  • 举报
回复
((lParam>>29) & 1))换成(lParam&0x20000000)&&(!(lParam&0x80000000))

return 0;换成return CallNextHookEx(glhHook,nCode,wParam,lParam);

没测试过。。不知道行不行

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧