From 5f30095ec84289427afc365a65b79402a91ef4fd Mon Sep 17 00:00:00 2001 From: Vasily Date: Wed, 22 May 2019 20:17:09 +0200 Subject: [PATCH] Readd media keys for Windows This intentionally does not compile on Linux. --- src/media_keys/media_keys.cpp | 76 +++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/src/media_keys/media_keys.cpp b/src/media_keys/media_keys.cpp index 7cc126c..3319059 100644 --- a/src/media_keys/media_keys.cpp +++ b/src/media_keys/media_keys.cpp @@ -1,26 +1,94 @@ #include "media_keys.h" #include "src/keyboard_input/input_sender.h" +#include namespace keyboardinput { +INPUT createInputStruct( const WORD virtualKeyCode, + const KeyStatus keyStatus ) noexcept +{ + INPUT input = {}; + + input.type = INPUT_KEYBOARD; + + input.ki.wVk = virtualKeyCode; + + if ( keyStatus == KeyStatus::Up ) + { + input.ki.dwFlags = KEYEVENTF_KEYUP; + } + else if ( keyStatus == KeyStatus::Down ) + { + input.ki.dwFlags = 0; + } + + return input; +} + +void sendKeyboardInputRaw( std::vector inputs ) +{ + const auto success = SendInput( static_cast( inputs.size() ), + inputs.data(), + sizeof( INPUT ) ); + + if ( ( inputs.size() > 0 ) && !success ) + { + char* err; + auto errCode = GetLastError(); + if ( !FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER + | FORMAT_MESSAGE_FROM_SYSTEM, + nullptr, + errCode, + MAKELANGID( LANG_NEUTRAL, + SUBLANG_DEFAULT ), // default language + reinterpret_cast( &err ), + 0, + nullptr ) ) + { + LOG( ERROR ) + << "Error calling SendInput(): Could not get error message (" + << errCode << ")"; + } + else + { + LOG( ERROR ) << "Error calling SendInput(): " << err; + } + } +} + void sendMediaNextSong() { - // noop + std::vector inputs = {}; + inputs.push_back( + createInputStruct( VK_MEDIA_NEXT_TRACK, KeyStatus::Down ) ); + inputs.push_back( createInputStruct( VK_MEDIA_NEXT_TRACK, KeyStatus::Up ) ); + sendKeyboardInputRaw( inputs ); } void sendMediaPreviousSong() { - // noop + std::vector inputs = {}; + inputs.push_back( + createInputStruct( VK_MEDIA_PREV_TRACK, KeyStatus::Down ) ); + inputs.push_back( createInputStruct( VK_MEDIA_PREV_TRACK, KeyStatus::Up ) ); + sendKeyboardInputRaw( inputs ); } void sendMediaPausePlay() { - // noop + std::vector inputs = {}; + inputs.push_back( + createInputStruct( VK_MEDIA_PLAY_PAUSE, KeyStatus::Down ) ); + inputs.push_back( createInputStruct( VK_MEDIA_PLAY_PAUSE, KeyStatus::Up ) ); + sendKeyboardInputRaw( inputs ); } void sendMediaStopSong() { - // noop + std::vector inputs = {}; + inputs.push_back( createInputStruct( VK_MEDIA_STOP, KeyStatus::Down ) ); + inputs.push_back( createInputStruct( VK_MEDIA_STOP, KeyStatus::Up ) ); + sendKeyboardInputRaw( inputs ); // noop } } // namespace keyboardinput