我做了一个截获全局鼠标钩子的动态库,想实现在任何一个窗口点击右键弹出菜单后,在右键菜单的最上面的一个按钮的上面弹出我自己的菜单,我已经实现弹出菜单,但是只要一点右键,右键所在的程序马上就报一个Debug Assertion Failed的错误,如下:
file:afxwin1.inl
line:22
所以的错误都一样
点“忽略”后,会弹出我的菜单。
请大家指点。
file:afxwin1.inl
line:22
所以的错误都一样
点“忽略”后,会弹出我的菜单。
请大家指点。
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
if (nCode>=0)
{
HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt);
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[256];
GetWindowText(glhTargetWnd,szCaption,100);
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd;
} if (wparam==WM_RBUTTONDOWN)
{
HWND glhTargetWnd=pMouseHook->hwnd;
if(glhTargetWnd !=NULL)
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"μˉ3?óò?ü");
CMenu menu ,*pSubMenu;
menu.LoadMenu(IDR_POPMENU);
pSubMenu = menu.GetSubMenu(0);
if(!pSubMenu->TrackPopupMenu (TPM_BOTTOMALIGN, pMouseHook->pt.x,
pMouseHook->pt.y,CWnd::FromHandle(glhTargetWnd)))
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"OK");
}
else
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"ERROR");
}
PostMessage(glhTargetWnd, WM_NULL, 0, 0);
}
} }
return CallNextHookEx(glhHook,nCode,wparam,lparam);
}
调试起来有问题,很容易程序没有响应
另外,最好用Win32 DLL。
没试过Hook过程中是否可以弹出菜单。
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
if (nCode>=0)
{
HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt);
if (wparam==WM_RBUTTONDOWN)
{
//HWND glhTargetWnd=pMouseHook->hwnd;
if(glhTargetWnd !=NULL)
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"µ¯³öÓÒ¼ü");
CMenu menu ,*pSubMenu
menu.LoadMenu(IDR_POPMENU);
pSubMenu = menu.GetSubMenu(0);
if(!pSubMenu->TrackPopupMenu (TPM_BOTTOMALIGN, pMouseHook->pt.x,
pMouseHook->pt.y, CWnd::FromHandle(glhTargetWnd)))
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"ERROR");
}
else
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"OK");
}
PostMessage(glhTargetWnd, WM_NULL, 0, 0);
}
} }
return CallNextHookEx(glhHook,nCode,wparam,lparam);
}修改后,断点设在if (wparam==WM_RBUTTONDOWN)下面,第一次到if(!pSubMenu->TrackPopupMenu (TPM_BOTTOMALIGN, pMouseHook->pt.x后返回断点,第二次到if(!pSubMenu->TrackPopupMenu后显示“ERROR”我怀疑是第一次调用TrackPopupMenu被死锁或没有响应,第二次所以报错,否则怎么会返回断点
不知道为什么
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
if (nCode>=0)
{
HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt);
if (wparam==WM_RBUTTONDOWN)
{ if(glhTargetWnd !=NULL)
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"右键");
HMENU hMenu = LoadMenu(glhInstance, MAKEINTRESOURCE(IDR_POPMENU));
GetSubMenu(hMenu,0);
TrackPopupMenu(hMenu, TPM_BOTTOMALIGN, pMouseHook->pt.x,
pMouseHook->pt.y, 0, glhTargetWnd, 0);
PostMessage(glhTargetWnd, WM_NULL, 0, 0);
}
}
}
return CallNextHookEx(glhHook,nCode,wparam,lparam);
}修改为止使用API函数,LoadMenu第一个参数使用DLL的实例句柄可以吗?不会无响应,都是菜单弹不出来
我稍稍试了一下可以弹出菜单。
#pragma data_seg(push, "Shared")
HHOOK NextHook = NULL;
#pragma data_seg(pop)
#pragma comment(linker, "/SECTION:Shared,RWS")HMODULE Module;BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
Module = hModule;
}
return TRUE;
}LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == 0)
{
PMOUSEHOOKSTRUCT mhs = (PMOUSEHOOKSTRUCT)lParam; if (wParam == WM_RBUTTONUP)
{
HMENU menu = LoadMenu(Module, (LPCTSTR)IDR_MENU1);
HMENU subMenu = GetSubMenu(menu, 0);
TrackPopupMenu(subMenu, 0, 0, 0, 0, mhs->hwnd, NULL);
}
}
return CallNextHookEx(NextHook, nCode, wParam, lParam);
}__declspec(dllexport) void StartHook()
{
NextHook = SetWindowsHookEx(WH_MOUSE, MouseProc, Module, 0);
}__declspec(dllexport) void StopHook()
{
UnhookWindowsHookEx(NextHook);
}
yeaphi#gmail.com