请问,如何HOOK某个程序窗口,使该窗口能够加上自己的菜单或工具按钮。

dash 2004-05-13 05:48:57

RT, 谢谢。
...全文
529 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dash 2004-06-07
  • 打赏
  • 举报
回复
csdn改版,还有再结一次帖。
laker_tmj 2004-05-14
  • 打赏
  • 举报
回复
up learn
dash 2004-05-14
  • 打赏
  • 举报
回复
to gjd111686(数字金刚):
看你贴出的代码,似乎应该有更完整的程序。如果方便的话,能给我发一个
完整的程序吗(我的mail:jfu_router@hotmail.com). 我今天就会结贴。


我自己也找到一些资料,这种被称为“dll注入技术”的技术一共有三种方式,
上面的帖子中已经包括了最常见的两种。如果大家有兴趣,看参考一本叫Advanced Windows
的书。
再次感谢大家。
gjd111686 2004-05-13
  • 打赏
  • 举报
回复
extern "C" _declspec (dllexport) LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
static BOOL bSubClass=FALSE;//子类化标志,初始为假
if(hWnd==NULL)//如果以前未找到Notepad窗口,继续查找,找到后发送初始化消息
{
hWnd=FindWindow("Notepad",NULL);
if(IsWindow(hWnd))
PostMessage(hWnd,WM_NULL,0,0);
}
else
{
if(!IsWindow(hWnd))
{
bSubClass=FALSE;
hWnd=NULL;
}
}
//如果以前运行过Notepad,但此时已经关闭,置窗口句柄为空,子类化标志为假
if((!bSubClass)&&(nCode==HC_ACTION)&&(wParam==PM_REMOVE)&&(((MSG*)lParam)->hwnd==hWnd)&&(((MSG*)lParam)->message==WM_NULL))
{
lpOriginalProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewWndSubClassProc);//设置钩子过程,进行窗口子类化
HMENU hMenu;
hMenu=GetMenu(hWnd);//获取Notepad窗口菜单
int nMenuItemCount=GetMenuItemCount(hMenu);//获得Notepad窗口菜单记数
for(int i=0;i<nMenuItemCount;i++)//遍历一级菜单
{
char lpString[128]="\0";
int nMenuItemStringLen=GetMenuString(hMenu,i,lpString,128,MF_BYPOSITION);//获取菜单标题文本
if(lstrcmp(lpString,_T("帮助(&H)"))!=0)
continue;//针对文件,编辑,格式菜单项跳过
HMENU hSubMenu=GetSubMenu(hMenu,i);//取得帮助菜单句柄
AppendMenu(hSubMenu,MF_SEPARATOR,102,"-");
AppendMenu(hSubMenu,MF_BYCOMMAND|MF_STRING,About,"关于监控");//添加菜单项,About为上面定义的枚举常数
}
DrawMenuBar(hWnd);//菜单重绘
bSubClass=TRUE;//设置子类化标志
}
return CallNextHookEx(hHook,nCode,wParam,lParam);//传递钩子到下一级钩子链
}
dash 2004-05-13
  • 打赏
  • 举报
回复
谢谢CFoo, 我先研究一下。
CFoo 2004-05-13
  • 打赏
  • 举报
回复
http://www.codeproject.com/shell/sweeptheminesweeper.asp
dash 2004-05-13
  • 打赏
  • 举报
回复
嗯,首先谢谢楼上的楼上。

但是这种技术好像不能用在98下。
98下我曾经见过这样的程序。我清楚的记得,那个程序修改了“记事本”的菜单。
使用的是钩子。

期待使用钩子的解决方法。
PiggyXP 2004-05-13
  • 打赏
  • 举报
回复
来晚了,我也正想找楼上大版主找的这个东西^_^

不过远线程注入其实是挺难的一项技术
zhucde 2004-05-13
  • 打赏
  • 举报
回复
http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls/system_30/1230006.htm



如何在其他程序的窗口上创建按钮并使之能响应
作者:ac952_z_cn


环境:Windows NT/2000

实现方法:采用将动态连接库注入到其他进程中的方法来实现。

为了便于选择窗口,我借用了另一个程序"2000下显示带*号"来选择窗口。
如果要在98下实现你可用钩子同样实现。
程序运行界面如图一:

图一
将动态连接库注入其他进程的代码如下:

BOOL WINAPI RT_CTRL_BTN(LPCSTR lpszLibFile, HWND hWnd, DWORD dwID, LPRECT pRtBtn, LPCTSTR szCaptionBtn)
{
try {
DWORD dwProcessID;

...
...

..

..
ygzdev 2004-05-13
  • 打赏
  • 举报
回复
用远程线程插入比较好,全面接管该程序的处理过程
3jaja 2004-05-13
  • 打赏
  • 举报
回复
FindWindow;
CreateMenu……如何?

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧