Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ХУК(искал, но не нашел)

8.0K
28 февраля 2005 года
Keith
8 / / 05.02.2005
Три вопроса:

1. SetWindowsHookEx(WH_GETMESSAGE,...) не вешается на первичный поток, который был создан и сразу приостановлен(CREATE_SUSPENDED). На сколько я понял – это из-за 'WH_GETMESSAGE'. Посоветуйте на что еще можно повесить хук для того, чтобы он работал в 98-XP.

2. Мне нужно, чтобы чужой поток, на который я делаю хук, выполнял определенный код, когда мой поток вызывает UnhookWindowsHookEx(). Как это лучше сделать?

3. Как лучше передать информацию(строка + хэндл) из потока на который поставлен хук в поток, который устанавливал хук? Я так понимаю, что потоку на который вешается хук надо будет передавать свой ThreadId? Как это лучше сделать?

Выслушаю любые мысли. Заранее - большое СПАСИБО.
9.3K
27 марта 2005 года
maxrus
12 / / 28.02.2005
H
//#ifdef HOOKDLL_EXPORTS
#define HOOKDLL_API __declspec(dllexport)
/*#else
#define HOOKDLL_API __declspec(dllimport)
#endif*/

class HOOKDLL_API CHookDll {
public:
CHookDll(void);

};

HOOKDLL_API void DllEntryPoint(DWORD dwReason);
HOOKDLL_API LRESULT MouseHook(int code,WPARAM wParam,LPARAM lParam);
HOOKDLL_API int SetMouseHook(HWND wnd);
HOOKDLL_API BOOL RemoveMouseHook();

struct CShareInfo {
HWND AppWndHandle;
HHOOK OldHookHandle;
HANDLE hm;
CWPSTRUCT mhs;
};

CPP
#include "stdafx.h"
#include "HookDll.h"

#define GlobMapID "Global Mouse Hook Demo {8C8BB695-606F-476A-9D9B-5B023C71EE7A}"

CShareInfo* ShareInfo=NULL;
HANDLE MapHandle=NULL;
PCWPSTRUCT pmhs;
HANDLE hMod;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hMod=hModule;
DllProc=NULL;
DllEntryPoint(DLL_PROCESS_ATTACH);
return true;
}

CHookDll::CHookDll()
{
return;
}

HOOKDLL_API void DllEntryPoint(DWORD dwReason)
{
if ( dwReason==DLL_PROCESS_ATTACH )
{
MapHandle=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(CShareInfo), GlobMapID);
ShareInfo=( CShareInfo* )MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(ShareInfo));
}
if (dwReason==DLL_PROCESS_DETACH)
{
UnmapViewOfFile(ShareInfo);
CloseHandle(MapHandle);
}
}

HOOKDLL_API LRESULT MouseHook(int code,WPARAM wParam,LPARAM lParam)
{
if (code==HC_ACTION)
{
pmhs=PCWPSTRUCT(lParam);
ShareInfo->mhs=*pmhs;
PostMessage(ShareInfo->AppWndHandle,WM_USER,wParam,lParam);
}
return CallNextHookEx(ShareInfo->OldHookHandle,code,wParam,lParam);
}

HOOKDLL_API int SetMouseHook(HWND wnd)
{
if (ShareInfo)
{
ShareInfo->AppWndHandle=wnd;
ShareInfo->OldHookHandle=SetWindowsHookEx(WH_CALLWNDPROC,HOOKPROC(MouseHook),HINSTANCE(hMod), 0);
return int(ShareInfo->OldHookHandle);
}
else return 0;
}

HOOKDLL_API BOOL RemoveMouseHook()
{
BOOL tmp=UnhookWindowsHookEx(ShareInfo->OldHookHandle);
CloseHandle(ShareInfo->hm);
return tmp;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог