Цель работы
Изучить методику установки и снятия системных перехватчиков
для эффективной реакции программы на действия пользователя.
Список используемых системных вызовов
SetWindowsHookEx, UnhookWindowsHookEx, CallNextHookEx
Методические
указания
Для перехвата оконных сообщений, системных сообщений,
нажатий на клавиатуру, событий изменения положения и размера окна и т. п.
используются системные перехватчики. Системный перехватчик можно установить на
выбранную нить или на все нити текущего рабочего стола.
Для установки системного перехватчика используется функция SetWindowsHookEx. Параметр idHook используется для выбора типа
перехватчика. Параметр dwThreadId
задает идентификатор нити, на которую устанавливается перехватчик. Если он
равен нулю, то перехватчик устанавливается на все нити. Функция перехватчика
(параметр lpfn) в этом случае
должна находиться в DLL,
а параметр hMod должен содержать
дескриптор библиотеки. Функция возвращает дескриптор на объект перехватчика.
Внутри перехватчика должна вызываться функция CallNextHookEx для обеспечения цепочки вызова
перехватчиков. Вызов этой функции не обязателен, но настоятельно рекомендован.
Если не вызывать эту функцию, то все перехватчики, установленные ранее, не
получат управление.
Для отключения перехватчика используется функция UnhookWindowsHookEx. Параметр hhk должен содержать закрываемый дескриптор
системного перехватчика.
Задания
11. Разработать программу,
выводящую на экран текстовое сообщение при отсутствии движений мышью в течение
1 минуты.
Листинг программы.
laba7.cpp
#include
<stdio.h>
#include
<windows.h>
#include
<conio.h>
typedef
bool (__stdcall *MOUSEHOOKFCT)();
HINSTANCE
DllHandle;
void main()
{
//подключаем
системную библиотеку с фильтрами хука WH_MOUSE
DllHandle=LoadLibrary("mydll.dll");
if (DllHandle!=NULL)
{
MOUSEHOOKFCT InstHook =
reinterpret_cast<MOUSEHOOKFCT>
(GetProcAddress(DllHandle,
"InstallMouseHook"));
if(!InstHook())
printf("\nCannot
install hook mouse!!!\n");
else
printf("\nHook
mouse is installed!!!\n");
printf("\nFor exit
press any key!!!\n");
while(!getchar());
//getch();
MOUSEHOOKFCT RemHook =
reinterpret_cast<MOUSEHOOKFCT>
(GetProcAddress(DllHandle,
"RemoveMouseHook"));
if(!RemHook())
printf("\nCannot
remove mouse hook!!!\n ");
else
printf("\nMouse
hook is removed!!!\n ");
FreeLibrary(DllHandle);
getch();
}
else
printf("\nerror
load Dll\n");
}
mydll.cpp
//
mydll.cpp : Defines the entry point for the DLL application.
//
#include
"stdafx.h"
#include
"dll_mouse.h"
#include
<windows.h>
#include
<math.h>
//#pragma hdrstop
// экспортируемые функции
// объявление функции обратного вызова
LRESULT
CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam);
//
глобальные переменные
HHOOK
HookHandle;
HINSTANCE
DllInstance;
bool
IsInRect = false;
bool
flg=true;
DWORD begintime,curtime;
POINT
MousePos,CurMousePos;
BOOL
beg=false;
MOUSEHOOKSTRUCT
moustec,mous;
MSG *ms;
//---------------------------------------------------------------------------
BOOL
APIENTRY DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
DllInstance = hModule;
return TRUE;
}
//---------------------------------------------------------------------------
bool
InstallMouseHook()
{
MousePos.x = 0;
MousePos.y = 0;
curtime = 0;
begintime = 0;
HookHandle =
SetWindowsHookEx(WH_GETMESSAGE,
reinterpret_cast<HOOKPROC>(GetMsgProc),
DllInstance, 0);
if(HookHandle == NULL)
return false;
else
return true;
}
//---------------------------------------------------------------------------
bool
RemoveMouseHook()
{
if(UnhookWindowsHookEx(HookHandle)
== 0)
return false;
else
return true;
}
//---------------------------------------------------------------------------
LRESULT
CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
if(code < 0)
return
CallNextHookEx(HookHandle, code, wParam, lParam);
curtime = GetTickCount();
ms = (PMSG)lParam;
if(MousePos.x == ms->pt.x
&& MousePos.y == ms->pt.y )
{
//если
курсор мыши неподвижен засекаем этот момент времени
if(beg == false)
{
begintime =
curtime;
beg = true;
}
//если курсор
стоит уже УКАЗАННОЕ количество сек, то вbIводим сообщение
if( ( (curtime-begintime)/1000 ==20)
&& ( fmod( (curtime-begintime),1000)==0.0))
{
MousePos.x =
0;
MousePos.y =
0;
beg = false;
begintime
= 0;
::MessageBox(NULL,"Вы не двигаете мышкой уже 20
сек","ОК",MB_OK);
// return
CallNextHookEx(HookHandle, code, wParam, lParam);
}
}
else
{
//если
мы двинули мышкой, то сбрасываем начальные параметры
beg = false;
}
MousePos.x = ms->pt.x;
MousePos.y = ms->pt.y;
return CallNextHookEx(HookHandle,
code, wParam, lParam);
}
dll_mouse.h
#ifndef
_DLLTEST_H_
#define
_DLLTEST_H_
#include
<iostream.h>
#include
<stdio.h>
#include
<windows.h>
//extern
"C" __declspec(dllexport) LRESULT CALLBACK MousedProc(int
nCode,WPARAM wParam,LPARAM lParam);
extern
"C" __declspec(dllexport) bool InstallMouseHook();
extern
"C" __declspec(dllexport) bool RemoveMouseHook();
//BOOL
WINAPI DLLEntryPoint(HMODULE hModule,DWORD fdwReason, LPVOID lpvReserved);
#endif
Вывод: изучили методику установки и снятия
системных перехватчиков для эффективной реакции программы на действия
пользователя.
Комментариев нет:
Отправить комментарий