HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 16.02.2025, 18:00
Receiver
Постоянный
Регистрация: 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.
 
Ответить с цитированием

  #2  
Старый 17.02.2025, 00:03
slaz1x
Новичок
Регистрация: 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
 
Ответить с цитированием

  #3  
Старый 17.02.2025, 16:55
pastow
Участник форума
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.