2010-09-30 2 views
2

Я хотел бы получить состояние ключей Ctrl в том месте, где у меня нет формы.WinForms Извлечение состояния клавиатуры без формы/UserControl

Обычно для получения состояния ключа я бы использовал события Control_KeyDown/KeyUp. Однако код, который должен знать, нажат ли Ctrl, находится вне любой формы. Отображается форма, но код предполагается не, чтобы зависеть от этой формы, но сам определял состояние ключа.

Наверняка есть способ сделать это, только мне не удается найти его в Google.

Обратите внимание, что хотя код не имеет «иметь» доступную форму, это все еще приложение WinForms, поэтому, возможно, инфраструктура предоставляет мне некоторый класс/объект для достижения этой цели.

фон:

Во время фазы запуска приложения, я хочу один шаг, чтобы вести себя differntly, если клавиша Ctrl нажата в данный момент. На этапе запуска отображается заставка, но код запуска не знает об этом. Вместо этого он сообщает о прогрессе в обратном вызове и этот обратный вызов обновляет заставку.

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

+0

Означает ли это, что ваше приложение должно знать, если Ctrl нажата, независимо, какое приложение является активным один? Итак, если вы работаете в любой программе и нажимаете Ctrl, вы хотите, чтобы ваша программа ее поймала? В этом случае вы используете клавиатурный крючок. Если вы подтвердите это, я могу дать вам несколько указателей. –

+0

@ Øyvind: Нет необходимости замечать Ctrl, если другое приложение находится впереди. На самом деле было бы даже лучше, если Ctrl не зарегистрирован * в этом случае (см. Мое обновление о предыстории моего вопроса). – chiccodoro

ответ

10

Вы можете использовать статический метод Control под названием ModifierKeys

Control.ModifierKeys on MSDN

например:

if (Control.ModifierKeys == Keys.Control) 
{ 
    //... 
} 
+0

Я пробовал это пару дней назад, и это не сработало, потому что на этом этапе (инициализация с заставкой) цикл событий еще не запущен. (См. Также комментарий к testalino). Теперь заставка запускается в контуре сообщений, и решение работает. – chiccodoro

3

Я сделал точно, что совсем недавно:

static class NativeMethods 
    { 
     public static bool IsControlKeyDown() 
     { 
      return (GetKeyState(VK_CONTROL) & KEY_PRESSED) != 0; 
     } 
     private const int KEY_PRESSED = 0x8000; 
     private const int VK_CONTROL = 0x11; 
     [System.Runtime.InteropServices.DllImport("user32.dll")] 
     static extern short GetKeyState(int key); 
    } 

Для проверки кода создайте новое консольное приложение и использовать следующий основной метод:

static void Main(string[] args) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      Console.WriteLine(NativeMethods.IsControlKeyDown()); 
      System.Threading.Thread.Sleep(100); 
     } 
    } 
+0

Спасибо, хорошо выглядит. Есть ли не-родной способ? – chiccodoro

+0

Пару дней назад я не мог найти какие-либо неместные версии. – testalino

+0

@testalino: Я скопировал и вставил ваш код и добавил вызов IsControlKeyDown(), но он вернул false, даже если я нажму обе клавиши Ctrl. – chiccodoro

0

вы не можете просто поймать Ctrl нажимается на форму, которая отображается :, так как кажется, что эта форма также является частью приложения и передает клик на «бесформенную» часть кода, используя событие, которое может вызывать форма.

Я мог бы неправильно понять, что вы здесь, но, по крайней мере, это вариант.

+0

Да, я тоже думаю об этом подходе. Однако в моем случае он вводит зависимость, которую я бы предпочел предотвратить (см. Обновление по моему вопросу). – chiccodoro

Смежные вопросы