前言:
本人喜歡把winamp設置在托盤區,不過winamp不提供熱鍵呼出,而我用慣OICQ的熱鍵呼出,所以,每次想換歌時要用鼠標點擊總覺得不爽。
於是萌發了給它作個熱鍵的想法,基本思想就是注冊一個系統級熱鍵當然熱鍵不能直接注冊在winamp上的,所以我把熱鍵注冊在一個對話框上,然後通過獲得的winamp的句柄將winamp顯示出來,並且是顯示到最前方。而且對話框最小化時對它進行隱藏,這樣不至於占用任務欄,也讓人覺得熱鍵就是winamp自己帶的,對話框也同樣用熱鍵呼出。
示例程序運行效果圖
具體步驟:
首先創建一個對話框工程,添加edit控件,便於用戶自己添加喜歡的熱鍵,示例程序中默認的是"ctrl+某個鍵".
m_Wap是winamp的熱鍵
m_Dlg是dialog的熱鍵
利用::RegisterHotKey進行注冊
BOOL RegisterHotKey(
HWND hWnd, // 接收hotkey窗口
int id, // hotkey的id 范圍是0x0000到0xBFFF
UINT fsModifiers, // 可以是MOD_ALT MOD_CTRL MOD_WIN
UINT vk // 虛擬鍵值,就是m_Wap,m_Dlg的值
);
void CXXXDlg::OnOk()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_Wap.MakeUpper();//字母轉化成大寫
m_Dlg.MakeUpper();
if((!::RegisterHotKey(this->m_hWnd,0Xa002,MOD_CONTROL,(UINT)m_Wap[0]))
&&(!::RegisterHotKey(this->m_hWnd,0Xa001,MOD_CONTROL,(UINT)m_Dlg[0])))
AfxMessageBox("*^_^* 熱鍵已經注冊了 *^_^*");
}
在PreTranslateMessage中響應
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message==WM_HOTKEY && pMsg->wParam==0Xa002)
{
//中文版
HWND handle=FindWindowEx(NULL,NULL,NULL,"Winamp 播放清單編輯器");
//英文版
HWND handle2=FindWindowEx(NULL,NULL,NULL,"Winamp Playlist Editor");
if(handle)
{
::ShowWindow(handle,SW_SHOWNORMAL);
::SetForegroundWindow(handle);
}
if(handle2)
{
::ShowWindow(handle2,SW_SHOWNORMAL);
::SetForegroundWindow(handle2);
}
}
if (pMsg->message==WM_HOTKEY && pMsg->wParam==0Xa001)
{
::ShowWindow(this->m_hWnd,SW_SHOWNORMAL);
::SetForegroundWindow(this->m_hWnd);
}
return CDialog::PreTranslateMessage(pMsg);
}
程序結束時候自然要把熱鍵注銷了
void CXXXDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
UnregisterHotKey(this->m_hWnd,0Xa001);
UnregisterHotKey(this->m_hWnd,0Xa002);
CDialog::OnClose();
}
具體的例程可見本文提供的源代碼(在WIN2K,VC6.0調試通過)
本文配套源碼