C#,MFC,Win32——实现系统级热键

作者: admin 分类: win32 发布时间: 2014-11-20 18:07 ė2,159 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

在这篇中先介绍如何设置系统级热键:

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 == 0×312) {
          //这个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宏的定义中,可以看出来它代表的值为 0×312 ,和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中就走了一些弯路。

 



只回答业务咨询点击这里给我发消息 点击这里给我发消息

学习日记,兼职软件设计,软件修改,毕业设计。

本文出自 学习日记,转载时请注明出处及相应链接。

本文永久链接: https://www.softwareace.cn/?p=1038

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量