Winamp 預設最小化至系統托盤,但缺乏熱鍵喚出功能。習慣 QQ 風格熱鍵的使用者每次換歌都要滑鼠點擊托盤圖示,頗為不便。本文示範如何編寫一個常駐系統托盤的小工具,註冊全域熱鍵,透過 FindWindowEx 尋找 Winamp 視窗並呼叫 ShowWindow/SetForegroundWindow 實現一鍵喚出,同時工具本身也支援熱鍵顯示/隱藏設定視窗。
BOOL RegisterHotKey(
HWND hWnd, // 接收 WM_HOTKEY 的視窗
int id, // 熱鍵 ID (0x0000~0xBFFF)
UINT fsModifiers, // MOD_ALT | MOD_CONTROL | MOD_SHIFT | MOD_WIN
UINT vk // 虛擬鍵碼 (如 'A', VK_F1)
);
BOOL UnregisterHotKey(HWND hWnd, int id);
void CHotkeyDlg::OnOK()
{
UpdateData(TRUE);
m_Wap.MakeUpper(); // Winamp 熱鍵鍵碼
m_Dlg.MakeUpper(); // 設定視窗熱鍵鍵碼
// 預設使用 Ctrl + 字母
if (!RegisterHotKey(m_hWnd, 0xA002, MOD_CONTROL, (UINT)m_Wap[0]) ||
!RegisterHotKey(m_hWnd, 0xA001, MOD_CONTROL, (UINT)m_Dlg[0]))
{
AfxMessageBox(_T("熱鍵已被佔用!"));
}
}
BOOL CHotkeyDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_HOTKEY)
{
if (pMsg->wParam == 0xA002) // Winamp 熱鍵
{
// 中文版視窗標題
HWND hWinamp = FindWindowEx(NULL, NULL, NULL, _T("Winamp 播放清單編輯器"));
// 英文版視窗標題
HWND hWinamp2 = FindWindowEx(NULL, NULL, NULL, _T("Winamp Playlist Editor"));
if (hWinamp) {
ShowWindow(hWinamp, SW_SHOWNORMAL);
SetForegroundWindow(hWinamp);
}
if (hWinamp2) {
ShowWindow(hWinamp2, SW_SHOWNORMAL);
SetForegroundWindow(hWinamp2);
}
}
else if (pMsg->wParam == 0xA001) // 設定視窗熱鍵
{
ShowWindow(m_hWnd, SW_SHOWNORMAL);
SetForegroundWindow(m_hWnd);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CHotkeyDlg::OnClose()
{
UnregisterHotKey(m_hWnd, 0xA001);
UnregisterHotKey(m_hWnd, 0xA002);
CDialog::OnClose();
}
工具最小化時隱藏至托盤 (需自行實作 Shell_NotifyIcon),不佔用工作列空間。按 Ctrl+設定鍵 喚出設定視窗,按 Ctrl+Winamp鍵 直接喚出 Winamp 播放清單。
MOD_WIN (Win 鍵) 組合,避免與其他軟體衝突。Winamp v1.x) 以相容更多版本。完整原始碼 (VC6.0 / Win2K 測試通過) 可下載參考。