Skip to content

Commit d7644a9

Browse files
authored
Merge pull request 86Box#5263 from Cacodemon345/usb-media-key
USB multimedia keys now work on Windows
2 parents 590deb7 + 95f3019 commit d7644a9

File tree

1 file changed

+114
-1
lines changed

1 file changed

+114
-1
lines changed

src/qt/qt_main.cpp

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,121 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
211211
(GetForegroundWindow() == ((HWND) secondaryRenderer->winId())));
212212
}
213213

214-
if ((nCode < 0) || (nCode != HC_ACTION) || !is_over_window)
214+
bool skip = ((nCode < 0) || (nCode != HC_ACTION) || !is_over_window);
215+
216+
if (skip)
215217
return CallNextHookEx(NULL, nCode, wParam, lParam);
218+
219+
/* USB keyboards send a scancode of 0x00 for multimedia keys. */
220+
if (lpKdhs->scanCode == 0x00) {
221+
/* Handle USB keyboard multimedia keys where possible.
222+
Only a handful of keys can be handled via Virtual Key
223+
detection; rest can't be reliably detected. */
224+
DWORD vkCode = lpKdhs->vkCode;
225+
bool up = !!(lpKdhs->flags & LLKHF_UP);
226+
ret = CallNextHookEx(NULL, nCode, wParam, lParam);;
227+
228+
switch (vkCode)
229+
{
230+
case VK_MEDIA_PLAY_PAUSE:
231+
{
232+
win_keyboard_handle(0x22, up, 1, 0);
233+
break;
234+
}
235+
case VK_MEDIA_STOP:
236+
{
237+
win_keyboard_handle(0x24, up, 1, 0);
238+
break;
239+
}
240+
case VK_VOLUME_UP:
241+
{
242+
win_keyboard_handle(0x30, up, 1, 0);
243+
break;
244+
}
245+
case VK_VOLUME_DOWN:
246+
{
247+
win_keyboard_handle(0x2E, up, 1, 0);
248+
break;
249+
}
250+
case VK_VOLUME_MUTE:
251+
{
252+
win_keyboard_handle(0x20, up, 1, 0);
253+
break;
254+
}
255+
case VK_MEDIA_NEXT_TRACK:
256+
{
257+
win_keyboard_handle(0x19, up, 1, 0);
258+
break;
259+
}
260+
case VK_MEDIA_PREV_TRACK:
261+
{
262+
win_keyboard_handle(0x10, up, 1, 0);
263+
break;
264+
}
265+
case VK_LAUNCH_MEDIA_SELECT:
266+
{
267+
win_keyboard_handle(0x6D, up, 1, 0);
268+
break;
269+
}
270+
case VK_LAUNCH_MAIL:
271+
{
272+
win_keyboard_handle(0x6C, up, 1, 0);
273+
break;
274+
}
275+
case VK_LAUNCH_APP1:
276+
{
277+
win_keyboard_handle(0x6B, up, 1, 0);
278+
break;
279+
}
280+
case VK_LAUNCH_APP2:
281+
{
282+
win_keyboard_handle(0x21, up, 1, 0);
283+
break;
284+
}
285+
case VK_BROWSER_BACK:
286+
{
287+
win_keyboard_handle(0x6A, up, 1, 0);
288+
break;
289+
}
290+
case VK_BROWSER_FORWARD:
291+
{
292+
win_keyboard_handle(0x69, up, 1, 0);
293+
break;
294+
}
295+
case VK_BROWSER_STOP:
296+
{
297+
win_keyboard_handle(0x68, up, 1, 0);
298+
break;
299+
}
300+
case VK_BROWSER_HOME:
301+
{
302+
win_keyboard_handle(0x32, up, 1, 0);
303+
break;
304+
}
305+
case VK_BROWSER_SEARCH:
306+
{
307+
win_keyboard_handle(0x65, up, 1, 0);
308+
break;
309+
}
310+
case VK_BROWSER_REFRESH:
311+
{
312+
win_keyboard_handle(0x67, up, 1, 0);
313+
break;
314+
}
315+
case VK_BROWSER_FAVORITES:
316+
{
317+
win_keyboard_handle(0x66, up, 1, 0);
318+
break;
319+
}
320+
case VK_HELP:
321+
{
322+
win_keyboard_handle(0x3b, up, 1, 0);
323+
break;
324+
}
325+
}
326+
327+
return ret;
328+
}
216329
else if ((lpKdhs->scanCode == 0x01) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
217330
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
218331
ret = TRUE;

0 commit comments

Comments
 (0)