<摘>C#,MFC,Win32——实现系统级热键
2010-01-14 16:33
344 查看
笔者首先接触的是C#语言,然后再学的Win32、MFC。
在转型的学习过程中,遇到了一些令人费解的问题。比如,一些系统级的功能,在C#中实现后,却花了好长一段时间才学会在Win32、MFC中实现。下面将整理一些常用功能在这三种环境下的实现方法
在这篇中先介绍如何设置系统级热键:
C#
第一步,先在类的级别中申明两个API函数,
///注册热键
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);
"user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
///卸载热键
[DllImport(
注意引入名字空间 System.Runtime.InteropServices;
上面两个函数参数的解释:
RegisterHotKey 函数中,
hWnd为本程序窗口的句柄,在C#的窗口中直接用Handle属性就可以引用窗口句柄
id为热键的标示符,是我们自己定义的,因为一个程序中可以定义多个热键,所以要用这个字段来区别,具体用法见下
fsModifiers为激活热键时,是否和系统键组合使用,none:0 Alt:1 Ctrl:2 Shift:4,并且还可以用或运算来组合使用
vk就是要定义的热键,C#中按键都被包含在Keys枚举中
UnregisterHotKey 函数中,
hWnd和RegisterHotKey 函数中是一样的,id为要卸载的热键标示
第二步,在窗口的初始化中注册热键,例如 RegisterHotKey(Handle, 100, 0, Keys.F9);
将些热键识别为100,0表示不使用系统键,Keys.F9表示此热键为F9,若要同时按Shift+Ctrl+F9,则第三个参数应该为 2|4 其实对二进制运算熟悉的朋友, 可以立刻算出 2|4=6
第三步,可以响应热键了:
重写窗体的WndProc函数,具体代码为
protected override void WndProc(ref Message m) {
//这个if的条件中固定的
if (m.Msg == 0x312) {
//这个if就在于判断是哪个热键,100对应上面RegisterHotKey函数中的第二个参数
if (m.WParam.ToInt32() == 100) {
//这里就是响应的函数
DoSomething();
}
}
base.WndProc(ref m);
}
WndProc()函数的功能就是处理Windows消息,在其它地方还将看到这个函数的妙用!
第四步,在程序结束的时候调用UnregisterHotKey(Handle,100)卸载此热键!
WIN32
第一步,在int WINAPI WinMain()函数中,
while(GetMessage(&msg,NULL,0,0)){……}
之前,注册热键
RegisterHotKey(hWnd,100,0,VK_F9)
VK_F9为WinUser.h中定义的宏,其他键也是用类似的形式进行定义,不过数字键和字母键,直接用'0','A'这样的形式
第二步,在while(GetMessage(&msg,NULL,0,0)) {……}
循环体内,添加代码
//这是响应热键条件,从WM_HOTKEY宏的定义中,可以看出来它代表的值为 0x312 ,和C#中的if条件是一致的
if(msg.message ==WM_HOTKEY)
{
//这里的条件用来判断热键的标示符
if(msg.wParam==100)
{
//这里调用想要执行的函数
DoSomething();
}
}
第三步,在while()循环结束后,调用 UnregisterHotKey(hWnd,100) 卸载热键。
MFC
MFC程序分对话框模式和文档模式:
对话框模式:
第一步,在MFC的窗体中添加其WM_HOTKEY消息的响应,
void C热键Dlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
//这里用来判断热键的标识符
if(nHotKeyId == 100)
{
//响应函数
DoSomething();
}
CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);
}
第二步,在MFC窗体的初始化地方,添加注册热键的代码:
RegisterHotKey(m_hWnd,100,0,VK_F9);
注意上面的字段m_hWnd,是CWnd类中字段,完成由MFC控制,我们只需要在适合地方引用就可以了。
第三步,在窗体销毁的地方调用 UnregisterHotKey(hWnd,100) 卸载热键就可以了。
文档模式:
文档模式中和对话框模式中的情况大体相同,不同的是在CView派生类中响应WM_OnHotKey消息,在CView派生类对象的WM_CREATE消息中添加注册热键的代码,注意不能放在此对象的构造函数中,因为此时m_hWnd字段还未正确初始化。
到这里,大家可以已经掌握了在三种环境中设置系统级热键的方法。笔者的体会是,在WIN32和C#中方法大概相同,笔者就是在C#的基础上,尝试着在WIN32中实现该功能,结果一次成功,但是在MFC中就走了一些弯路。
这里只是用一个简单的例子比较了下,在三种环境下代码的不同。以后还会写出其它的功能,敬请期待!
在转型的学习过程中,遇到了一些令人费解的问题。比如,一些系统级的功能,在C#中实现后,却花了好长一段时间才学会在Win32、MFC中实现。下面将整理一些常用功能在这三种环境下的实现方法
在这篇中先介绍如何设置系统级热键:
C#
第一步,先在类的级别中申明两个API函数,
///注册热键
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);
"user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
///卸载热键
[DllImport(
注意引入名字空间 System.Runtime.InteropServices;
上面两个函数参数的解释:
RegisterHotKey 函数中,
hWnd为本程序窗口的句柄,在C#的窗口中直接用Handle属性就可以引用窗口句柄
id为热键的标示符,是我们自己定义的,因为一个程序中可以定义多个热键,所以要用这个字段来区别,具体用法见下
fsModifiers为激活热键时,是否和系统键组合使用,none:0 Alt:1 Ctrl:2 Shift:4,并且还可以用或运算来组合使用
vk就是要定义的热键,C#中按键都被包含在Keys枚举中
UnregisterHotKey 函数中,
hWnd和RegisterHotKey 函数中是一样的,id为要卸载的热键标示
第二步,在窗口的初始化中注册热键,例如 RegisterHotKey(Handle, 100, 0, Keys.F9);
将些热键识别为100,0表示不使用系统键,Keys.F9表示此热键为F9,若要同时按Shift+Ctrl+F9,则第三个参数应该为 2|4 其实对二进制运算熟悉的朋友, 可以立刻算出 2|4=6
第三步,可以响应热键了:
重写窗体的WndProc函数,具体代码为
protected override void WndProc(ref Message m) {
//这个if的条件中固定的
if (m.Msg == 0x312) {
//这个if就在于判断是哪个热键,100对应上面RegisterHotKey函数中的第二个参数
if (m.WParam.ToInt32() == 100) {
//这里就是响应的函数
DoSomething();
}
}
base.WndProc(ref m);
}
WndProc()函数的功能就是处理Windows消息,在其它地方还将看到这个函数的妙用!
第四步,在程序结束的时候调用UnregisterHotKey(Handle,100)卸载此热键!
WIN32
第一步,在int WINAPI WinMain()函数中,
while(GetMessage(&msg,NULL,0,0)){……}
之前,注册热键
RegisterHotKey(hWnd,100,0,VK_F9)
VK_F9为WinUser.h中定义的宏,其他键也是用类似的形式进行定义,不过数字键和字母键,直接用'0','A'这样的形式
第二步,在while(GetMessage(&msg,NULL,0,0)) {……}
循环体内,添加代码
//这是响应热键条件,从WM_HOTKEY宏的定义中,可以看出来它代表的值为 0x312 ,和C#中的if条件是一致的
if(msg.message ==WM_HOTKEY)
{
//这里的条件用来判断热键的标示符
if(msg.wParam==100)
{
//这里调用想要执行的函数
DoSomething();
}
}
第三步,在while()循环结束后,调用 UnregisterHotKey(hWnd,100) 卸载热键。
MFC
MFC程序分对话框模式和文档模式:
对话框模式:
第一步,在MFC的窗体中添加其WM_HOTKEY消息的响应,
void C热键Dlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
//这里用来判断热键的标识符
if(nHotKeyId == 100)
{
//响应函数
DoSomething();
}
CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);
}
第二步,在MFC窗体的初始化地方,添加注册热键的代码:
RegisterHotKey(m_hWnd,100,0,VK_F9);
注意上面的字段m_hWnd,是CWnd类中字段,完成由MFC控制,我们只需要在适合地方引用就可以了。
第三步,在窗体销毁的地方调用 UnregisterHotKey(hWnd,100) 卸载热键就可以了。
文档模式:
文档模式中和对话框模式中的情况大体相同,不同的是在CView派生类中响应WM_OnHotKey消息,在CView派生类对象的WM_CREATE消息中添加注册热键的代码,注意不能放在此对象的构造函数中,因为此时m_hWnd字段还未正确初始化。
到这里,大家可以已经掌握了在三种环境中设置系统级热键的方法。笔者的体会是,在WIN32和C#中方法大概相同,笔者就是在C#的基础上,尝试着在WIN32中实现该功能,结果一次成功,但是在MFC中就走了一些弯路。
这里只是用一个简单的例子比较了下,在三种环境下代码的不同。以后还会写出其它的功能,敬请期待!
相关文章推荐
- C#,MFC,Win32——实现系统级热键
- <转>MFC注册系统/全局热键。
- <linux小脚本>case实现批量添加/删除用户
- <基础原理进阶>机器学习算法python实现【4】--文本分析之支持向量机SVM【上】
- <基础原理进阶>机器学习算法python实现【5】--文本分析之支持向量机SVM(下)
- 第9周任务1(Complex类中的<<和>>运算符重载实现时间的输入和输出)
- <C语言>在C语言程序中实现shell命令的效果
- 调用win32 API,实现全局系统热键小结
- <MFC笔记>位图格式及其存储和读取
- <练习>利用heartbeat实现双节点mysql高可用集群
- 点击li标记中的<a>标记改变li背景图片怎样实现
- <二叉树 前中后 层序 非递归遍历 c语言实现>
- <八>RecycleView+CardView实现瀑布流(2、加载网络图片)
- <MFC笔记>MFC消息映射机制
- <<Linux内核的设计与实现>>读书笔记(三)-Linux的进程
- JQury实现二级联动和<select>分类选择移动
- <HTTP>ASI实现的登陆方法
- <剑指offer 面试题7-1>构建二叉树以及实现遍历 Java
- <Win32_6>Win32的验证码程序
- <MFC笔记> VS2013动态库文件的创建及其使用详解