紧急救助,hook程序在98上面报错!!!!!

guyigood 2003-04-28 09:53:49
目的,监控一个程序的一个窗口上面的按钮按下事件。
代码如下,在w2k上可以运行,但时间不能太长,否则报错,在98下面运行提示系统
资源不足,随后死机。
请各位高手指点一下。非常感谢。
unit Unit1;
interface
uses
Windows, Messages,shellapi;


var
hookmenu:thandle;
windows1:wparam;
a:integer;
procSaveExit: Pointer;
function menumsg(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;
function unmenuhook():boolean;stdcall;export;
function setmenuhook():boolean;stdcall;export;
//procedure menumsg(var msg:tmessage);far;
procedure HookExit; far;



implementation



function setmenuhook():boolean;export;
begin
Result := False;
if hookmenu<>0 then Exit;
hookmenu:=SetWindowsHookEx(WH_CallWndProc,menumsg,hinstance,0);
//hookmenu:=SetWindowsHookEx(WH_getmessage,menumsg,hinstance,0);
Result := hookmenu<>0;
end;

function unmenuhook:boolean;export;
begin
if hookmenu<>0 then
begin
UnhookWindowshookEx(hookmenu);
hookmenu:= 0;
end;
Result := hookmenu = 0;
end;

function menumsg(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;
var
//f1:textfile;
pmsg:pCwpStruct;
g:TCwpStruct;
g1,g2:hwnd;
//spcx:Tspfl;
i:integer;
WName:array[0..254] of char;
//wname:pchar;
begin
//pCwpStruct
pmsg:=pCwpStruct(lparam);
g.message:=pmsg^.message;
g.lParam:=pmsg^.lParam;
g.wParam:=pmsg^.wParam;
g.hwnd:=pmsg^.hwnd;
if (g.hwnd=findwindow(nil,'选择一个))and(g.message=273) then
begin
g1:=getwindow(g.hwnd,gw_child);
for i:=1 to 1000 do
begin
g2:=GetWindow(g1,GW_HWNDNEXT);
getwindowtext(g2,wname,254);
if (string(wname)='分类查询') then
break;
g1:=g2;
end;
if g.lParam=g2 then
begin
// spcxnew;
shellexecute(g.hwnd,'open','spflcx.exe','','',sw_showna);
end;
// messagebox(g.hwnd,'fkdsj','dfaldja',sw_show);
end;
//wm_command
if (g.message=287)and(g.hwnd=findwindow(nil,'xxx')) then
begin
//查询菜单id
if (g.wparam=-65536)and(windows1=-2139095014)then
begin
// zk:=tspzkwh.Create(application);
// zk.showmodal;
// zk.free;
shellexecute(g.hwnd,'open','zk.exe','','',sw_showna);
end;
if findwindow(nil,'xxxx')<>0 then
postmessage(findwindow(nil,'xxxx'),wm_close,0,0);
end;
windows1:=g.wparam;
Result:= 1;
end
else
begin
CallNextHookEx(hookmenu,icode,WParam,LParam);
Result := 0;
end;
end;

procedure HookExit;
begin
if findwindow(nil,'xxxx')<>0 then
postmessage(findwindow(nil,'xxxx'),wm_close,0,0);
if hookmenu <>0 then unmenuhook;
ExitProc := procSaveExit;
end;

end.
...全文
121 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyigood 2003-05-09
  • 打赏
  • 举报
回复
谢谢都市飞天,问题已解决,我用了其他的方法解决了,给你加分
guyigood 2003-05-08
  • 打赏
  • 举报
回复
请教一下具体代码如何书写,我在大富翁中也提了这个问题,只有一个人回答了一句话。说我内存未分配,再也没有下文了,我觉得这里的人很不错,有这么多高手回答问题,那位能给出源代码,本人深表感谢,愿在加1000分送上。
FlyCity 2003-05-04
  • 打赏
  • 举报
回复
我觉得问题出在这一段代码:
for i:=1 to 1000 do
begin
g2:=GetWindow(g1,GW_HWNDNEXT);
getwindowtext(g2,wname,254);
if (string(wname)='分类查询') then
break;
g1:=g2;
end;
原因是这一段代码占用了太多的CPU时间,并且你用完g2的Handle句柄后没有如g2.free之类的资源释放语句,导致越来越多的资源垃圾。
建设你要使用EnumWindows一类的回调函数以让系统自动返回当前所有的窗口句柄,其他的当然就没问题了。
Venda 2003-05-04
  • 打赏
  • 举报
回复
支持一下!
guyigood 2003-05-02
  • 打赏
  • 举报
回复
怎么没有人知道吗?拜托各位了。
guyigood 2003-04-30
  • 打赏
  • 举报
回复
hook函数当然是在dll中。以上代码是具体控制的一段程序。
发现去掉这段代码,可以正常运行,那位大哥给点意见吧,拜托了!
if (g.hwnd=findwindow(nil,'选择一个))and(g.message=273) then
begin
g1:=getwindow(g.hwnd,gw_child);
for i:=1 to 1000 do
begin
g2:=GetWindow(g1,GW_HWNDNEXT);
getwindowtext(g2,wname,254);
if (string(wname)='分类查询') then
break;
g1:=g2;
end;
ahjoe 2003-04-28
  • 打赏
  • 举报
回复
请把hook函数做到dll中,这是基本原则。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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