`

如何在VC6中定义热键消息

阅读更多

消息是windows操作系统和应用程序之间进行通信的载体,操作系统将包括用
户在内的各种事件以消息的形式发送至目标,目标系统再根据消息具体的内容进
行相应的处理。
在VC++6.0中,大多数的窗口消息可以从ClassWizard中找到,但是一些不
常用的消息在ClassWizard中并没有封装,比如热键处理消息(WM_HOTKEY),用
户必须事先定义热键,然后不论该程序在前台或后台运行,只要用户按下了这个
热键,该程序就会立即在前台运行,并收到热键消息,消息处理函数执行热键中
定义的操作。要实现这些功能,用户必须在代码级进行工作,也就是说要手工编
写代码。具体步骤如下:
假设用户已经用AppWizard生成了一个单文档界面框架,在工程中主要有下列
几个文件,向导为应用程序创建了如下类:
  CtestView CtestDoc CtestApp CmainFrame CAboutDlg
  请按下列步骤进行:
  1、在视图类的声明文件中,即testview.h文件中,找到消息映射的声名处,
在下列语句处加入热键处理函数声明:

   //{{AFX_MSG(CTestView)
   afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
   //}}AFX_MSG
  LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
   DECLARE_MESSAGE_MAP()


  2、在视图类的实现文件,即TestView.cpp文件中,找到消息映射的定义处,
这里是使函数和消息发生关联的地方,当发生某消息时,会调用这里定义的相应
消息处理函数,也就是说用消息映射宏使消息与相应的处理函数发生关系。

  下面的语句说明WM_HOTKEY消息和OnHotkey函数发生关联。

  BEGIN_MESSAGE_MAP(CTestView, CView)
   //{{AFX_MSG_MAP(CTestView)
   ON_WM_CREATE()
   //}}AFX_MSG_MAP
   // Standard printing commands
   ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
   ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
   ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
   ON_MESSAGE(WM_HOTKEY,OnHotkey) //消息和函数发生关联
  END_MESSAGE_MAP()


  3、在OnCreate函数中加入初始化代码,向系统登记热键。

   RegisterHotKey(hWnd,1001,MOD_CONTROL|MOD_ALT,'z');
   RegisterHotKey(hWnd,1002,MOD_CONTROL|MOD_ALT,'Z');
  

本例中定义的热键为Ctrl+Alt+z。


  4、在OnHotkey()处理函数中处理热键,即检查是否是所期望的热键,如果是
,这里为了简单,弹出一个对话框,显示"You Press Ctrl+Alt+z(Z)";。

LRESULT CTestView::OnHotkey(WPARAM wParam,LPARAM lParam)
  {
   if(wParam==1001||wParam==1002)
   MessageBox("You Press Ctrl+Alt+z(Z)");
  return 0;
  }


  注意:OnHotkey()函数必须有返回值。


  5、最后,不要忘了在OnDestroy()函数中解除函数登记,释放系统资源。

  UnregisterHotKey(m_hWnd,1001);
  UnregisterHotKey(m_hWnd,1002);
 

 这样程序运行后,无论程序在前台或后台运行,只要你按下Ctrl+Alt+z,就
会执行热键处理函数中的代码,这里弹出对话框。读者可以自行在自己的热键处
理函数中加入需要的代码来完成特定的功能。该程序在Pwin98平台上,在Visual
C++6.0中调试通过。
  (沈阳 金波)

函数功能:该函数定义一个系统范围的热键。


函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);


参数:

hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。

id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。

fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:

MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。

MOD_SHIFT:按下的可以是任一Shift键。

MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。

vk:定义热键的虚拟键码。

返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。

备注:当某键被接下时,系统在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。该消息被传送到队列头部,因此它将在下一轮消息循环中被移去。该函数不能将热键同其他线程创建的窗口关联起来。

若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。

若hWnd参数标识的窗口已用与id参数定义的相同的标识符登记了一个热键,则参数fsModifiers和vk的新值将替代这些参数先前定义的值。

RegisterHotKey可以被用来在线程之间登记热键。

头文件:winuser.h;库文件:user32.lib。

分享到:
评论

相关推荐

    VC HOOK热键定义实例.rar

    VC HOOK热键定义实例,请先选择菜单进行热键设置,然后测试你所设置的热键。程序将设定Shift为非法输入,当用户按下Shift时用Alt代替,程序使用CTRL ALT A为默认的热键,0x41 是A的虚拟键代码。

    VC++中自定义热键及响应

    源程序实现了vc++中热键(组合键)的定义及其消息的响应,可供参考。

    VC定义键盘指定键的功能

    摘要:VC/C++源码,系统相关,自定义热键 VC++自定义键盘指定键的功能,实例中定义“M”键为热键,相当于按下ESC键,程序退出,并且好像鼠标不能拖动对象了。当然也可以定义任意键在软件中的特定功能,比如定义一些...

    vc计时器源码,绝对原创

    VC编写的计时器,定义了热键,前台显示,适合作为比赛的计时用

    VC计时器,精确到0.01秒,定义了快捷键

    用VC编写的计时器,定义了使用的热键,窗口始终置顶,精确到0.01秒,类似与秒表的那种,但是只有一个小条。适合于在准备PPT的演讲时候提前预算时间。

    mfc 对话框托盘、气泡、读写注册表、控制鼠标键盘、定时器

    在vc60下编译通过,在vc60下对NOTIFYICONDATA等定义做了修改 shellapi.h的(Tray notification definitions)做了修改, 关于shellapi.h的定义可以参考其他文章,或者注释ShowBalloonTip(气泡)功能 并在stdaf.h的...

    Visual C++ 编程资源大全(英文源码 其它)

    13.zip Autoincreasing build number 自动增加版本信息的宏(5KB)<END><br>14,14.zip File Dialog Macro 文件对话框宏(6KB)<END><br>15,15.zip Code Template add-in for Visual C++ 5.0 在VC5中可...

    易语言程序免安装版下载

     增加静态编译功能,支持挂接第三方链接器(比如VC6中的link.exe)。  静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理...

    VC++6.0实效编程百例

    目录 第一章 1·带图标的菜单 2·显示倾斜文字 3·文字的颜色渐变 4·设置并叠加透明图片 5·颜色渐变进度条 6·透明窗体 第二章 7·调色程序 ...27·使窗体保持在最前 ...110·在IE工具栏中加入快捷图标

    MFC类库详解中文版(chm)

    CAsyncMonikerFile 在ActiveX控件中提供对异步标记的支持 afxole.h CAsyncScoket 封装Windows Sockets API,参看CSocket afxsock.h CBitmap afxwin.h CBitmapButton afxext.h CBrush afxwin.h CButton 按钮控件...

Global site tag (gtag.js) - Google Analytics