ХУК(искал, но не нашел)
1. SetWindowsHookEx(WH_GETMESSAGE,...) не вешается на первичный поток, который был создан и сразу приостановлен(CREATE_SUSPENDED). На сколько я понял – это из-за 'WH_GETMESSAGE'. Посоветуйте на что еще можно повесить хук для того, чтобы он работал в 98-XP.
2. Мне нужно, чтобы чужой поток, на который я делаю хук, выполнял определенный код, когда мой поток вызывает UnhookWindowsHookEx(). Как это лучше сделать?
3. Как лучше передать информацию(строка + хэндл) из потока на который поставлен хук в поток, который устанавливал хук? Я так понимаю, что потоку на который вешается хук надо будет передавать свой ThreadId? Как это лучше сделать?
Выслушаю любые мысли. Заранее - большое СПАСИБО.
//#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;
}