WinForms Получить состояние клавиатуры без формы / UserControl - PullRequest
2 голосов
/ 30 сентября 2010

Я бы хотел получить состояние клавиш Ctrl в месте, где у меня нет формы.

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

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

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

Справка:

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

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

Ответы [ 3 ]

10 голосов
/ 30 сентября 2010

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

Control.ModifierKeys на MSDN

например:

if (Control.ModifierKeys == Keys.Control)
{
    //...
}
3 голосов
/ 30 сентября 2010

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

    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 голосов
/ 30 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...