Проблема, с которой вы столкнулись, связана с тем, что клавиши Alt и Ctrl являются модификаторами, и их обработка в Windows отличается от обработки обычных клавиш. Для корректной эмуляции нажатия этих клавиш необходимо использовать правильные виртуальные коды (VK) и флаги. Для клавиш-модификаторов (Alt, Ctrl, Shift) используются специальные константы: VK_MENU (для Alt), VK_CONTROL (для Ctrl) и VK_SHIFT (для Shift).
Вот исправленный и улучшенный вариант вашей функции:
C++:
Код:
#include
#include
void
pressKey
(
const
QString
&
key
,
bool
release
=
false
)
{
INPUT input
=
{
}
;
input
.
type
=
INPUT_KEYBOARD
;
input
.
ki
.
dwFlags
=
0
;
// Определение виртуального кода клавиши
WORD virtualKeyCode
=
0
;
if
(
key
==
"alt"
)
{
virtualKeyCode
=
VK_MENU
;
// Виртуальный код для Alt
}
else
if
(
key
==
"ctrl"
)
{
virtualKeyCode
=
VK_CONTROL
;
// Виртуальный код для Ctrl
}
else
if
(
key
==
"shift"
)
{
virtualKeyCode
=
VK_SHIFT
;
// Виртуальный код для Shift
}
else
{
// Преобразуем символ в верхний регистр и получаем его виртуальный код
char
c
=
key
.
toUpper
(
)
.
toStdString
(
)
[
0
]
;
virtualKeyCode
=
VkKeyScanA
(
c
)
&
0xFF
;
// Получаем виртуальный код для символа
}
// Устанавливаем виртуальный код клавиши
input
.
ki
.
wVk
=
virtualKeyCode
;
// Если клавиша должна быть отпущена, добавляем флаг KEYEVENTF_KEYUP
if
(
release
)
{
input
.
ki
.
dwFlags
|=
KEYEVENTF_KEYUP
;
}
// Отправка события
SendInput
(
1
,
&
input
,
sizeof
(
INPUT
)
)
;
}
Пример использования:
C++:
Код:
int
main
(
)
{
// Нажать Alt
pressKey
(
"alt"
)
;
// Нажать A (итого нажато Alt + A)
pressKey
(
"a"
)
;
// Отпустить Alt
pressKey
(
"alt"
,
true
)
;
// Отпустить A
pressKey
(
"a"
,
true
)
;
return
0
;
}