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

В данном примере рассмотрим блокировку следующих сочетаний клавиш:
СочетаниеОписание
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);
}

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


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!