Существует ли собственный метод .NET или эквивалент GetKeyboardState в user32.dll?

ОТВЕТ. Для этого метода не существует собственного эквивалента. Однако хороший пример API управляемого кода можно найти по адресу pinvoke.net. .

Всем привет

У меня есть приложение, которое принимает флаг для режима трассировки. Режим трассировки включает форму, содержащую текстовое поле. Текстовое поле отображает выходные данные через пользовательский объект TraceListener. Если в командной строке присутствует -t, окно трассировки будет открыто из своего собственного потока с низким приоритетом. Это удобно для консультантов, которые пытаются диагностировать приложение, когда что-то идет не так.

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

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

Я думал, что это должно быть достаточно просто, чтобы определить текущее состояние клавиатуры в .NET, но кажется, что куда бы я ни посмотрел, рекомендуется использовать [DllImport("user32.dll", EntryPoint = "GetKeyboardState", SetLastError = true) ] в качестве метода обнаружения происходящего.

Это все хорошо и хорошо - меня это устраивает. Однако, как правило, я стараюсь убедиться, что использую собственный управляемый код .NET для функций Windows, прежде чем пытаться создать свой собственный.

Существует ли собственный метод .NET или эквивалент GetKeyboardState в user32.dll?


person Daniel Schealler    schedule 05.07.2010    source источник


Ответы (2)


Control.ModiferKeys является статическим свойством Control, в котором в данный момент нажаты клавиши-модификаторы, если таковые имеются. Я ничего не знаю, чтобы получить общее состояние клавиатуры, похоже, что большинство кода P/Invoke либо с GetKeyboardState, либо с GetKeyState для проверки определенных клавиш.

person Donnie    schedule 05.07.2010
comment
Спасибо, Донни. Control.ModifierKeys даст мне клавиши управления/shift/alt, но не любую буквенную клавишу, которую можно нажимать или не нажимать. Я думаю, вы правы в том, что вам нужно p/invoke GetKeyboardState или GetKeyState. Подтверждает мои подозрения - спасибо. - person Daniel Schealler; 07.07.2010

Вы уверены, что в PreviewKeyDownEventArgs нет того, что вам нужно? Если это так, вы можете использовать событие PreviewKeyDown.

Другим вариантом могут быть клавиши быстрого доступа. Функция Windows API может использовать таблицу сочетаний клавиш в ресурсах приложения для сопоставления последовательностей клавиш с командами, где команда — это то же самое, что и пункт меню; вы знаете, сообщение WM_COMMAND. Я знаю, что это легко сделать в MFC с помощью C++, но когда я попытался найти способ сделать это на C#, я заблудился. Если вы можете понять, как использовать клавиши быстрого доступа с помощью C #, это может быть гибким решением.

person Sam Hobbs    schedule 05.07.2010
comment
Привет Сэм. Я не думаю, что PreviewKeyDown сможет мне здесь помочь. Я пытаюсь получить состояние клавиатуры из Program.Main до того, как будут созданы какие-либо формы. Насколько мне известно, на самом деле у меня нет события PreviewKeyDown для привязки. Советы по клавишам-ускорителям приветствуются, но я думаю, что я выберу p/invoking user32.dll, что я уже знаю, как это сделать, в отличие от борьбы с клавишами-ускорителями, что для меня является новой концепцией. - person Daniel Schealler; 07.07.2010
comment
В документации GetKeyboardState говорится, что статус изменяется, когда поток удаляет сообщения клавиатуры из своей очереди сообщений. Обратите внимание, что сообщение с клавиатуры должно быть удалено, и в нем говорится об очереди сообщений. GetKeyboardState требует, чтобы существовала очередь сообщений. Ваш комментарий до того, как были созданы какие-либо формы, — это еще один способ сказать, что очереди сообщений еще нет, но если GetKeyboardState работает, то очередь сообщений есть. Если GetKeyboardState работает, то также существует цикл обработки сообщений, считывающий сообщения клавиатуры. - person Sam Hobbs; 07.07.2010
comment
Вау! Я не знал, что здесь есть ограничение на размер комментариев. Таким образом, задокументированный способ сделать то, что вы хотите сделать, — это сделать это в обработчике сообщений. Вы можете использовать Spy++, чтобы определить, что обрабатывает сообщение клавиатуры, из которого вы получаете GetKeyboardState. - person Sam Hobbs; 07.07.2010