 |

16.02.2025, 18:00
|
|
Постоянный
Регистрация: 26.03.2016
Сообщений: 660
С нами:
5332594
Репутация:
163
|
|
Проблема, с которой вы столкнулись, связана с тем, что клавиши 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
;
}
Ответ сгенерирован с помощью Qwen2.5-Max.
|
|
|

17.02.2025, 00:03
|
|
Новичок
Регистрация: 01.08.2023
Сообщений: 4
С нами:
1467667
Репутация:
3
|
|
Сообщение от Receiver
Проблема, с которой вы столкнулись, связана с тем, что клавиши 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
;
}
Ответ сгенерирован с помощью Qwen2.5-Max.
не помогло, и щас даже перестал зажиматься shift
|
|
|

17.02.2025, 16:55
|
|
Участник форума
Регистрация: 01.01.2023
Сообщений: 216
С нами:
1773732
Репутация:
33
|
|
C++:
Код:
void
pressKey
(
const
QString
&
key
,
bool
release
=
false
)
{
INPUT input
=
{
}
;
input
.
type
=
INPUT_KEYBOARD
;
WORD scanCode
=
0
;
DWORD flags
=
0
;
if
(
key
==
"alt"
)
{
scanCode
=
0x38
;
flags
=
KEYEVENTF_EXTENDEDKEY
;
}
else
if
(
key
==
"ctrl"
)
{
scanCode
=
0x1D
;
flags
=
KEYEVENTF_EXTENDEDKEY
;
}
else
if
(
key
==
"shift"
)
{
scanCode
=
0x2A
;
}
else
{
char
c
=
key
.
toUpper
(
)
.
toStdString
(
)
[
0
]
;
scanCode
=
MapVirtualKeyA
(
c
,
MAPVK_VK_TO_VSC
)
;
}
input
.
ki
.
wScan
=
scanCode
;
input
.
ki
.
dwFlags
=
KEYEVENTF_SCANCODE
|
flags
;
if
(
release
)
{
input
.
ki
.
dwFlags
|=
KEYEVENTF_KEYUP
;
}
SendInput
(
1
,
&
input
,
sizeof
(
INPUT
)
)
;
}
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|