Есть ли собственный метод.NET или эквивалентный пользователю32.dll GetKeyboardState?

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

всем привет

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

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

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

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

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

Есть ли собственный метод.NET или эквивалентный пользователю32.dll GetKeyboardState?

2 ответа

Решение

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

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

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

Другие вопросы по тегам