本文主要是介绍VC++热键注册(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、热键注册的步骤
1、热键消息处理函数的声明
在头文件中加入如下代码:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2、添加消息映射
BEGIN_MESSAGE_MAP(CWndSnapDlg, CDialog)
......
ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入
END_MESSAGE_MAP()
......
ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入
END_MESSAGE_MAP()
3、消息处理函数的实现
LRESULT CWndSnapDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
{
//wParam是注册热键的ID,lParam是关于按键的信息
if(wParam==1000)
{
.........
if(wParam==1000)
{
.........
}
......
return 0;
}
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的代码删掉时,现象和以前一样。经过不断的调试,我发现,只要注册了包含大写字母的热键后,在运行时按下
小写字母的按钮时同样实现按下大写字母时的功能,而且,注册时必须注册大写字母,如果只注册包含小写字母的热键是没有用的。
http://blog.sina.com.cn/s/blog_4960799601000b7i.html
这篇关于VC++热键注册(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!