给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’)来实现你自己程序的隐藏和呼出了。
 

Microsoft PetShop 3.0 设计与实现 分析报告―――数据访问层

 Microsoft PetShop 3.0 设计与实现--数据访问层   最近对多层设计实现和.Net产生了兴趣,从而研究了一下比较著名的多层范例程序――PetShop,现在的版本是3.0,和以前的...
  • cocoboy79
  • cocoboy79
  • 2003-09-26 22:51:00
  • 3448

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

对于这个问题,大家应该都不陌生,写于此只是进行了归纳总结,算是一个备忘吧 定义快捷方式有下面几种方法: 1.对于菜单(MENU)或者按钮(BUTTON) 直接在菜单或按钮的标题中,包含&X即可,...
  • pangshaohua
  • pangshaohua
  • 2011-11-22 10:24:51
  • 4272

VC添加全局热键的方法

全局热键定义 VirtualKey.h /************************************************************************/ // Vi...
  • lujianfeiccie2009
  • lujianfeiccie2009
  • 2012-04-25 17:09:31
  • 4170

VC热键控件(Hot Key Controls)

简介: 热键控件Hot Key Controls,是一个控件,就像IP控件一样,方便输入IP地址,同理,热键控件是方便输入热键的 这要和VC的热键区分开,举个例子,你开发的软件需要支持快捷键操作,而且...
  • rankun1
  • rankun1
  • 2017-04-06 14:45:52
  • 600

三种方法实现快捷键编程

  VC中至少有三种快捷键编程的方法,通常在SDI,MDI结构的程序中通过加入Acclelerator资源的消息响应,快速地实现快捷键功能;除些之内,还有另两种方法.通常用在基于对话框的程序中.  1...
  • dyx1024
  • dyx1024
  • 2008-08-03 22:14:00
  • 1874

VC++常用快捷键

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

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

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

VC6.0快捷键一览表

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

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

热键(或称组合键),在一个软件中有时候是很必须的。我们可以通过自定义热键和响应的方式,隐藏一些不向用户开放的功能,以达到一些简单的控制和目的。 自定义一个热键,一般需要经过如下的基本步骤: ⑴ 为...
  • margin1988
  • margin1988
  • 2011-08-16 15:59:15
  • 788

C++ 创建快捷方式的最简单方法

//代码如下: HRESULT hr = CoInitialize(NULL);  if (SUCCEEDED(hr))  {   IShellLink *pisl;   hr = Co...
  • xjbclz
  • xjbclz
  • 2016-07-05 21:14:21
  • 2101
收藏助手
不良信息举报
您举报文章:给VC程序加上热键(快捷键)
举报原因:
原因补充:

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