求dll注入程序当中找按钮控件方法。dll注入程序(别人做的程序)当中,在dll里面chldhd:findwindowex(wdhdl,n
求dll注入程序当中找按钮控件方法。
dll注入程序(别人做的程序)当中,在dll里面
chldhd:=findwindowex(wdhdl,nil,nil,'保存');
这个语句始终是0(没有找到保存控件)。
不知道我错在哪里。
请高手指教。
Delphi(Pascal) codefunction HookProc(nCode:Integer;WParam: WPARAM;LParam:LPARAM):LRESULT;stdcall;varPos: TPoint;chldhd: HWND;ScreenDC: HDC;cap: array[0..1024] of Char;ScreenColor: COLORREF;begin wdhdl:= FindWindow(NIL,PChar('dll注入窗体')); showmessage(inttostr(wdhdl)); chldhd:=findwindowex(wdhdl,0,0,'保存'); showmessage(inttostr(chldhd)); if chldhd=0 then exit; while chldhd<>0 do begin showmessage(inttostr(chldhd)); getwindowtext(chldhd,cap,99); showmessage(cap); chldhd:=findwindowex(wdhdl,chldhd,pchar('button'),nil); end; Result := CallNextHookEx(hHk,nCode,WParam,LParam);end;function HookOn(lpHwnd:HWND;lpType:Longint): Longint;stdcall; export;begin hThread :=GetWindowThreadProcessId(lpHwnd,hmod); //注入开始 hHk :=SetWindowsHookEx(lpType,@HookProc,hInstance,hThread); // WH_KEYBOARD Result :=hHkend;
[解决办法]我倒是做过,可惜现在换工作了,身边没环境,给你个参考,感觉是你那个0用错了,因为“保存”应该是一个菜单栏里的选项,他的父窗体可不是桌面
//FindWindowEx 比 FindWindow 多出两个句柄参数:
FindWindowEx(
Parent: HWND; {要查找子窗口的父窗口句柄}
Child: HWND; {子窗口句柄}
ClassName: PChar; {}
WindowName: PChar {}
): HWND;
{
如果 Parent 是 0, 则函数以桌面窗口为父窗口, 查找桌面窗口的所有子窗口;
如果 是 HWND_MESSAGE, 函数仅查找所有消息窗口;
子窗口必须是 Parent 窗口的直接子窗口;
如果 Child 是 0, 查找从 Parent 的第一个子窗口开始;
如果 Parent 和 Child 同时是 0, 则函数查找所有的顶层窗口及消息窗口.
}
给你个例子
unit unitWinExe;
interface
uses
Windows,Messages,Dialogs;
implementation
var
fHwnd,cHwnd:THandle;
cmdLine:string;
begin
cmdLine := C:\Program Files\Huawei-3Com\H3C 802.1X 客户端\Dot1XClient.exe;
WinExec(PChar(cmdLine),SW_HIDE) ;
fHwnd:=FindWindow(#32770,nil); //查找到窗口#32770,’#32770‘用Spy++查出来的。
if fHwnd>0 then
begin
cHwnd:=FindWindowEx(fHwnd,0,nil,连接); //查找#32770的子窗口连接
if cHwnd>0 then PostMessage(cHwnd,WM_KEYDOWN,VK_RETURN ,0) ; //按回车键
end;
end.
[解决办法]你可以改成这个样子!
function HookProc(nCode:Integer;WParam: WPARAM;LParam:LPARAM):LRESULT;stdcall;
var
Pos: TPoint;
chldhd: HWND;
ScreenDC: HDC;
cap: array[0..1024] of Char;
ScreenColor: COLORREF;
begin
wdhdl:= FindWindow(NIL,PChar('dll注入窗体'));
showmessage(inttostr(wdhdl));
chldhd:=findwindowex(wdhdl,0,0,'保存');
showmessage(inttostr(chldhd));
if chldhd=0 then exit;
while chldhd<>0 do begin
showmessage(inttostr(chldhd));
getwindowtext(chldhd,cap,99);
showmessage(cap);
chldhd:=findwindowex(wdhdl,chldhd,pchar('button'),nil);
end;
Result := CallNextHookEx(hHk,nCode,WParam,LParam);
end;
function HookOn(lpHwnd:HWND;lpType:Longint): Longint;stdcall; export;
begin
hThread :=GetWindowThreadProcessId(lpHwnd,hmod);
//注入开始
hHk :=SetWindowsHookEx(lpType,@HookProc,hInstance,hThread); // WH_KEYBOARD
Result :=hHk
end;