2010-07-05 4 views
2

ANSWER: Для этого метода нет эквивалентного управления. Однако хороший пример управляемого кода API можно найти по адресу pinvoke.net.Есть ли собственный метод .NET или эквивалент GetKeyboardState для пользователя user32.dll?

Привет всем

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

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

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

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

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

Есть ли собственный метод .NET или эквивалент GetKeyboardState для user32.dll?

ответ

1

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

+0

Спасибо Донни. Control.ModifierKeys предоставит мне клавиши control/shift/alt, но не любую буквенную клавишу, которая может быть нажата или не нажата. Я думаю, вы правы в том, что нужно p/вызвать GetKeyboardState или GetKeyState. Подтверждает мои подозрения - спасибо. –

0

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

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

+0

Привет Сэм. Я не думаю, что PreviewKeyDown сможет мне помочь. Я пытаюсь получить состояние клавиатуры изнутри Program.Main, прежде чем какие-либо формы были созданы. Насколько мне известно, на самом деле у меня нет события PreviewKeyDown для привязки. Совет по клавишам акселератора оценен, но я думаю, что я поеду с p/invoking user32.dll, который я уже знаю, как это сделать - в отличие от борьбы с клавишами ускорителя, что является для меня новой концепцией. –

+0

Документация GetKeyboardState гласит, что «статус изменяется как поток, удаляет сообщения клавиатуры из очереди сообщений». Обратите внимание, что легко удалить сообщение клавиатуры и указать очередь сообщений.GetKeyboardState требует наличия очереди сообщений. Ваш комментарий «до того, как какие-либо формы были созданы» - это еще один способ сказать, что очереди сообщений еще нет, но если GetKeyboardState работает, то есть очередь сообщений. Если GetKeyboardState работает, тогда есть также цикл сообщений, который читает сообщения клавиатуры. –

+0

Wew! Я не знал, что здесь существует ограничение на размер комментариев. Таким образом, документированный способ сделать то, что вы хотите сделать, - это сделать это в обработчике сообщений. Вы можете использовать Spy ++, чтобы определить, из каких процессов вы получаете сообщение с клавиатуры, с которого вы получаете GetKeyboardState. –