
void playPauseToogle() { // postKeyEventToSystem(Qt::Key_MediaTogglePlayPause); } We will separate the platform-dependent code with the #ifdef OS_TYPE and #endif directives ( we will move part of the code in Objective-C to a separate file macx.mm, but more on that later). #ifdef Q_OS_WIN32 #define WINVER 0x0500 #include <Windows.h> #endif sendKeyEventToSystem(Qt::Key qtKey) { // . qtKey - #ifdef Q_OS_WIN32 INPUT ip; // ip.type = INPUT_KEYBOARD; ip.ki.wScan = 0; ip.ki.time = 0; ip.ki.dwExtraInfo = 0; // switch (qtKey) { case Qt::Key_MediaPrevious: ip.ki.wVk = VK_MEDIA_PREV_TRACK; // break; case Qt::Key_MediaTogglePlayPause: ip.ki.wVk = VK_MEDIA_PLAY_PAUSE; // break; case Qt::Key_MediaNext: ip.ki.wVk = VK_MEDIA_NEXT_TRACK; // break; default: return; break; } // ip.ki.dwFlags = 0; SendInput(1, &ip, sizeof(INPUT)); // ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(INPUT)); #endif } Hereinafter, only 3 keys will be used in the examples. At the end of the article is a table of correspondence codes. sudo apt-get install libxtst-dev It will also be necessary to connect the library in the project file: unix:!macx:LIBS += -lXtst -lX11 #ifdef Q_OS_LINUX #include <X11/Xlib.h> #include <X11/extensions/XTest.h> #define XF86AudioLowerVolume 0x1008ff11 #define XF86AudioMute 0x1008ff12 #define XF86AudioRaiseVolume 0x1008ff13 #define XF86AudioPlay 0x1008ff14 #define XF86AudioStop 0x1008ff15 #define XF86AudioPrev 0x1008ff16 #define XF86AudioNext 0x1008ff17 #define XF86AudioPause 0x1008ff31 #endif #ifdef Q_OS_LINUX unsigned int key; unsigned int keycode; switch (qtKey) { case Qt::Key_MediaPrevious: key = XF86AudioPrev; break; case Qt::Key_MediaTogglePlayPause: key = XF86AudioPlay; break; case Qt::Key_MediaNext: key = XF86AudioNext; break; default: return; break; } // X Display *display; display = XOpenDisplay(NULL); // keycode = XKeysymToKeycode(display, key); // XTestFakeKeyEvent(display, keycode, 1, 0); // XTestFakeKeyEvent(display, keycode, 0, 0); // X XFlush(display); // X XCloseDisplay(display); #endif OBJECTIVE_SOURCES += macx.mm macx:LIBS += -framework ApplicationServices -framework IOKit #ifdef Q_OS_MAC #include <ApplicationServices/ApplicationServices.h> // UInt8 #include <IOKit/hidsystem/ev_keymap.h> // #include "mac.h" // Objective-C #endif #ifdef Q_OS_MAC switch (qtKey) { case Qt::Key_MediaPrevious: HIDPostAuxKey( NX_KEYTYPE_PREVIOUS ); break; case Qt::Key_MediaTogglePlayPause: HIDPostAuxKey( NX_KEYTYPE_PLAY ); break; case Qt::Key_MediaNext: HIDPostAuxKey( NX_KEYTYPE_NEXT ); break; default: return; break; } #endif #import <Cocoa/Cocoa.h> #import <IOKit/hidsystem/IOHIDLib.h> #import <IOKit/hidsystem/ev_keymap.h> #include "macx.h" static io_connect_t get_event_driver(void) { static mach_port_t sEventDrvrRef = 0; mach_port_t masterPort, service, iter; kern_return_t kr; if (!sEventDrvrRef) { // Get master device port kr = IOMasterPort( bootstrap_port, &masterPort ); check( KERN_SUCCESS == kr); kr = IOServiceGetMatchingServices( masterPort, IOServiceMatching( kIOHIDSystemClass ), &iter ); check( KERN_SUCCESS == kr); service = IOIteratorNext( iter ); check( service ); kr = IOServiceOpen( service, mach_task_self(), kIOHIDParamConnectType, &sEventDrvrRef ); check( KERN_SUCCESS == kr ); IOObjectRelease( service ); IOObjectRelease( iter ); } return sEventDrvrRef; } void HIDPostAuxKey(const UInt8 auxKeyCode ) { NXEventData event; kern_return_t kr; IOGPoint loc = { 0, 0 }; // UInt32 evtInfo = auxKeyCode << 16 | NX_KEYDOWN << 8; bzero(&event, sizeof(NXEventData)); event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS; event.compound.misc.L[0] = evtInfo; kr = IOHIDPostEvent( get_event_driver(), NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE ); check( KERN_SUCCESS == kr ); // evtInfo = auxKeyCode << 16 | NX_KEYUP << 8; bzero(&event, sizeof(NXEventData)); event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS; event.compound.misc.L[0] = evtInfo; kr = IOHIDPostEvent( get_event_driver(), NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE ); check( KERN_SUCCESS == kr ); } | Qt :: Key | Windows | Linux | Mac os x |
|---|---|---|---|
| Qt :: Key_VolumeDown | VK_VOLUME_DOWN | XF86AudioLowerVolume | NX_KEYTYPE_SOUND_DOWN |
| Qt :: Key_VolumeMute | VK_VOLUME_MUTE | XF86AudioMute | NX_KEYTYPE_MUTE |
| Qt :: Key_VolumeUp | VK_VOLUME_UP | XF86AudioRaiseVolume | NX_KEYTYPE_SOUND_UP |
| Qt :: Key_BassBoost | |||
| Qt :: Key_BassUp | |||
| Qt :: Key_BassDown | |||
| Qt :: Key_TrebleUp | |||
| Qt :: Key_TrebleDown | |||
| Qt :: Key_MediaPlay | VK_MEDIA_PLAY_PAUSE | XF86AudioPlay | NX_KEYTYPE_PLAY |
| Qt :: Key_MediaStop | VK_MEDIA_STOP | XF86AudioStop | |
| Qt :: Key_MediaPrevious | VK_MEDIA_PREV_TRACK | XF86AudioPrev | NX_KEYTYPE_PREVIOUS |
| Qt :: Key_MediaNext | VK_MEDIA_NEXT_TRACK | XF86AudioNext | NX_KEYTYPE_NEXT |
| Qt :: Key_MediaRecord | |||
| Qt :: Key_MediaPause | XF86AudioPause | ||
| Qt :: Key_MediaTogglePlayPause | VK_MEDIA_PLAY_PAUSE | XF86AudioPlay | NX_KEYTYPE_PLAY |
Source: https://habr.com/ru/post/217779/
All Articles