опубликован 26-12-2001 05:33 MSK
Ну вот смотри, я писал прогу, суть которой, чтобы в программе PCAD 2000 заработало колесо мыши для масштабирования и центрирования. Перехватываем сообщения от колеса и посылаем клавиатурный эквивалент. Вот код DLL:#include "..\hook.h"
#include "Shlwapi.h"
#include "correct.h"
#define WM_MOUSEWHEEL 0x020A
#pragma data_seg(".shared") // ðàçìåùàåì ïåðåìåííóþ â îáùåì ñåãìåíòå ïàìÿòè
HWND ghwndSpyHook = NULL; // the handle back to the executable
HHOOK hhkGetMessage = NULL;
BOOL bHookEnabled = TRUE;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
LRESULT __fastcall SafePostMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
if(IsWindow(hWnd)) return PostMessage(hWnd, Msg, wParam, lParam);
else return 0;
}
void HandleMButtonUp(WPARAM wParam, LPARAM lParam)
{
keybd_event('C', 0, 0, 0 );
keybd_event('C', 0, KEYEVENTF_KEYUP, 0);
}
void HandleMouseWheel(WPARAM wParam, LPARAM lParam)
{
short zDelta = (short) HIWORD(wParam);
if(zDelta < 0)
{
keybd_event(VK_ADD, 0, 0, 0 );
keybd_event(VK_ADD, 0, KEYEVENTF_KEYUP, 0);
}
else
{
keybd_event(VK_SUBTRACT , 0, 0, 0 );
keybd_event(VK_SUBTRACT , 0, KEYEVENTF_KEYUP, 0);
}
}
BOOL ItIsPCAD(HWND hwnd)
{
char szBuf[MAX_PATH];
GetModuleFileName(0, szBuf, sizeof(szBuf));
if(!StrStrI(szBuf, "pcb.exe")) return FALSE;
GetClassName(hwnd, szBuf, sizeof(szBuf));
if(lstrcmp(szBuf, "AfxFrameOrView42s")) return FALSE;
return TRUE;
}
BOOL LCHookProc(
HWND hwnd,
UINT uiMessage,
WPARAM wParam,
LPARAM lParam
)
{
if (ghwndSpyHook)
{
if(ItIsPCAD(hwnd))
{
if(uiMessage == WM_MOUSEWHEEL)
HandleMouseWheel(wParam, lParam);
if(uiMessage == WM_MBUTTONUP)
HandleMButtonUp(wParam, lParam);
}
}
return FALSE;
}
LRESULT CALLBACK
GetMsgProc(
int hc,
WPARAM wParam,
LPARAM lParam
)
{
PMSG pmsg;
pmsg = (PMSG)lParam;
if(bHookEnabled && hc == HC_ACTION && pmsg && pmsg->hwnd && wParam == PM_REMOVE)
{
LCHookProc(pmsg->hwnd, pmsg->message, pmsg->wParam, pmsg->lParam);
}
return CallNextHookEx(hhkGetMessage, hc, wParam, lParam);
}
BOOL CALLBACK SetHook(BOOL fSet, HWND hwndSpy)
{
if (fSet)
{
if (!hhkGetMessage)
{
ghwndSpyHook = hwndSpy;
if (!(hhkGetMessage = SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)GetMsgProc, GetModuleHandle("hook.dll"), 0)))
{
return FALSE;
}
}
}
else
{
if (hhkGetMessage)
{
UnhookWindowsHookEx(hhkGetMessage);
hhkGetMessage = NULL;
}
}
return TRUE;
}
BOOL CALLBACK EnableHook(BOOL bEnable)
{
BOOL bEnableStateOld = bHookEnabled;
bHookEnabled = bEnable;
return bEnableStateOld;
}
/// Теперь код HOOK.h
BOOL CALLBACK SetHook(BOOL fSet, HWND hwndSpy);
BOOL CALLBACK EnableHook(BOOL bEnable);
/// Тут даже лишнего много, EnableHook не обязателен.
/// Вот некоторый код для EXE. Обычный EXE (Dialog based).
BOOL CPCADWheelDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
if(!SetHook(TRUE, GetSafeHwnd()))
{
AfxMessageBox("Îøèáêà óñòàíîâêè ëîâóøêè.", MB_ICONSTOP);
PostMessage(WM_COMMAND, IDCANCEL);
};
AddTrayIcon();
return TRUE; // return TRUE unless you set the focus to a control
}
// Главное HOOK.H включить и в EXE, и в DLL.