Справочник по C#

    Исходники по языку программирования CSharp

    Блокировка ctrl-alt-delete, alt-tab, Пуск и других сочетаний клавиш: Справочник по C#

    /
    /
    /
    147 Views


    В данном примере рассмотрим блокировку следующих сочетаний клавиш:
    СочетаниеОписание
    ALT+TabДелает активным другое выполняющееся приложение (бывшее активным непосредственно перед текущим). Для переключения на другие приложения нажимайте клавишу «Tab» несколько раз, не отпуская клавишу «ALT» . При этом в центре экрана появится панель, показывающая все запущенные приложения, если вы отпустите клавишу «ALT», то выбранное приложение, станет активным. В случае если выбранное приложение свёрнуто в панель задач, то при использовании «ALT+Tab», это приложение восстанавливается (разворачивается).
    Alt+Space (пробел)Открытие системного меню окна. С помощью него можно закрывать, сворачивать, разворачивать, перемещать и изменять размер окна без помощи мыши.
    Ctrl+Shift+EscОткрытие окна «Диспетчер задач»
    Ctrl+Alt+DeleteОткрытие окна «Диспетчер задач» или «Безопасность Windows»
    WinОткрытие меню «Пуск»

          Создайте проект Windows Form в Microsoft Visual Studio и добавьте на форму 10 раз компонент «Button», разделив на две колонки. В первом столбце у вас будут кнопки для блокировки сочетания клавиш, а во втором для разблокировки соответственно. У вас получится представленная ниже форма.

    Нажмите клавишу «F7», вы перейдете в листинг главной формы. Добавьте приведенный ниже код.

    private const int WH_KEYBOARD_LL = 13;//Keyboard hook;
    
    //Keys data structure
    [System.Runtime.InteropServices.StructLayout(
    System.Runtime.InteropServices.LayoutKind.Sequential)]
    private struct KBDLLHOOKSTRUCT
    {
    public Keys key;
    }
    
    //Using callbacks
    private LowLevelKeyboardProcDelegate m_callback;
    private LowLevelKeyboardProcDelegate m_callback_1;
    private LowLevelKeyboardProcDelegate m_callback_2;
    private LowLevelKeyboardProcDelegate m_callback_3;
    private LowLevelKeyboardProcDelegate m_callback_4;
    private LowLevelKeyboardProcDelegate m_callback_5;
    private LowLevelKeyboardProcDelegate m_callback_6;
    private LowLevelKeyboardProcDelegate m_callback_7;
    
    //переменные для разблокировки клавиатуры
    private IntPtr m_hHook;
    private IntPtr m_hHook_1;
    private IntPtr m_hHook_2;
    private IntPtr m_hHook_3;
    private IntPtr m_hHook_4;
    private IntPtr m_hHook_5;
    private IntPtr m_hHook_6;
    private IntPtr m_hHook_7;
    
    //Установка перехвата клавиатуры
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(
    int idHook, LowLevelKeyboardProcDelegate lpfn, IntPtr hMod, int dwThreadId);
    
    //Разблокировка клавиатуры
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    
    //Hook handle
    [System.Runtime.InteropServices.DllImport("Kernel32.dll", SetLastError = true)]
    private static extern IntPtr GetModuleHandle(IntPtr lpModuleName);
    
    //Вызов следующего хука
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr CallNextHookEx(
    IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    
    //Захват winkey
    public IntPtr LowLevelKeyboardHookProc_win(
    int nCode, IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.RWin ||
    objKeyInfo.key == Keys.LWin)
    {
    return (IntPtr)1;//winkey
    }
    }
    return CallNextHookEx(m_hHook_1, nCode, wParam, lParam);
    }
    
    //Захват delete
    public IntPtr LowLevelKeyboardHookProc_del(
    int nCode, IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.Delete)
    {
    return (IntPtr)1;//delete
    }
    }
    return CallNextHookEx(m_hHook_3, nCode, wParam, lParam);
    }
    
    //Захват control
    public IntPtr LowLevelKeyboardHookProc_ctrl(
    int nCode, IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.RControlKey ||
    objKeyInfo.key == Keys.LControlKey)
    {
    return (IntPtr)1;//control
    }
    }
    return CallNextHookEx(m_hHook_2, nCode, wParam, lParam);
    }
    
    //Захват alt
    public IntPtr LowLevelKeyboardHookProc_alt(
    int nCode, IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.Alt)
    {
    return (IntPtr)1;//alt
    }
    }
    return CallNextHookEx(m_hHook_4, nCode, wParam, lParam);
    }
    
    //Блокировка alt+tab
    public IntPtr LowLevelKeyboardHookProc_alt_tab(
    int nCode, IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.Alt ||
    objKeyInfo.key == Keys.Tab)
    {
    return (IntPtr)1;//alt+tab
    }
    }
    return CallNextHookEx(m_hHook, nCode, wParam, lParam);
    }
    
    //Блокировка alt+space
    public IntPtr LowLevelKeyboardHookProc_alt_space(
    int nCode, IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.Alt ||
    objKeyInfo.key == Keys.Space)
    {
    return (IntPtr)1;//alt+space
    }
    }
    return CallNextHookEx(m_hHook_5, nCode, wParam, lParam);
    }
    
    //Блокировка control+shift+escape
    public IntPtr LowLevelKeyboardHookProc_control_shift_escape(int nCode,
    IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.LControlKey ||
    objKeyInfo.key == Keys.RControlKey ||
    objKeyInfo.key == Keys.LShiftKey ||
    objKeyInfo.key == Keys.RShiftKey ||
    objKeyInfo.key == Keys.Escape)
    {
    return (IntPtr)1;//control+shift+escape
    }
    }
    return CallNextHookEx(m_hHook_6, nCode, wParam, lParam);
    }
    
    //Блокировка control+alt+del
    public IntPtr LowLevelKeyboardHookProc_control_alt_del(int nCode,
    IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    KBDLLHOOKSTRUCT objKeyInfo =
    (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(
    lParam, typeof(KBDLLHOOKSTRUCT));
    if (objKeyInfo.key == Keys.LControlKey ||
    //objKeyInfo.key == Keys.RControlKey ||
    //objKeyInfo.key == Keys.Control ||
    //objKeyInfo.key == Keys.ControlKey ||
    objKeyInfo.key == Keys.Alt ||
    //objKeyInfo.key == Keys.LMenu ||
    //objKeyInfo.key == Keys.Menu ||
    //objKeyInfo.key == Keys.RMenu ||
    objKeyInfo.key == Keys.Delete)
    {
    return (IntPtr)1;//control+alt+del
    }
    }
    return CallNextHookEx(m_hHook_7, nCode, wParam, lParam);
    }
    
    private delegate IntPtr LowLevelKeyboardProcDelegate(
    int nCode, IntPtr wParam, IntPtr lParam);
    
    //Настройки хука
    public void SetHook()
    {
    m_callback = LowLevelKeyboardHookProc_win;
    m_callback_1 = LowLevelKeyboardHookProc_alt_tab;
    m_callback_2 = LowLevelKeyboardHookProc_ctrl;
    m_callback_3 = LowLevelKeyboardHookProc_del;
    m_callback_4 = LowLevelKeyboardHookProc_alt;
    m_callback_5 = LowLevelKeyboardHookProc_alt_space;
    m_callback_6 = LowLevelKeyboardHookProc_control_shift_escape;
    m_callback_7 = LowLevelKeyboardHookProc_control_alt_del;
    
    //Настройки перехвата
    m_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback,
    GetModuleHandle(IntPtr.Zero), 0);
    m_hHook_1 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_1,
    GetModuleHandle(IntPtr.Zero), 0);
    m_hHook_2 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_2,
    GetModuleHandle(IntPtr.Zero), 0);
    m_hHook_3 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_3,
    GetModuleHandle(IntPtr.Zero), 0);
    m_hHook_4 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_4,
    GetModuleHandle(IntPtr.Zero), 0);
    m_hHook_5 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_5,
    GetModuleHandle(IntPtr.Zero), 0);
    m_hHook_6 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_6,
    GetModuleHandle(IntPtr.Zero), 0);
    m_hHook_7 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_7,
    GetModuleHandle(IntPtr.Zero), 0);
    }
    
    //Блокировка сочетаний группой
    public void Unhook()
    {
    UnhookWindowsHookEx(m_hHook);
    UnhookWindowsHookEx(m_hHook_1);
    UnhookWindowsHookEx(m_hHook_2);
    UnhookWindowsHookEx(m_hHook_3);
    UnhookWindowsHookEx(m_hHook_4);
    UnhookWindowsHookEx(m_hHook_5);
    UnhookWindowsHookEx(m_hHook_6);
    UnhookWindowsHookEx(m_hHook_7);
    }

          Если вы хотите заблокировать перечисленные сочетания клавиш разом, выполните вызов метода «SetHook()», а для разблокировки «Unhook()». Для блокировки по отдельности, приведите ваши компоненты в соответствие с приведенным ниже кодом.

    //Блокировка alt+tab
    private void button1_Click(object sender, EventArgs e)
    {
    m_callback_1 = LowLevelKeyboardHookProc_alt_tab;
    m_hHook_1 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_1,
    GetModuleHandle(IntPtr.Zero), 0);
    }
    //Разблокировка alt+tab
    private void button10_Click(object sender, EventArgs e)
    {
    UnhookWindowsHookEx(m_hHook_1);
    }
    
    //Блокировка alt+space
    private void button5_Click(object sender, EventArgs e)
    {
    m_callback_5 = LowLevelKeyboardHookProc_alt_space;
    m_hHook_5 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_5,
    GetModuleHandle(IntPtr.Zero), 0);
    }
    
    //Разблокировка alt+space
    private void button6_Click(object sender, EventArgs e)
    {
    UnhookWindowsHookEx(m_hHook_5);
    }
    
    //Блокировка control+shift+escape>
    private void button2_Click(object sender, EventArgs e)
    {
    m_callback_6 = LowLevelKeyboardHookProc_control_shift_escape;
    m_hHook_6 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_6,
    GetModuleHandle(IntPtr.Zero), 0);
    }
    
    //Разблокировка control+shift+escape
    private void button9_Click(object sender, EventArgs e)
    {
    UnhookWindowsHookEx(m_hHook_6);
    }
    
    //Блокировка control+alt+del
    private void button4_Click(object sender, EventArgs e)
    {
    m_callback_7 = LowLevelKeyboardHookProc_control_alt_del;
    m_hHook_7 = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback_7,
    GetModuleHandle(IntPtr.Zero), 0);
    }
    
    //Разблокировка control+alt+del
    private void button7_Click(object sender, EventArgs e)
    {
    UnhookWindowsHookEx(m_hHook_7);
    }
    
    //Блокировка winkey
    private void button3_Click(object sender, EventArgs e)
    {
    m_callback = LowLevelKeyboardHookProc_win;
    m_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, m_callback,
    GetModuleHandle(IntPtr.Zero), 0);
    }
    
    //Разблокировка winkey
    private void button8_Click(object sender, EventArgs e)
    {
    UnhookWindowsHookEx(m_hHook);
    }

    Ссылка для скачивания примера: Яндекс.Диск

    Блокировка ctrl-alt-delete, alt-tab, Пуск и других сочетаний клавиш: Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9