Как я могу отключить ключ Windows в C #? - PullRequest
7 голосов
/ 29 июля 2010

Как отключить или заблокировать кнопку Windows?

Ответы [ 4 ]

4 голосов
/ 12 сентября 2012

Использование оконных хуков намного чище, чем изменение реестра.Кроме того, иногда люди устанавливают собственные персонализированные карты скан-кодов, и их перезапись не очень приятная вещь.

Чтобы использовать функции подключения клавиш Windows, вам нужно DllImport пара функций winapi:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode); 

Довольно полное объяснение и пошаговое руководство можно найти на CodeProject .Вот прямая ссылка на автономный файл класса из этого примера, который делает все (чтобы заставить его скомпилироваться, если вы используете WPF, вам потребуется вручную ссылаться на dll System.Windows.Forms или просто изменитьссылка «System.Windows.Forms.Keys» на System.Windows.Input.Key должна работать).

Не забудьте вызвать UnhookWindowsHookEx () (класс делает это в Dispose ()), чтобы отцепить ваши снимки, или люди будут вас ненавидеть.

4 голосов
/ 02 сентября 2010
    /// <summary>
    /// Security routines related to the Windows Key on a standard personal computer Keyboard
    /// </summary>
    public static class WindowsKey {
        /// <summary>
        /// Disables the Windows Key
        /// </summary>
        /// <remarks>May require the current user to logoff or restart the system</remarks>
        public static void Disable() {
            RegistryKey key = null;
            try {
                key = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Control\\Keyboard Layout", true);
                byte[] binary = new byte[] { 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x03, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x5B, 
                    0xE0, 
                    0x00, 
                    0x00, 
                    0x5C, 
                    0xE0, 
                    0x00, 
                    0x00, 
                    0x00, 
                    0x00 
                };
                key.SetValue("Scancode Map", binary, RegistryValueKind.Binary);
            }
            catch (System.Exception ex) {
                Debug.Assert(false, ex.ToString());
            }
            finally {
                key.Close();
            }
        }

        /// <summary>
        /// Enables the Windows Key
        /// </summary>
        /// <remarks>May require the current user to logoff or restart the system</remarks>
        public static void Enable() {
            RegistryKey key = null;
            try {
                key = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Control\\Keyboard Layout", true);
                key.DeleteValue("Scancode Map", true);
            }
            catch (System.Exception ex) {
                Debug.Assert(false, ex.ToString());
            }
            finally {
                key.Close();
            }
        }
    }
4 голосов
/ 29 июля 2010

Вам нужен крючок для клавиатуры.Начинается где-то так:

 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0);

и продолжается так:

  LRESULT KeyboardProc(...)
  {
     if (Key == VK_SOMEKEY)
    return 1;             // Trap key


    return CallNextHookEx(...); // Let the OS handle it

  }

А для более подробной информации: http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx

1 голос
/ 29 июля 2010

Предполагая, что вы хотите отключить ключ Windows постоянно, а не только когда ваш код находится в фокусе, вы можете сделать это, отредактировав реестр следующим образом:

Чтобы отключить : Добавитьновое значение REG_BINARY , называемое " Карта сканирования " в " HKEY_LOCAL_ MACHINE \ System \ CurrentControlSet \ Control \ Раскладка клавиатуры " со значением данных "000000000000000300000000005BE000005CE000000000"

Чтобы включить : полностью удалите значение" Scancode Map"из реестра.

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