С/C++

slaz1x

Новичок
Автор темы
3
0
1. Как сделать так, чтобы клавиши alt и ctrl зажимались в игре?(все остальные клавиши зажимаются, в том числе и shift).
Пробовал уже через VKcode, KEYEVENTF_EXTENDEDKEY, ничего не помогло

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; // Скан-код для Alt
}
else if (key == "ctrl") {
scanCode = 0x1D; // Скан-код для Ctrl
}
else if (key == "shift") {
scanCode = 0x2A; // Скан-код для Shift
}
{
// Преобразуем символ в верхний регистр и получаем его скан-код
char c = key.toUpper().toStdString()[0];
scanCode = MapVirtualKeyA(c, MAPVK_VK_TO_VSC); // Преобразование символа в скан-код
}

input.ki.wScan = scanCode;
input.ki.dwFlags = KEYEVENTF_SCANCODE; // Используем SCANCODE

// Если клавиша не должна быть отпущена, отправляем её как нажатую
if (!release) {
input.ki.dwFlags &= ~KEYEVENTF_KEYUP; // Нажатие клавиши
}
else {
input.ki.dwFlags |= KEYEVENTF_KEYUP; // Отпускание клавиши
}

// Отправка события
SendInput(1, &input, sizeof(INPUT));
}[/CODE]
 

Receiver

leet-cheats 👑
Модератор
636
940
Проблема, с которой вы столкнулись, связана с тем, что клавиши Alt и Ctrl являются модификаторами, и их обработка в Windows отличается от обработки обычных клавиш. Для корректной эмуляции нажатия этих клавиш необходимо использовать правильные виртуальные коды (VK) и флаги. Для клавиш-модификаторов (Alt, Ctrl, Shift) используются специальные константы: VK_MENU (для Alt), VK_CONTROL (для Ctrl) и VK_SHIFT (для Shift).

Вот исправленный и улучшенный вариант вашей функции:
C++:
#include <windows.h>
#include <QString>

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.
 
  • Ха-ха
  • Грустно
  • Нравится
Реакции: Musaigen, pastow и lpk)))

slaz1x

Новичок
Автор темы
3
0
Проблема, с которой вы столкнулись, связана с тем, что клавиши Alt и Ctrl являются модификаторами, и их обработка в Windows отличается от обработки обычных клавиш. Для корректной эмуляции нажатия этих клавиш необходимо использовать правильные виртуальные коды (VK) и флаги. Для клавиш-модификаторов (Alt, Ctrl, Shift) используются специальные константы: VK_MENU (для Alt), VK_CONTROL (для Ctrl) и VK_SHIFT (для Shift).

Вот исправленный и улучшенный вариант вашей функции:
C++:
#include <windows.h>
#include <QString>

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

Активный
196
65
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));
}