Мое приложение синтезирует нажатия клавиш в других приложениях с помощью SendInput
. Это почти работает, за исключением того, что из-за обстоятельств, которые я не могу изменить, левая клавиша Windows всегда будет физически нажата при отправке ввода. Это означает, что, например, если отправляемым нажатием клавиши является, например, клавиша «d», то Windows воспринимает нажатие клавиши как комбинацию клавиш Win + D и отображает рабочий стол, а нажатие клавиши «d» никогда не достигает назначенной цели.
В документации упоминается эта проблема, но разочаровывающе расплывчато в том, как ее исправить (выделено мной):
Эта функция не сбрасывает текущее состояние клавиатуры. Любые клавиши, которые уже были нажаты при вызове функции, могут мешать событиям, которые генерирует эта функция. Чтобы избежать этой проблемы, проверьте состояние клавиатуры с помощью функции GetAsyncKeyState
и, при необходимости, исправьте .
Как мне "исправить по необходимости"?
Я пытался использовать SetKeyboardState
, чтобы отключить состояние клавиатуры клавиши VK_LWIN
, после первого присоединения моего потока к потоку окна, которому я посылаю нажатия клавиш (с помощью AttachThreadInput
), но похоже, это никак не влияет на поведение.
Я также пытался вставить событие KEYEVENTF_KEYUP
в начале ввода, который я посылаю с SendInput
, но это вызывает всплывающее меню «Пуск» и захватывает фокус, что, очевидно, недопустимо.
Как правильно обращаться с нажатой клавишей с логотипом Windows при вызове SendInput?
EDIT:
Согласно @ ответу Брайана Я могу предотвратить вмешательство ключа выигрыша в мой код, установив низкоуровневый трюк, который перехватывает события нажатия клавиши win-key.
Это, однако, имеет нежелательный эффект, что ключ Windows теперь полностью отключен. Я могу в некотором роде предусмотреть какое-то решение этой проблемы, где я сохраняю информацию о состоянии всех клавиш в моем брелке и моделирую нажатия клавиш Windows при нажатии других клавиш, в зависимости от того, являются ли они теми, которые я использую. симуляция, но это звучит как взломать для меня. В качестве альтернативы, я мог бы использовать свой keyhook для эмуляции важных сочетаний клавиш Windows.
Но из документации следует, что все должно работать намного проще. Решение Брайана состоит в том, чтобы в первую очередь не дать клавише «выиграть» перейти в нажатое состояние. Но в документации говорится, что вы должны быть в состоянии проверить, нажата ли она позже, и исправить ее, если она есть.
Возможно ли это сделать?