Лабораторная работа: Перехват и фильтрация информации с использованием системных перехватчиков

Цель работы

Изучить методику установки и снятия системных перехватчиков для эффективной реакции программы на действия пользователя.

Список используемых системных вызовов

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

Вывод: изучили методику установки и снятия системных перехватчиков для эффективной реакции программы на действия пользователя.

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

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