我写了一个程序,
用RegisterHotKey(this->m_hWnd,ID_SubMoveDown,NULL,VK_DOWN); 注册热键.
结束的时候UnregisterHotKey(this->m_hWnd,ID_SubMoveDown);
这样,我的程序用起来是正常的,但是只要我的程序在运行,向下键VK_DOWN在其他程序里就不起作用了. 有没有办法让我的快捷键只在我的程序里起作用?不影响其他程序的快捷键?
请高手帮助!
用RegisterHotKey(this->m_hWnd,ID_SubMoveDown,NULL,VK_DOWN); 注册热键.
结束的时候UnregisterHotKey(this->m_hWnd,ID_SubMoveDown);
这样,我的程序用起来是正常的,但是只要我的程序在运行,向下键VK_DOWN在其他程序里就不起作用了. 有没有办法让我的快捷键只在我的程序里起作用?不影响其他程序的快捷键?
请高手帮助!
如果使用hook 拦截键盘消息. 我怎么判断这个消息是哪个按键发出的?组合键又怎么判断?另外,我的程序是用单文档转为ActiveX控件的,它没有消息泵.所以不能直接响应WM_KEYDOWN消息.
现在的问题是:怎么在void CCoreSymbolView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)中判断组合键?
那么先判断nChar是不是'C',这里nChar是虚拟键码,对于数字和大写字母的键就是对应的字符ascii码
如果是,则使用GetAsynKeyState判断ctrl有没有被按下
{
case 'c':
{
if(GetAsyncKeyState(VK_LCONTROL))
{
MessageBox("sd");
}
break;
}
case 'C':
{
if(GetAsyncKeyState(VK_LCONTROL))
{
MessageBox("sd");
}
break;
}
问题依然存在! 这样的话,我按Ctrl+C 起效果,按Ctrl+SHIFT+C 才会有效果!
而且,如果我写成下面的代码:
switch (nChar)
{
case 'c':
{
if(GetAsyncKeyState(VK_LSHIFT))
{
MessageBox("sd");
}
break;
}
case 'C':
{
if(GetAsyncKeyState(VK_LSHIFT))
{
MessageBox("sd");
}
break;
}然后,问题更奇怪了.我使用的是搜狗拼音输入法,shift键是切换中英文的.如果当前输入法是英文状态,按SHIFT+C 没效果,如果是中文,直接按C,就会弹出messagebox.
天哪!到底是怎么回事? 大侠帮我分析分析吧!
是不是因为我用的是ActiveX控件,所以对消息的解析是不标准的?
是不是需要自己解析一下消息什么的?
要if(GetAsyncKeyState(VK_CONTROL)&32768)
{if(GetAsyncKeyState(VK_LSHIFT))
{
MessageBox("sd");
}
break;
}
里设了一个断点,如果我单按c,他会进断点.如果同时按CTRL+C ,就进不去断点了!
也就是说这个时候的nchar已经不是'C'了.还请大虾指点迷津!
if((GetAsyncKeyState(VK_CONTROL)&32768)&&(GetAsyncKeyState(0x43)&32768))
这是判断ctrl+c的
我最终知道问题何在了,因为我用的是ActiveX控件,调试时使用的是控件调试器.
Ctrl+C 被控件调试器捕获了,所以进不去断点.按照你的方法,捕获其他的快捷键就是可以的.
谢谢你!