Skip to content

Commit 5fa26f7

Browse files
author
Bri
committed
Add global media key support for keyboards and headsets
1 parent ba81d2b commit 5fa26f7

2 files changed

Lines changed: 42 additions & 1 deletion

File tree

src/hotkeys.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,24 @@ std::wstring FormatHotkey(UINT modifiers, UINT vk) {
2727
return result;
2828
}
2929

30+
// Media key hotkey IDs (use high values to avoid conflicts)
31+
#define HOTKEY_ID_MEDIA_PLAYPAUSE 0x7F00
32+
#define HOTKEY_ID_MEDIA_STOP 0x7F01
33+
#define HOTKEY_ID_MEDIA_PREV 0x7F02
34+
#define HOTKEY_ID_MEDIA_NEXT 0x7F03
35+
3036
// Register all global hotkeys
3137
void RegisterGlobalHotkeys() {
32-
if (!g_hwnd || !g_hotkeysEnabled) return;
38+
if (!g_hwnd) return;
39+
40+
// Always register media keys (no modifiers needed)
41+
RegisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_PLAYPAUSE, 0, VK_MEDIA_PLAY_PAUSE);
42+
RegisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_STOP, 0, VK_MEDIA_STOP);
43+
RegisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_PREV, 0, VK_MEDIA_PREV_TRACK);
44+
RegisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_NEXT, 0, VK_MEDIA_NEXT_TRACK);
45+
46+
// Register user-defined hotkeys
47+
if (!g_hotkeysEnabled) return;
3348
for (const auto& hk : g_hotkeys) {
3449
RegisterHotKey(g_hwnd, hk.id, hk.modifiers, hk.vk);
3550
}
@@ -38,6 +53,14 @@ void RegisterGlobalHotkeys() {
3853
// Unregister all global hotkeys
3954
void UnregisterGlobalHotkeys() {
4055
if (!g_hwnd) return;
56+
57+
// Unregister media keys
58+
UnregisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_PLAYPAUSE);
59+
UnregisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_STOP);
60+
UnregisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_PREV);
61+
UnregisterHotKey(g_hwnd, HOTKEY_ID_MEDIA_NEXT);
62+
63+
// Unregister user-defined hotkeys
4164
for (const auto& hk : g_hotkeys) {
4265
UnregisterHotKey(g_hwnd, hk.id);
4366
}

src/main.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,24 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
177177

178178
case WM_HOTKEY: {
179179
int hotkeyId = static_cast<int>(wParam);
180+
181+
// Handle media keys (registered with special IDs)
182+
switch (hotkeyId) {
183+
case 0x7F00: // HOTKEY_ID_MEDIA_PLAYPAUSE
184+
PostMessage(hwnd, WM_COMMAND, IDM_PLAY_PLAYPAUSE, 0);
185+
return 0;
186+
case 0x7F01: // HOTKEY_ID_MEDIA_STOP
187+
PostMessage(hwnd, WM_COMMAND, IDM_PLAY_STOP, 0);
188+
return 0;
189+
case 0x7F02: // HOTKEY_ID_MEDIA_PREV
190+
PostMessage(hwnd, WM_COMMAND, IDM_PLAY_PREV, 0);
191+
return 0;
192+
case 0x7F03: // HOTKEY_ID_MEDIA_NEXT
193+
PostMessage(hwnd, WM_COMMAND, IDM_PLAY_NEXT, 0);
194+
return 0;
195+
}
196+
197+
// Handle user-defined hotkeys
180198
for (const auto& hk : g_hotkeys) {
181199
if (hk.id == hotkeyId) {
182200
PostMessage(hwnd, WM_COMMAND, g_hotkeyActions[hk.actionIdx].commandId, 0);

0 commit comments

Comments
 (0)