ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   С/C++ (https://forum.antichat.xyz/showthread.php?t=1531195)

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

Цитата:

Сообщение от 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

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
)
)
;
}



Время: 12:39