dll注入程序(别人做的程序)当中,在dll里面
chldhd:=findwindowex(wdhdl,nil,nil,'保存');
这个语句始终是0(没有找到保存控件)。
不知道我错在哪里。
请高手指教。
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;

解决方案 »

  1.   

    我倒是做过,可惜现在换工作了,身边没环境,给你个参考,感觉是你那个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;interfaceuses
        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.
      

  2.   

    你可以改成这个样子!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;