给VC程序加上热键(快捷键)

转载 2012年08月10日 15:27:02
      在利用Windows Media Player ActiveX控件写了一个简单的媒体播放器,想让自己写的这个播放器实现彻底隐藏的功能:程序主窗体的隐藏、在任务栏上的隐藏、在Alt+Tab键在程序间切换时的隐藏。这样,程序在实施隐藏后其他人将意识不到程序的执行,可以达到非常好的隐身效果,并且再次按下该热键可以使程序隐藏后从后台呼出。 
注册热键

首先要在程序中注册一个热键,无论该程序在前台还是后台运行,只要用户按下这个热键,程序将立即执行在前、后台间的切换。通过对RegisterHotKey()的调用登记用于程序隐藏和呼出的热键Ctrl + P(或Ctrl + p),下面这段代码添加在要使用热键的类的xxx.cpp文件的初始化函数中,在程序初始运行时执行。

// 登记热键

HWND hWnd = GetSafeHwnd();

RegisterHotKey(hWnd, 1001, MOD_CONTROL, 'P'); 

RegisterHotKey(hWnd, 1002, MOD_CONTROL, 'p'); 

其中,1001、1002参数是这些热键对应的ID。在程序捕获到热键消息WM_HOTKEY后将通过这些ID来确认按下的是哪个键。


定义WM_HOTKEY消息响应函数

ClassWizard并没有对消息WM_HOTKEY进行封装,需要手工添加对该消息的映射及处理。消息处理函数的wParam参数包含有按键的ID,在类的头文件xxx.h中添加如下代码:

afx_msg long OnHotKey(WPARAM wParam,LPARAM lParam);

在相应类的.cpp文件的消息映射宏BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之间加上同其他消息响应宏声明相同格式的自定义消息响应宏ON_MESSAGE(WM_HOTKEY,OnHotKey)

BEGIN_MESSAGE_MAP(类名, 父类名)

       //{{AFX_MSG_MAP(CMediaPlayDemoDlg)

       ……

      ON_MESSAGE(WM_HOTKEY, OnHotKey)

       ……

       //}}AFX_MSG_MAP

END_MESSAGE_MAP()


实现该消息处理函数:

HRESULT CMediaPlayDemoDlg::OnHotKey(WPARAM wParam,LPARAM lParam)

{

      switch(wParam) 

       {

              case 1001:

              case 1002:

                     {// 呼出程序

                            HWND hWnd = GetSafeHwnd();

                            LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);

                            lStyle &= ~WS_POPUP;

                            ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle);

                            ::ShowWindow(m_hWnd,SW_SHOW);

                            CWnd::SetForegroundWindow();

                            m_Video.GetControls().play();

                            break;

                     }

              case 1003:

              case 1004:

                     {

                            if( m_hotSign == 0 )

                            {// 隐藏程序

                                   HWND hWnd = GetSafeHwnd();

                                   LONG lStyle = ::GetWindowLong(m_hWnd,GWL_STYLE);

                                   lStyle |= WS_POPUP;

                                   ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle);

                                   ::ShowWindow(m_hWnd,SW_HIDE);

                                   m_Video.GetControls().pause();   //暂停播放

                                   m_hotSign = 1;

                                   break;

                            }

                            if( m_hotSign == 1 )

                            {// 呼出程序

                                   HWND hWnd = GetSafeHwnd();

                                   LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);

                                   lStyle &= ~WS_POPUP;

                                   ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle);

                                   ::ShowWindow(m_hWnd,SW_SHOW);

                                   CWnd::SetForegroundWindow();

                                   m_Video.GetControls().play();

                                   m_hotSign = 0;

                                   break;

                            }

                     }

              

       }


       return TRUE;

}


注销注册的热键

在OnDestory(...)函数或OnCancel(...)中解除函数登记,释放系统资源。此时要调用函数 bool UnregisterHotKey(hWnd,VK(ID));

void CMediaPlayDemoDlg::OnDestroy()

{

       CDialog::OnDestroy();

       

      HWND hWnd = GetSafeHwnd();

       UnregisterHotKey(hWnd,1001);

       UnregisterHotKey(hWnd,1002);


}


编译链接后就可以使用Ctrl+P(’p’)来实现你自己程序的隐藏和呼出了。
 

相关文章推荐

一种hook --- SetWindowLong函数修改窗口处理过程

LONG OldWndProc = 0; LRESULT CALLBACK WindowProc2( HWND hwnd, // handle to window UINT ...

VC++常用快捷键

“调试”快捷键       下列快捷组合键可在调试代码时使用。命令名   快捷键   说明   调试.应用代码更改   ALT + F10   开始一个“编辑”或“继续”生成,以应用对正在调试的代码所...
  • liranke
  • liranke
  • 2010年01月26日 08:03
  • 4821

VC编程增加快捷键的几种方式

对于这个问题,大家应该都不陌生,写于此只是进行了归纳总结,算是一个备忘吧 定义快捷方式有下面几种方法:1.对于菜单(MENU)或者按钮(BUTTON) 直接在菜单或按钮的标题中,包含&X即可,这里X是...
  • Augusdi
  • Augusdi
  • 2013年10月28日 09:55
  • 5463

vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY

vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY收藏 2009-02-22 19:26 一下介绍的内容均在vc6.0 MFC程序调试通过。   ...
  • Sayesan
  • Sayesan
  • 2014年11月07日 16:05
  • 1297

VC6.0快捷键一览表

F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容F2 书签功能: Ctrl+F2 –在某行设置一个书签(再按一次次是取消)F2 –跳到下一个书签位置Shift+F2 –跳到上...

VC如何注册、屏蔽全局键盘热键

      前段时间有两个朋友问我VC如何注册、屏蔽全局键盘热键,这是以前写过的一段代码。说实话,自己都感觉它比较“猥琐”,多的不说看源码吧!(哪位兄弟有其他思路,可以交流交流......) 1、定义...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

VC++6.0常用快捷键及对快捷键使用的看法

很多软件都提供了鼠标操作对应的快捷键,为什么要快捷键呢?因为快捷键可以很快捷。但是,通常来讲,快捷键能做到的,鼠标基本都可以做到,但鼠标能做到的,却不一定有对应的快捷键。         我们很熟悉w...
  • stpeace
  • stpeace
  • 2013年06月01日 18:49
  • 3573

VC编程增加快捷键的几种方式

对于这个问题,大家应该都不陌生,写于此只是进行了归纳总结,算是一个备忘吧 定义快捷方式有下面几种方法: 1.对于菜单(MENU)或者按钮(BUTTON) 直接在菜单或按钮的标题中,包含&X即可,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:给VC程序加上热键(快捷键)
举报原因:
原因补充:

(最多只允许输入30个字)