vc怎么屏蔽别人开发的软件里的菜单项,我是在用solidworks,然后在里面加一个插件,现在项目需要屏蔽sw里原有的一些菜单项。
但是比较头疼的是它有自定义菜单和快捷键等功能。
菜单项可以改名字和改位置。
我在加载插件时删了自定义菜单。但是又有问题,如果用户不先加载插件,先改了菜单,那我还是白做了。
不知道描述的够不够清楚,这玩意做的真郁闷
但是比较头疼的是它有自定义菜单和快捷键等功能。
菜单项可以改名字和改位置。
我在加载插件时删了自定义菜单。但是又有问题,如果用户不先加载插件,先改了菜单,那我还是白做了。
不知道描述的够不够清楚,这玩意做的真郁闷
解决方案 »
- 关于完成端口的疑问
- 如何实时的禁用起用整个工具栏和菜单
- 用vc++生成的程序在其他机器不能运行,求高人指点
- 如何在DLL中设置断点并调试?
- 请教一下,如何在WINDOWS下实现音频的捕捉?
- 错在哪?如何着手线程编程?
- MFC Windows程序设计(第2版)和深入浅出MFC(第二版)哪本书更好?
- 如何实现ftp自动登陆!·
- #import raw_interfaces_only 中,raw_interfaces_only 是什么意思?
- 大家帮我看看这个Windows Object 怎么理解
- 不用BHO ,也不用事件连接点,怎么HOOK IE 的COM 事件操作?
- 什么时候该看<<深入浅出MFC>>与<<WINDOWS程序设计>>
把它搞明白,处理你的问题不难。
1.动态取得那个弹出菜单的句柄.然后把菜单干掉.可通过取句柄或安装勾子.
2.用OllyDbg反汇编你那个插件.根据导入库中导入的PopuMenu,检索插件中调用的位置.如果是不想弹出的地方,直接nop掉.
恩。我现在在cad软件solidworks下做个插件(支持mfc)。然后想把某些菜单项给屏蔽掉。如文件下面的新建等。。具体不管我这么做是为了什么先。呵呵
先不管自定义了菜单了。我现在让菜单项灰掉,可是我怎么搞都出不来。
HWND hwnd=FindWindow(NULL,"SolidWorks 2007");
//HWND hwnd=GetActiveWindow();
HMENU hmenu=GetMenu(hwnd);
CFrameWnd *pFrameWnd=(CFrameWnd*)AfxGetMainWnd();
pFrameWnd->m_bAutoMenuEnable=FALSE;
hmenu=GetSubMenu(hmenu,0); BOOL ret=EnableMenuItem(hmenu,0,MF_BYPOSITION|MF_GRAYED);
最后一句返回的是-1。总是不能成功。
难道插件形式的话CFrameWnd这样用有错吗?
g_menuHook=SetWindowsHookEx(WH_CALLWNDPROC,MenuHookProc, AfxGetInstanceHandle(), 0);
然后实现钩子,但程序直接退出运行了。这个钩子有什么问题吗?怎么写好?一个进程里写2个钩子应该也没有关系的吧?
对钩子不是很懂~谢谢
WNDPROC lpOldWndProc;
HHOOK g_menuHook;LRESULT CALLBACK WinProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
LRESULT ret=CallWindowProc(lpOldWndProc, hwnd, uMsg,wParam,lParam);
if(uMsg == WM_INITMENUPOPUP)
{
HMENU hmenu=GetMenu(hwnd);
hmenu=GetSubMenu(hmenu,0);
if(!EnableMenuItem(hmenu,0,MF_BYPOSITION | MF_DISABLED))
AfxMessageBox(_T("disable menu item failed"));
}
return ret;
}
LRESULT CALLBACK MenuHookProc(int nCode,WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pStruct = (CWPSTRUCT*)lParam;
HWND hwnd=FindWindow(NULL,"SolidWorks 2007");
((CFrameWnd*)AfxGetMainWnd())->m_bAutoMenuEnable=FALSE;
lpOldWndProc=(WNDPROC)GetWindowLong(hwnd,GWL_WNDPROC);
SetWindowLong(hwnd,GWL_WNDPROC,(long)WinProc);
return CallNextHookEx(g_menuHook,nCode,wParam,lParam);
}
Hook函数中不能用AfxGetMainWnd。
{
if(uMsg == WM_INITMENUPOPUP)
{
HMENU hmenu=GetMenu(hwnd);
hmenu=GetSubMenu(hmenu,0);
if(!EnableMenuItem(hmenu,0,MF_BYPOSITION | MF_DISABLED))
AfxMessageBox(_T("disable menu item failed"));
}
return CallWindowProc(lpOldWndProc, hwnd, uMsg,wParam,lParam);
}
LRESULT CALLBACK MenuHookProc(int nCode,WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pStruct = (CWPSTRUCT*)lParam;
HWND hwnd=FindWindow(NULL,"SolidWorks 2007");
if(hwnd)
{
lpOldWndProc=(WNDPROC)GetWindowLong(hwnd,GWL_WNDPROC);
SetWindowLong(hwnd,GWL_WNDPROC,(long)WinProc);
}
return CallNextHookEx(g_menuHook,nCode,wParam,lParam);
}
怎么判断当前窗口是不是目标窗口?小弟不才。我这里找"SolidWorks 2007"这个窗口应该不会重复设置窗口函数吧?
改成这样了。还是不行的呀。跟了下代码
if(uMsg == WM_INITMENUPOPUP) 这里就直接跳到return了。这是为什么?它没做这步?
wm_initmenupopenablemenuitem
在WinProc中,要调用原WNDPROC函数来处理消息,你的代码只是做一些附加处理。
另外还有一点忘了说,很多软件的主菜单不是真正的窗口菜单,是利用ControlBar做上去的,你可以用SPY++看一下,如果菜单栏是一个窗口,就是这种情况,这种情况不能按窗口菜单的方式来处理。
还有
“在WinProc中,要调用原WNDPROC函数来处理消息,你的代码只是做一些附加处理。”我还得调用哪些啊?就是想让菜单灰掉。您不给别人写代码的,就稍微写两句让我更加理解点吧。
实在搞得郁闷
每次Hook函数被调用时都执行这个FindWindow,只要目标窗口存在,返回的hwnd就是不等于0的,所以if(hwnd)里面的代码每次都会执行。
你可以在WinProc中先不做处理,直接调用原WNDPROC函数,然后返回,等到其它问题都解决之后再加代码。
他有很多很多种而且没有统一的规范
对于ToolbarWin32 可以枚举到句柄给他发hide消息
对于标准弹出菜单,可以Hook TrackPopupMenu来屏蔽
对于一些com菜单第三方菜单.. 没办法
对于ToolbarWin32 可以枚举到句柄给他发hide消息
对于标准弹出菜单,可以Hook TrackPopupMenu来屏蔽
这两
我要的是下拉的菜单呢
LRESULT CALLBACK MenuHookProc(int nCode,WPARAM wParam, LPARAM lParam)
{
HWND hwnd=FindWindow(NULL,"SolidWorks 2007");
if(hwnd)
{
lpOldWndProc=(WNDPROC)GetWindowLong(hwnd,GWL_WNDPROC);
SetWindowLong(hwnd,GWL_WNDPROC,(long)WinProc);
return 1;
}
return CallNextHookEx(g_menuHook,nCode,wParam,lParam);
}我怎么解决个问题啊“SetWindowsHookEx之后,各个窗口的消息都会调用你的Hook函数,在Hook函数中要判断本次收到的消息是不是发给"SolidWorks 2007"这个窗口的,如果不是则不要处理。因为发给窗口的消息很多,所以要加个判断,只替换一次WNDPROC,不要重复。”
g_menuHook=SetWindowsHookEx(WH_CALLWNDPROC,MenuHookProc, AfxGetInstanceHandle(),GetCurrentProcessId());
WNDPROC lpOldWndProc;
HHOOK g_menuHook;LRESULT CALLBACK WinProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
LRESULT ret=CallWindowProc(lpOldWndProc, hwnd, uMsg,wParam,lParam);
if(uMsg == WM_INITMENUPOPUP)
{
CMenu menu;
HMENU hmenu;
UINT menuItemID;
hMenu = (HMENU) wParam;
menu.Attach(hMenu);
menuItemID = menu.GetMenuItemID(0);
menu.EnableMenuItem(menuItemID,MF_GRAYED|MF_DISABLED);
menu.Detach();
}
return ret;
}
一运行连带其他程序全部挂了。替换窗口函数的时候怎么确定我要的那个窗口而不会去替换其他的窗口啊?
错了
改成这样后一点没反应了
g_menuHook=SetWindowsHookEx(WH_CALLWNDPROC,MenuHookProc, AfxGetInstanceHandle(),GetCurrentProcessId());
一下都挂了是我把最后的getcurrentprocessid改成0了
-------------------------------------------------------就是原来的应用程序,.exe。
我把改成这样
LRESULT CALLBACK WinProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if(uMsg == WM_INITMENUPOPUP)
{
CMenu menu;
HMENU hMenu;
UINT menuItemID;
hMenu = (HMENU) wParam;
menu.Attach(hMenu);
menuItemID = menu.GetMenuItemID(0);
menu.EnableMenuItem(menuItemID,MF_GRAYED|MF_DISABLED);
menu.Detach();
} LRESULT ret=CallWindowProc(lpOldWndProc, hwnd, uMsg,wParam,lParam);
return ret;
}
if里面都不进去