визуальный SendInput () нажатие кнопки запуска при отправке ‘[‘ ?? Переполнение стека

Я делаю программу, в которой с ++ автоматически нажимает клавиши на клавиатуре. Я сделал это с каждой клавишей на клавиатуре. Он отлично работает, за исключением случаев, когда я пытаюсь использовать квадратные скобки ‘[‘. Если я скажу компьютеру распечатать квадратную скобку, он распечатает квадратную скобку, как и ожидалось, но также нажмет кнопку запуска Windows, открывая меню запуска? После некоторой отладки я обнаружил, что меню «Пуск» всплыло только после того, как была использована функция 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

Решение

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]