PDA

Просмотр полной версии : С/C++


Receiver
16.02.2025, 18:00
Проблема, с которой вы столкнулись, связана с тем, что клавиши 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.

slaz1x
17.02.2025, 00:03
Проблема, с которой вы столкнулись, связана с тем, что клавиши 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

pastow
17.02.2025, 16:55
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
)
)
;
}