@@ -211,8 +211,121 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
211
211
(GetForegroundWindow () == ((HWND) secondaryRenderer->winId ())));
212
212
}
213
213
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)
215
217
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
+ }
216
329
else if ((lpKdhs->scanCode == 0x01 ) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
217
330
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
218
331
ret = TRUE ;
0 commit comments