none
Управление индикаторами NumLock, CapsLock, ScrollLock клавиатуры RRS feed

  • Вопрос

  • Необходимо программно включать и отключать индикаторы клавиатуры.

    Пробовал так:
       SendKeys.Send("{CAPSLOCK}");
       SendKeys.Send("{NUMLOCK}");
       SendKeys.Send("{SCROLLLOCK}");
    но индикаторы не загорались.

    Еще пробовал подключать библиотеку "user32.dll" и использовать ее методы
          [DllImport("user32.dll", CharSet=CharSet.Auto,
          ExactSpelling=true, CallingConvention=CallingConvention.Winapi)]
          public static extern bool SetKeyboardState( byte[] keys );

          [DllImport("user32.dll", CharSet=CharSet.Auto,
          ExactSpelling=true, CallingConvention=CallingConvention.Winapi)]
          public static extern bool GetKeyboardState( byte[] keys );
    но безуспешно, хотя при включении клавиши CapsLock включался верхний регистр, но индикатор не загорался.

    Версия фреймворка не старше 2.0. Платформа Windows XP SP2.
    • Перемещено I.Vorontsov 29 декабря 2009 г. 12:52 (От:Visual C#)
    • Перемещено SachinW 1 октября 2010 г. 22:02 MSDN Forums Consolidation (От:Начинающие разработчики)
    29 октября 2009 г. 18:41

Ответы

  • Такая реализация  должна работать:

            private const byte VK_SCROLL = 0x91;
            private const byte VK_NUMLOCK = 0x90;
            private const byte VK_CAPITAL = 0x14;

            private const uint KEYEVENTF_KEYUP = 0x2;


            [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
            static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

            [DllImport("user32.dll", EntryPoint = "GetKeyState", SetLastError = true)]
            static extern short GetKeyState(uint nVirtKey);
            //-------------------------------------------------------Scroll
            public static void SetScrollLockKey(bool newState)
            {
                bool scrollLockSet = GetKeyState(VK_SCROLL) != 0;
                if (scrollLockSet != newState)
                {
                    keybd_event(VK_SCROLL, 0, 0, 0);
                    keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0);
                }
            }

            public static bool GetScrollLockState()
            {
                return GetKeyState(VK_SCROLL) != 0;
            }
           //-------------------------------------------------------NUM
            public static void SetNumLockKey(bool newState)
            {
                bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
                if (scrollLockSet != newState)
                {
                    keybd_event(VK_NUMLOCK, 0, 0, 0);
                    keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0);
                }
            }

            public static bool GetNumLockState()
            {
                return GetKeyState(VK_NUMLOCK) != 0;
            }
            //-------------------------------------------------------Caps
            public static void SetCapsLockKey(bool newState)
            {
                bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
                if (scrollLockSet != newState)
                {
                    keybd_event(VK_CAPITAL, 0, 0, 0);
                    keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);
                }
            }

            public static bool GetCapsLockState()
            {
                return GetKeyState(VK_CAPITAL) != 0;
            }
            //-------------------------------------------------------

    При использовании фреймворка старше 2.0 можно использовать Console со свойствами CapsLock Numberlock, будет ли Console.CapsLock Console.Numberlock  именно в 2.0 точно не знаю..Scroll там нет..Так что пользуйтесь приведённым выше методом;)
    • Предложено в качестве ответа I.Vorontsov 30 октября 2009 г. 8:45
    • Помечено в качестве ответа ShirokovAE 30 октября 2009 г. 20:48
    30 октября 2009 г. 8:45

Все ответы

  • Такая реализация  должна работать:

            private const byte VK_SCROLL = 0x91;
            private const byte VK_NUMLOCK = 0x90;
            private const byte VK_CAPITAL = 0x14;

            private const uint KEYEVENTF_KEYUP = 0x2;


            [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
            static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

            [DllImport("user32.dll", EntryPoint = "GetKeyState", SetLastError = true)]
            static extern short GetKeyState(uint nVirtKey);
            //-------------------------------------------------------Scroll
            public static void SetScrollLockKey(bool newState)
            {
                bool scrollLockSet = GetKeyState(VK_SCROLL) != 0;
                if (scrollLockSet != newState)
                {
                    keybd_event(VK_SCROLL, 0, 0, 0);
                    keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0);
                }
            }

            public static bool GetScrollLockState()
            {
                return GetKeyState(VK_SCROLL) != 0;
            }
           //-------------------------------------------------------NUM
            public static void SetNumLockKey(bool newState)
            {
                bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
                if (scrollLockSet != newState)
                {
                    keybd_event(VK_NUMLOCK, 0, 0, 0);
                    keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0);
                }
            }

            public static bool GetNumLockState()
            {
                return GetKeyState(VK_NUMLOCK) != 0;
            }
            //-------------------------------------------------------Caps
            public static void SetCapsLockKey(bool newState)
            {
                bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
                if (scrollLockSet != newState)
                {
                    keybd_event(VK_CAPITAL, 0, 0, 0);
                    keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);
                }
            }

            public static bool GetCapsLockState()
            {
                return GetKeyState(VK_CAPITAL) != 0;
            }
            //-------------------------------------------------------

    При использовании фреймворка старше 2.0 можно использовать Console со свойствами CapsLock Numberlock, будет ли Console.CapsLock Console.Numberlock  именно в 2.0 точно не знаю..Scroll там нет..Так что пользуйтесь приведённым выше методом;)
    • Предложено в качестве ответа I.Vorontsov 30 октября 2009 г. 8:45
    • Помечено в качестве ответа ShirokovAE 30 октября 2009 г. 20:48
    30 октября 2009 г. 8:45
  • Спасибо, помогло.

    Только для того, чтобы состояние индикатора поменялось нужно вызвать метод Set 2 раза - с параметром true, а потом с false:

    SetCapsLockKey(true);
    SetCapsLockKey(false);

    Что касается фреймворка 2.0, то, да, класс Console в нем имеется.
    30 октября 2009 г. 20:51
  • Вы можете сделать не только таким образом, не обязательно делать вызов с true false..Сделайте так как вам удобно..Здесь просто приведён пример возможной реализации..
    1 ноября 2009 г. 17:17