在利用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’)来实现你自己程序的隐藏和呼出了。
给VC程序加上热键(快捷键)
最新推荐文章于 2022-10-14 01:24:36 发布