- Keys are now parsed from a QKeySequence and converted to Win32 input events.
- Dial rotations send a simultaneous press-release event.
This commit is contained in:
parent
b40cb2f692
commit
d418424c14
@ -30,6 +30,7 @@ HEADERS += \
|
|||||||
Widgets/qmacrobutton.h \
|
Widgets/qmacrobutton.h \
|
||||||
Widgets/qprocesslistitem.h \
|
Widgets/qprocesslistitem.h \
|
||||||
Widgets/qratiobutton.h \
|
Widgets/qratiobutton.h \
|
||||||
|
WindowFinder/win32/windowfinderkeymap.h \
|
||||||
WindowFinder/windowfinder.h \
|
WindowFinder/windowfinder.h \
|
||||||
qmacrobindswindow.h \
|
qmacrobindswindow.h \
|
||||||
qmacrokeysmanager.h \
|
qmacrokeysmanager.h \
|
||||||
|
|||||||
224
WindowFinder/win32/windowfinderkeymap.h
Normal file
224
WindowFinder/win32/windowfinderkeymap.h
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
#ifndef WINDOWFINDERKEYMAP_H
|
||||||
|
#define WINDOWFINDERKEYMAP_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
const uint16_t asciiToWin32[0x80] = {
|
||||||
|
0x00,
|
||||||
|
0x01,
|
||||||
|
0x02,
|
||||||
|
0x03,
|
||||||
|
0x04,
|
||||||
|
0x05,
|
||||||
|
0x06,
|
||||||
|
0x07,
|
||||||
|
0x08,
|
||||||
|
0x09,
|
||||||
|
0x0A,
|
||||||
|
0x0B,
|
||||||
|
0x0C,
|
||||||
|
0x0D,
|
||||||
|
0x0E,
|
||||||
|
0x0F,
|
||||||
|
0x10,
|
||||||
|
0x11,
|
||||||
|
0x12,
|
||||||
|
0x13,
|
||||||
|
0x14,
|
||||||
|
0x15,
|
||||||
|
0x16,
|
||||||
|
0x17,
|
||||||
|
0x18,
|
||||||
|
0x19,
|
||||||
|
0x1A,
|
||||||
|
0x1B,
|
||||||
|
0x1C,
|
||||||
|
0x1D,
|
||||||
|
0x1E,
|
||||||
|
0x1F,
|
||||||
|
VK_SPACE,
|
||||||
|
'!',
|
||||||
|
'"',
|
||||||
|
'#',
|
||||||
|
'$',
|
||||||
|
'%',
|
||||||
|
'&',
|
||||||
|
'\'',
|
||||||
|
'(',
|
||||||
|
')',
|
||||||
|
'*',
|
||||||
|
'+',
|
||||||
|
',',
|
||||||
|
'-',
|
||||||
|
'.',
|
||||||
|
'/',
|
||||||
|
'0',
|
||||||
|
'1',
|
||||||
|
'2',
|
||||||
|
'3',
|
||||||
|
'4',
|
||||||
|
'5',
|
||||||
|
'6',
|
||||||
|
'7',
|
||||||
|
'8',
|
||||||
|
'9',
|
||||||
|
':',
|
||||||
|
';',
|
||||||
|
'<',
|
||||||
|
'=',
|
||||||
|
'>',
|
||||||
|
'?',
|
||||||
|
'@',
|
||||||
|
'A',
|
||||||
|
'B',
|
||||||
|
'C',
|
||||||
|
'D',
|
||||||
|
'E',
|
||||||
|
'F',
|
||||||
|
'G',
|
||||||
|
'H',
|
||||||
|
'I',
|
||||||
|
'J',
|
||||||
|
'K',
|
||||||
|
'L',
|
||||||
|
'M',
|
||||||
|
'N',
|
||||||
|
'O',
|
||||||
|
'P',
|
||||||
|
'Q',
|
||||||
|
'R',
|
||||||
|
'S',
|
||||||
|
'T',
|
||||||
|
'U',
|
||||||
|
'V',
|
||||||
|
'W',
|
||||||
|
'X',
|
||||||
|
'Y',
|
||||||
|
'Z',
|
||||||
|
'[',
|
||||||
|
'\\',
|
||||||
|
']',
|
||||||
|
'^',
|
||||||
|
'_',
|
||||||
|
'`',
|
||||||
|
0x61,
|
||||||
|
0x62,
|
||||||
|
0x63,
|
||||||
|
0x64,
|
||||||
|
0x65,
|
||||||
|
0x66,
|
||||||
|
0x67,
|
||||||
|
0x68,
|
||||||
|
0x69,
|
||||||
|
0x6A,
|
||||||
|
0x6B,
|
||||||
|
0x6C,
|
||||||
|
0x6D,
|
||||||
|
0x6E,
|
||||||
|
0x6F,
|
||||||
|
0x70,
|
||||||
|
0x71,
|
||||||
|
0x72,
|
||||||
|
0x73,
|
||||||
|
0x74,
|
||||||
|
0x75,
|
||||||
|
0x76,
|
||||||
|
0x77,
|
||||||
|
0x78,
|
||||||
|
0x79,
|
||||||
|
0x7A,
|
||||||
|
'{',
|
||||||
|
'|',
|
||||||
|
'}',
|
||||||
|
'~',
|
||||||
|
0x7F,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t functionToWin32[0x53] = {
|
||||||
|
VK_ESCAPE,
|
||||||
|
VK_TAB,
|
||||||
|
VK_TAB,
|
||||||
|
VK_BACK,
|
||||||
|
VK_RETURN,
|
||||||
|
VK_RETURN,
|
||||||
|
VK_INSERT,
|
||||||
|
VK_DELETE,
|
||||||
|
VK_PAUSE,
|
||||||
|
VK_PRINT,
|
||||||
|
VK_PRINT,
|
||||||
|
VK_CLEAR,
|
||||||
|
0x0C,
|
||||||
|
0x0D,
|
||||||
|
0x0E,
|
||||||
|
0x0F,
|
||||||
|
VK_HOME,
|
||||||
|
VK_END,
|
||||||
|
VK_LEFT,
|
||||||
|
VK_UP,
|
||||||
|
VK_RIGHT,
|
||||||
|
VK_DOWN,
|
||||||
|
VK_PRIOR,
|
||||||
|
VK_NEXT,
|
||||||
|
0x18,
|
||||||
|
0x19,
|
||||||
|
0x1A,
|
||||||
|
0x1B,
|
||||||
|
0x1C,
|
||||||
|
0x1D,
|
||||||
|
0x1E,
|
||||||
|
0x1F,
|
||||||
|
VK_LSHIFT,
|
||||||
|
VK_LCONTROL,
|
||||||
|
VK_LWIN,
|
||||||
|
VK_LMENU,
|
||||||
|
VK_CAPITAL,
|
||||||
|
VK_NUMLOCK,
|
||||||
|
VK_SCROLL,
|
||||||
|
0x27,
|
||||||
|
0x28,
|
||||||
|
0x29,
|
||||||
|
0x2A,
|
||||||
|
0x2B,
|
||||||
|
0x2C,
|
||||||
|
0x2D,
|
||||||
|
0x2E,
|
||||||
|
0x2F,
|
||||||
|
VK_F1,
|
||||||
|
VK_F2,
|
||||||
|
VK_F3,
|
||||||
|
VK_F4,
|
||||||
|
VK_F5,
|
||||||
|
VK_F6,
|
||||||
|
VK_F7,
|
||||||
|
VK_F8,
|
||||||
|
VK_F9,
|
||||||
|
VK_F10,
|
||||||
|
VK_F11,
|
||||||
|
VK_F12,
|
||||||
|
VK_F13,
|
||||||
|
VK_F14,
|
||||||
|
VK_F15,
|
||||||
|
VK_F16,
|
||||||
|
VK_F17,
|
||||||
|
VK_F18,
|
||||||
|
VK_F19,
|
||||||
|
VK_F20,
|
||||||
|
VK_F21,
|
||||||
|
VK_F22,
|
||||||
|
VK_F23,
|
||||||
|
VK_F24,
|
||||||
|
VK_F5,
|
||||||
|
VK_F6,
|
||||||
|
VK_F7,
|
||||||
|
VK_F8,
|
||||||
|
VK_F9,
|
||||||
|
VK_F10,
|
||||||
|
VK_F1,
|
||||||
|
VK_F2,
|
||||||
|
VK_F3,
|
||||||
|
VK_F4,
|
||||||
|
VK_F5,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WINDOWFINDERKEYMAP_H
|
||||||
@ -175,26 +175,49 @@ WindowData WindowFinder::getWin32FrontmostWindowProcess()
|
|||||||
|
|
||||||
void WindowFinder::sendWin32InputToFrontmostWindow(const QKeySequence &keys, const KeyEventType &type)
|
void WindowFinder::sendWin32InputToFrontmostWindow(const QKeySequence &keys, const KeyEventType &type)
|
||||||
{
|
{
|
||||||
const QString &keyStrings = keys.toString();
|
QVector<Qt::Key> separatedKeys;
|
||||||
const QStringList &keyStringsList = keyStrings.split(",");
|
for (int i = 0; i < keys.count(); i++) {
|
||||||
for (const QString &keyString : keyStringsList) {
|
Qt::KeyboardModifiers mods = keys[0].keyboardModifiers();
|
||||||
const QStringList &keys = keyString.split("+");
|
if (mods & Qt::ShiftModifier) separatedKeys.append(Qt::Key_Shift);
|
||||||
for (const QString &key : keys) {
|
if (mods & Qt::ControlModifier) separatedKeys.append(Qt::Key_Control);
|
||||||
INPUT input[1] = {};
|
if (mods & Qt::AltModifier) separatedKeys.append(Qt::Key_Alt);
|
||||||
ZeroMemory(input, sizeof(input));
|
if (mods & Qt::MetaModifier) separatedKeys.append(Qt::Key_Meta);
|
||||||
input[0].type = INPUT_KEYBOARD;
|
separatedKeys.append(keys[0].key());
|
||||||
if (key.compare("Shift", Qt::CaseInsensitive) == 0) {
|
}
|
||||||
input[0].ki.wVk = VK_LSHIFT;
|
|
||||||
} else if (key.compare("X", Qt::CaseInsensitive) == 0) {
|
switch (type) {
|
||||||
input[0].ki.wVk = 'X';
|
case KeyEventType::PRESS_AND_RELEASE: {
|
||||||
} else if (key.compare("Y", Qt::CaseInsensitive) == 0) {
|
// Send all key press events in order, then release events in reverse order, to
|
||||||
input[0].ki.wVk = 'Y';
|
// ensure modifier keys are released the way a user would do so on a keyboard.
|
||||||
} else if (key.compare("Z", Qt::CaseInsensitive) == 0) {
|
for (QVector<Qt::Key>::iterator keyIterator = separatedKeys.begin();
|
||||||
input[0].ki.wVk = 'Z';
|
keyIterator != separatedKeys.end();
|
||||||
}
|
keyIterator++) {
|
||||||
input[0].ki.dwFlags = type == KeyEventType::RELEASE ? KEYEVENTF_KEYUP : 0;
|
sendWin32InputEvent(*keyIterator, KeyEventType::PRESS);
|
||||||
SendInput(ARRAYSIZE(input), input, sizeof(INPUT));
|
|
||||||
}
|
}
|
||||||
|
for (QVector<Qt::Key>::reverse_iterator keyIterator = separatedKeys.rbegin();
|
||||||
|
keyIterator != separatedKeys.rend();
|
||||||
|
keyIterator++) {
|
||||||
|
sendWin32InputEvent(*keyIterator, KeyEventType::RELEASE);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
default: {
|
||||||
|
for (const Qt::Key &key : separatedKeys) {
|
||||||
|
sendWin32InputEvent(key, type);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void WindowFinder::sendWin32InputEvent(const Qt::Key &key, const KeyEventType &type)
|
||||||
|
{
|
||||||
|
INPUT input[1] = {};
|
||||||
|
ZeroMemory(input, sizeof(input));
|
||||||
|
input[0].type = INPUT_KEYBOARD;
|
||||||
|
if (key >= 0x01000000 && key < 0x01000053) {
|
||||||
|
input[0].ki.wVk = functionToWin32[key & 0x0000007F];
|
||||||
|
} else {
|
||||||
|
input[0].ki.wVk = asciiToWin32[key & 0x0000007F];
|
||||||
|
}
|
||||||
|
input[0].ki.dwFlags = type == KeyEventType::RELEASE ? KEYEVENTF_KEYUP : 0;
|
||||||
|
SendInput(ARRAYSIZE(input), input, sizeof(INPUT));
|
||||||
|
}
|
||||||
#endif // Q_OS_WIN
|
#endif // Q_OS_WIN
|
||||||
|
|||||||
@ -4,6 +4,10 @@
|
|||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#include "win32/windowfinderkeymap.h"
|
||||||
|
#endif // Q_OS_WIN
|
||||||
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
struct IconDirEntry
|
struct IconDirEntry
|
||||||
@ -56,6 +60,7 @@ private:
|
|||||||
static WindowData getWin32FrontmostWindowProcess();
|
static WindowData getWin32FrontmostWindowProcess();
|
||||||
// static bool getWin32IconData(HICON hIcon, int nColorBits, QByteArray &buffer);
|
// static bool getWin32IconData(HICON hIcon, int nColorBits, QByteArray &buffer);
|
||||||
static void sendWin32InputToFrontmostWindow(const QKeySequence &keys, const KeyEventType &type);
|
static void sendWin32InputToFrontmostWindow(const QKeySequence &keys, const KeyEventType &type);
|
||||||
|
static void sendWin32InputEvent(const Qt::Key &key, const KeyEventType &type);
|
||||||
#endif // Q_OS_WIN
|
#endif // Q_OS_WIN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -123,7 +123,7 @@ void QMacroBindsWindow::newEncoderRotation(const quint8 &column, const EncoderRo
|
|||||||
{
|
{
|
||||||
const QVector<QPushButton *> &encoderButtons = this->vButtonWidgets.last();
|
const QVector<QPushButton *> &encoderButtons = this->vButtonWidgets.last();
|
||||||
if (column < encoderButtons.size()) {
|
if (column < encoderButtons.size()) {
|
||||||
WindowFinder::sendInputToFrontmostWindow(direction == EncoderRotation::CCW ? QKeySequence(tr("Shift+Y")) : QKeySequence(tr("Shift+X")), KeyEventType::PRESS_AND_RELEASE);
|
WindowFinder::sendInputToFrontmostWindow(direction == EncoderRotation::CCW ? QKeySequence(tr("Shift+Y")) : QKeySequence(tr("Shift+A")), KeyEventType::PRESS_AND_RELEASE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user