SendInput () нажатие кнопки запуска при отправке '[' ?? C ++

0

Im делает программу, в которой c++ автоматически нажимает клавиши на клавиатуре для меня. Я сделал это с каждой клавишей на клавиатуре. Он отлично работает ЗА ИСКЛЮЧЕНИЕМ, когда я пытаюсь использовать квадратные скобки '['. Если я скажу компьютеру распечатать квадратную скобку, он печатает квадратную скобку, как ожидалось, но также нажимает кнопку запуска окна, поэтому открывает меню пуска? После некоторой отладки я обнаружил, что начальное меню появилось только после того, как функция SendInput использовалась, чтобы ОТПРАВИТЬ КЛЮЧ, а не когда она была нажата. Поэтому мой вопрос: ПОЧЕМУ это происходит? PS Прежде чем кто-нибудь спросит, мой код на 100% правильный для каждого ключа, поэтому я знаю метод, который я использую.

ip.ki.wVk = VK_OEM_4; // this is the '[' key
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT)); // the key has been pressed

ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT)); // the key is released, THE START MENU POPS UP!
  • 0
    Вы используете WinAPI? И, может быть, вы должны поставить событие нажатия клавиши тоже, Windows нуждается в этом для отпускания ключа
  • 0
    Это капризы нажатия клавиш, вы легко станете жертвой состояния клавиатуры. Нажатие Ctrl + [является способом для генерации управляющего кода Escape. И Ctrl + Escape активирует меню Пуск. Что-то вроде того.
Показать ещё 1 комментарий
Теги:
visual-c++
virtual-keyboard

1 ответ

2
Лучший ответ

Я не могу воспроизвести это, вот мой минимальный код:

#include <Windows.h>

int main() {
    INPUT ip = {0};

    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk = VK_OEM_4;

    Sleep(2000);

    SendInput(1, &ip, sizeof ip);

    ip.ki.dwFlags = KEYEVENTF_KEYUP;

    // Note: Adding some kind of delay here might be a good idea.

    SendInput(1, &ip, sizeof ip);

    return 0;
}

Убедитесь, что это работает для вас, чтобы узнать, является ли проблема с вашей программой или какой-то проблемой раскладки клавиатуры.

Это правильно нажимает [ на моем ПК и не открывает меню "Пуск"), но обратите внимание, что это зависит от сопоставления раскладки клавиатуры VK_OEM_4 с [ что может быть не так на некоторых макетах. Вы можете использовать VkKeyScanEx для перевода символа в код виртуального ключа.

Некоторые догадки о том, почему ваша программа ведет себя так, как вы описали: возможно, вы не обнуляете свою структуру INPUT= {0} или memset), и она содержит некоторые значения мусора, или вы случайно моделируете какую-то комбинацию клавиш, которая открывается стартовое меню, или, возможно, в вашем коде есть иная ошибка, но это невозможно сказать, потому что вы не показали полный пример, есть много возможностей.

Кроме того, если вы хотите отправлять символы, использование значений Unicode может быть более переносимым:

#include <Windows.h>

int main() {
    INPUT ip = {0};

    ip.type = INPUT_KEYBOARD;
    ip.ki.dwFlags = KEYEVENTF_UNICODE;
    ip.ki.wScan = 0x5B; // unicode value for '['

    Sleep(2000);

    SendInput(1, &ip, sizeof ip);

    return 0;
}

Это будет работать независимо от раскладки клавиатуры, но технически немного отличается от симуляции нажатия клавиши, поэтому использование этого зависит от того, что именно вы пытаетесь сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню