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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值