用HOOK将自己的菜单加到第三方软件的右键菜单上,如何响应自己的菜单事件?
cz3w 2006-02-23 11:14:35 用HOOK将自己的菜单加到第三方软件的右键菜单上后,如何响应自己的菜单事件?
#include <afx.h>
#include <Windows.h>
#ifndef IDM_GRAPHINFO
#define IDM_GRAPHINFO 40005
#endif
HHOOK g_hMouse=NULL;
HHOOK hHook=NULL;
HWND hMenuWnd;
//HHOOK g_hKeyboard=NULL;
#pragma data_seg("MySec")
HWND g_hWnd=NULL;
char strWord[200]={0} ;
#pragma data_seg()
//#pragma comment(linker,"/section:MySec,RWS")
/*
HINSTANCE g_hInst;
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
g_hInst=hinstDLL;
return TRUE;
}
*/
typedef struct tagMENUBARINFO {
DWORD cbSize;
RECT rcBar;
HMENU hMenu;
HWND hwndMenu;
BOOL fBarFocused:1;
BOOL fFocused:1;
} MENUBARINFO, *PMENUBARINFO;
typedef BOOL (FAR PASCAL * FUNC1)(
HWND hwnd,
LONG idObject,
LONG idItem,
PMENUBARINFO pmbi
);
BOOL GetMouseInWindowsText(LPSTR s)
{
strcpy(s, strWord);
return TRUE;
}
WNDPROC MenuProc;
// 浮点数输入框的子类化窗口过程
LRESULT CALLBACK ProcMenu(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
//
// FILE *pFile=fopen("c:\\1.txt","w");
// fwrite(" OK!!! ",1,400,pFile);
// fclose(pFile);
if(LOWORD(wParam)==IDM_GRAPHINFO)
{
//此处不执行
return 1;
}
else
{
// 如果是其它消息,则调用原有的窗口过程
return CallWindowProc(MenuProc, hWnd, Msg, wParam, lParam);
}
}
LRESULT CALLBACK HookCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT cwps;
if( nCode == HC_ACTION )
{
CopyMemory(&cwps, (LPVOID)lParam, sizeof(CWPSTRUCT));
switch(cwps.message)
{
case WM_CREATE:
{
... }
break;
case WM_INITMENUPOPUP:
{
....
AppendMenu(mbar.hMenu,MF_BYCOMMAND | MF_STRING ,40002,"调用图档");
}
break;
case WM_COMMAND:
{
MenuProc = (WNDPROC)SetWindowLong(cwps.hwnd, GWL_WNDPROC, (LONG)ProcMenu);
}
break;
}
}
return CallNextHookEx((HHOOK)WH_CALLWNDPROC, nCode, wParam, lParam);
}
void UnHook()
{
UnhookWindowsHookEx(hHook);
}
void SetHook(HWND hwnd)
{
g_hWnd=hwnd;
hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookCallWndProc, GetModuleHandle("Hook"),0);
}