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

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

821
0


В данном примере рассмотрим блокировку следующих сочетаний клавиш:

Сочетание Описание
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);
}

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

ЧИТАТЬ ТАКЖЕ:  Нумерация строк в DataGridView: Справочник по C#

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

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь