您的位置:首页 > 编程语言 > C语言/C++

VC++热键注册

2010-05-21 23:44 232 查看



这两天编程进行热键注册时,遇到了一些问题,把它总结了一下,希望能为学习VC的人提供一点参考。
一、热键注册的步骤
1、热键消息处理函数的声明
在头文件中加入如下代码:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2、添加消息映射
BEGIN_MESSAGE_MAP(CWndSnapDlg, CDialog)
......
ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入
END_MESSAGE_MAP()
3、消息处理函数的实现
LRESULT CWndSnapDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
//wParam是注册热键的ID,lParam是关于按键的信息
if(wParam==1000)
{
.........
}
......
return 0;
}
4、在初始化时进行热键注册
注册热键的函数原型如下:

BOOL RegisterHotKey( HWND hWnd, // handle to window int id, // hot key identifier UINT fsModifiers, // key-modifier options UINT vk // virtual-key code );

例如要注册热键Ctrl+Shift+A,则注册代码如下:

RegisterHotKey(m_hWnd,1000,MOD_CONTROL | MOD_SHIFT,'A');

5、热键的注销

在程序退出之前要记着注销这些注册热键,注销热键的函数如下:

BOOL UnregisterHotKey( HWND hWnd, // handle to window int id // hot key identifier );

则注销上面注册的热键Ctrl+Shift+A的代码为:

UnregisterHotKey(m_hWnd,1000);
二、需要注意的问题

1、我一开始编这个程序的时候,每次按下Ctrl+Shift+A时,消息处理函数OnHotKey(WPARAM wParam,LPARAM lParam)确实被调用了,但是wParam和lParam两个参数传进来的值却总是不对,后来才发现,是我在声明消息处理函数时,在函数前面加上了CALLBACK这个调用约定。所以,一定要注意,千万不要加调用约定修饰。

2、我看很多资料都说如果注册热键Ctrl+Shift+A和Ctrl+Shift+a的话,只要在上面的基础上多加一个注册函数即可:

RegisterHotKey(m_hWnd,2000,MOD_CONTROL | MOD_SHIFT,'a');
但是我在调试的时候发现,不管按下的是Ctrl+Shift+A还是Ctrl+Shift+a,消息处理函数传入的wParam这个参数始终是1000,而且,当我把注册Ctrl+Shift+a的代码删掉时,现象和以前一样。经过不断的调试,我发现,只要注册了包含大写字母的热键后,在运行时按下小写字母的按钮时同样实现按下大写字母时的功能,而且,注册时必须注册大写字母,如果只注册包含小写字母的热键是没有用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: