Я делаю программу, в которой с ++ автоматически нажимает клавиши на клавиатуре. Я сделал это с каждой клавишей на клавиатуре. Он отлично работает, за исключением случаев, когда я пытаюсь использовать квадратные скобки ‘[‘. Если я скажу компьютеру распечатать квадратную скобку, он распечатает квадратную скобку, как и ожидалось, но также нажмет кнопку запуска 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!
Я не могу воспроизвести это, вот мой минимальный код:
#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;
}
Это будет работать независимо от раскладки клавиатуры, но технически немного отличается от симуляции нажатия клавиши, поэтому ее использование зависит от того, что именно вы пытаетесь сделать.
Других решений пока нет …