Новости с фронта... Если вставить MessageBeep в DLL, то видно, что перехватчик работает и за пределами "своего" приложения. Есть подозрение, что PostMessage не доставляет сообщение окну hwndParent. Буду признателен за помощь.
/*****************spy.cpp
#include <windows.h>
#include "resource.h"
#include "msghook.h"
#pragma comment (lib, "msghook.lib")
BOOL CALLBACK Spy(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch (iMsg)
{
case WM_INITDIALOG:
InstallHook(hDlg);
return TRUE;
case WM_SPY_LBUTTONDOWN:
case WM_SPY_LBUTTONUP:
MessageBeep(MB_ICONASTERISK);
return TRUE;
case WM_CLOSE:
UninstallHook();
EndDialog (hDlg, 0);
return TRUE;
} // switch (iMsg) ...
return FALSE;
} // Spy
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
DialogBox (hInst, "Spy", NULL, Spy);
return 1;
}
/*****************msghook.cpp
static HHOOK hhookGetMsg; // Значение устанавливает главная программа
static HWND hwndParent; // Хэндл окна установившего перехватчик
static HINSTANCE hinstDLL; // Хэндл этой DLL
BOOL WINAPI DllMain(HINSTANCE hDll, DWORD fdwReason, LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
hinstDLL = hDll;
return TRUE;
}
EXPORT void InstallHook(HWND hwnd)
{
hwndParent = hwnd;
hhookGetMsg = SetWindowsHookEx(
WH_GETMESSAGE, // Перехват сообщений оконной процедуре
GetMsgProc, // Перехватчик
hinstDLL, // DLL перехватчика
0);
}
EXPORT void UninstallHook()
{
UnhookWindowsHookEx(hhookGetMsg);
}
EXPORT LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
POINT pt; // Текущее положение указателя мыши
HWND hwndCtrl; // Текущее окно
MSG *msg = (MSG *) lParam; // Перехваченное сообщение
CallNextHookEx(hhookGetMsg, nCode, wParam, lParam);
switch (msg->message)
{
case WM_LBUTTONDOWN:
PostMessage(hwndParent, WM_SPY_LBUTTONDOWN, 0, (LPARAM) msg->hwnd);
break;
case WM_LBUTTONUP:
PostMessage(hwndParent, WM_SPY_LBUTTONUP, 0, (LPARAM) msg->hwnd);
break;
}
return NULL;
}
---
|