El siguiente ejemplo muestra una solucion para este tema, registrando combinaciones de teclas que cumplen las funciones multimedia deseadas;
program HKMedia; // by cHackAll uses Windows, ShellAPI, Messages; const VK_VOLUME_UP = $AF; VK_VOLUME_DOWN = $AE; VK_MEDIA_NEXT_TRACK = $B0; VK_MEDIA_PREV_TRACK = $B1; MediaHotKey = 'MediaHotKey'; var hMenu: Cardinal; hKey: Windows.HKEY; FileName: array [1..MAX_PATH] of Char; function WndProc(hWnd, uMsg, wParam, lParam: Cardinal): Integer; stdcall; var Point: TPoint; begin Result := 0; case uMsg of WM_HOTKEY: begin keybd_event(wParam, 0, 0, 0); keybd_event(wParam, 0, KEYEVENTF_KEYUP, 0); end; WM_USER: if lParam = WM_RBUTTONDOWN then begin SendMessage(hWnd, WM_COMMAND, 2, WM_USER); SetForegroundWindow(hWnd); GetCursorPos(Point); TrackPopupMenu(hMenu, TPM_LEFTALIGN, Point.X, Point.Y, 0, hWnd, nil); end; WM_COMMAND: if wParam = 0 then SendMessage(hWnd, WM_CLOSE, 0, 0) else begin uMsg := MF_BYCOMMAND; if RegQueryValueEx(hKey, MediaHotKey, nil, nil, nil, nil) = 0 then uMsg := uMsg or MF_CHECKED; if lParam = WM_USER then ModifyMenu(hMenu, 2, uMsg, 2, 'Startup') else if uMsg <> MF_BYCOMMAND then RegDeleteValue(hKey, MediaHotKey) else RegSetValueEx(hKey, MediaHotKey, 0, REG_SZ, @FileName, GetModuleFileName(0, @FileName, SizeOf(FileName))); end; WM_DESTROY: PostQuitMessage(0); else Result := DefWindowProc(hWnd, uMsg, wParam, lParam); end; end; var WndClass: TWndClass = (lpfnWndProc: @WndProc; lpszClassName: MediaHotKey); NotifyIconData: TNotifyIconData = (cbSize: SizeOf(NotifyIconData); uFlags: NIF_MESSAGE or NIF_ICON or NIF_TIP; uCallbackMessage: WM_USER; szTip: 'HKMedia'#13'by cHackAll'); hWnd: Cardinal; Msg: TMsg; begin CreateMutex(nil, True, MediaHotKey); if GetLastError <> 0 then Exit; hWnd := CreateWindow(PChar(RegisterClass(WndClass)), nil, WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, nil); RegisterHotKey(hWnd, VK_MEDIA_NEXT_TRACK, MOD_CONTROL, VK_RIGHT); RegisterHotKey(hWnd, VK_MEDIA_PREV_TRACK, MOD_CONTROL, VK_LEFT); RegisterHotKey(hWnd, VK_VOLUME_DOWN, MOD_CONTROL, VK_DOWN); RegisterHotKey(hWnd, VK_VOLUME_UP, MOD_CONTROL, VK_UP); NotifyIconData.Wnd := hWnd; NotifyIconData.hIcon := LoadImage(LoadLibrary('osk.exe'), 'APP_OSK', IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); Shell_NotifyIcon(NIM_ADD, @NotifyIconData); hMenu := CreatePopupMenu; if RegOpenKey(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Run', hKey) = ERROR_SUCCESS then begin AppendMenu(hMenu, MF_BYCOMMAND or MF_CHECKED, 2, 'Startup'); AppendMenu(hMenu, MF_BYCOMMAND or MF_SEPARATOR, 1, nil); end; AppendMenu(hMenu, MF_BYCOMMAND, 0, 'Close'); repeat GetMessage(Msg, 0, 0, 0); DispatchMessage(Msg); until Msg.Message = WM_QUIT; Shell_NotifyIcon(NIM_DELETE, @NotifyIconData); end.
Las funciones que el anterior ejemplo muestra son;
Ctrl + Flecha Derecha = Siguiente canción
Ctrl + Flecha Izquierda = Anterior canción
Ctrl + Flecha Arriba = Subir el volumen
Ctrl + Flecha Abajo = Bajar el volumen
Se pueden aumentar a voluntad funciones añadiendo una linea como la siguiente;
RegisterHotKey(hWnd, VK_VOLUME_MUTE, MOD_CONTROL, VK_END); // Ctrl+End=Mute
Tambien muestra un manejo sencillo de mensajes, TrayIcon y de ejecución automatica.
Enjoy!