Создание системных ловушек Windows на Borland C++ Builder
Страница 3. Функция ловушки клавиатуры


 

Функция ловушки клавиатуры.

Функция ловушки в общем виде имеет следующий синтаксис:

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam), где:

HookProc - имя функции,

nCode - код ловушки, его конкретные значения определяются типом ловушки,

wParam, lParam - параметры с информацией о сообщении.

В случае нашей задачи функция должна определять состояние клавиш Alt, Ctrl и Shift (нажаты или отпущены). Информация об этом берётся из параметров wParam и lParam (подробности в "Win32 Programmer's Reference" в подразделе "KeyboardProc"). После определения состояния клавиш надо сравнить его со способом переключения языка (определяется в функции входа). Если текущая комбинация клавиш способна переключить язык, то надо выдать звуковой сигнал.

Всё это реализует примерно такой код:

LRESULT CALLBACK KeyboardHook(int nCode,WPARAM wParam,LPARAM lParam)
{ // Ловушка клав. - биканье при перекл. раскладки
if((lParam>>31)&1) // Если клавиша нажата...
switch(wParam)
{// Определяем какая именно
case VK_SHIFT: {iShiftKey=UP; break};
case VK_CONTROL: {iCtrlKey=UP; break};
case VK_MENU: {iAltKey=UP; break};
}
else// Если была отпущена...
switch(wParam)
{// Определяем какая именно
case VK_SHIFT: {iShiftKey=DOWN; break};
case VK_CONTROL: {iCtrlKey=DOWN; break};
case VK_MENU: {iAltKey=DOWN; break};
}
//--------------
switch(KEYBLAY) // В зависимости от способа переключения раскладки
{
case 1: // Alt+Shift
{
if(iAltKey==DOWN && iShiftKey==UP)
{
vfBeep();
iShiftKey=RESET;
}
if(iAltKey==UP && iShiftKey==DOWN)
{
vfBeep();
iAltKey=RESET;
}
((iAltKey==UP && iShiftKey==RESET)||(iAltKey==RESET &&

iShiftKey==UP))
{
iAltKey=RESET;
iShiftKey=RESET;
}
break;
}
//------------------------------------
case 2: // Ctrl+Shift
{
if(iCtrlKey==DOWN && iShiftKey==UP)
{
vfBeep();
iShiftKey=RESET;
}
if(iCtrlKey==UP && iShiftKey==DOWN)
{
vfBeep();
iCtrlKey=RESET;
}
if((iCtrlKey==UP && iShiftKey==RESET)||(iCtrlKey==RESET &&

iShiftKey==UP))
{
iCtrlKey=RESET;
iShiftKey=RESET;
}
}
}

return 0;
}

Звуковой сигнал выдаётся такой небольшой функцией:

void vfBeep()
{// Биканье
MessageBeep(-1);
MessageBeep(-1);// Два раза - для отчётливости
}

 
« Предыдущая статья   Следующая статья »