第一个函数是一个自定义窗口函数,任何一个窗口都有一个这样的函数处理传递给窗口的消息,在这个自定义窗口函数只处理了WM_SHOWWINDOW消息,在这个函数的最后调用默认的窗口函数
第二个函数的作用是将第一个函数加在到窗口函数链的最前端

解决方案 »

  1.   

    GetMsgProc :
             模拟人工对特定对话框的文本输入框输入buf内容, 鼠标点击某个按钮,如果找不到特定对话框的文本输入框和按钮,则继续CallNextHookEx,这段代码可能用于安装程序中自动填入相关信息,无需人工干预,再,你的代码不全
      

  2.   

    谢谢两位!不过我的意思是:请帮我用delphi写出代码来。假如没空的话,不用测试。我自己琢磨着来测试就好了。
      

  3.   

    GetDlgItem(pStr->hwnd,0x00000001);是MFC封装的东西,不知怎么写
      

  4.   

    type
      PWPSStruc = ^TWPSStruc;
      TWPSStruc = record
        hwnd: THandle;   
        message: UINT; 
      end;var
      buf: PChar;
      hHook: HHOOK; function GetMsgProc(code: Integer; wParam: WPARAM; lParam: WPARAM): Integer; stdcall;
    var
      pStr: PWPSStruc;
    begin
      buffer := 'Hello';
      pStr := PWPSStruc(lParam);
      if pStr^.message = WM_SHOWWINDOW then
      begin
        if pStr^.hwnd = 0 then
        begin  
          Result = 1 ;
          Exit;
        end;
        SendMessage(pStr^.hwnd, WM_SETTEXT, 0, Integer(Pointer(Buffer)));
        //GetDlgItem(pStr->hwnd,0x00000001);
        SendMessage(pStr^.hwnd, WM_LBUTTONDOWN, 0, 0);
        SendMessage(pStr^.hwnd, WM_lBUTTONUP, 0, 0);
      end;
      Result := CallNextHookEx(hHook, code, wParam, lParam);
    end;function SetHook(hwnd: THandle; lTranText: PChar): Integer;
    begin
      hHook := SetWindowsHookEx(WH_CALLWNDPROC, GetMsgProc, HInstance, 0);
      if hHook <> 0 then
      begin
        ZeroMemory(Buf, 100);
        Move(lTranText^, buf^, strlen(lTrantext));
      end;
      Result := 1;
    end;
      

  5.   

    GetDlgItem(pStr->hwnd,0x00000001);
           返回Dlg中的第一个子窗口句柄如果你装了VC++, 看帮助吧
      

  6.   

    那可以用EnumWindows  Api也写一个Delphi的GetDlgItem,呵呵你自己写吧
    我记得很简单,我这里只有记事本,什么都做不了。
      

  7.   

    木石三兄好厉害!,我已经开了另外一个帖子给你分,请搜索‘木十三’(对不起,一不小心打错了)。
    5i海洋兄,我在结贴的时候在给你分吧!但是,我用SendMessage(GetDlgItem(cs.hwnd,$00000480), WM_SETTEXT, 0, longint(pchar('hello')));并不能成功给edit赋值。这一句一点反应也没有。怎么回事哪?
    另外我已经实现在我所感兴趣的窗口 wm_create之前hook。但是,用的是SetWindowsHookEx(WH_CALLWNDPROC,proc,hinstance,0); 假如使用WH_CALLWNDPROCRET,会不会达不到我‘不出现对话框’的问题哪?假如我想不出现对话框,并且给 opendialog1.filename 赋值,该怎么办哪?此处的opendialog1就是我所感兴趣的窗口,我已经hook到了。我有一个想法:让opendialog1.visible:=false !,然后再给edit赋值,虚拟点击button,这个方法可行吗?大侠救我!!!!!!
      

  8.   

    EnumWindows或者findwindow或者shellapi
      

  9.   

    也可以自己挂在comctl32.ocx上,然后用apihook修改函数地址!
      

  10.   

    type
      PData = ^TData;
      TData = record
        Index: Integer;   //  want to find index
        Value: Integer;   //  enum child times
        hwnd: THandle;    //  return find hwnd
      end;function EnumChildProc(hwnd: THandle; lParam: Integer): Boolean; stdcall;
    var
      Data: PData;
    begin
      Data := PData(lParam);
      Result := Data^.Index <> Data^.Value;
      if not Result then
        Data^.hwnd := hwnd; 
      Inc(Data.Value);
    end;function GetDlgItem(Handle: THandle; Index: Integer): THandle;
    var
      Data: TData;
    begin
      FillChar(Data, SizeOf(Data), 0);
      Data.Index := Index;
      EnumChildWindows(Handle, @EnumChildProc, Integer(@Data));
      Result := Data.hwnd;
    end;
    相对应的程序改为:
    var
      hEdit: THandle;
      hButton: THandle;
    begin
      ...
         hEdit := GetDlgItem(pStr^.hwnd, 1);
         if hEdit = 0 then
         begin
           Result := 1;
           Exit;
         end; 
         Sendmessage(hEdit, ...);
        
         hButton 类同
       ...
    end;
    我只是试过GetDlgitem可以运作,其它的你得自己作了。
    TWPSStruc结构你得看你的源程序照着翻译了。
      

  11.   

    oe := GetDlgItem(cs.hwnd,1148);
       SendMessage(oe, WM_SETTEXT, wparam(1148), longint(pchar('hello')));我用以上代码发现,对话框的文件名输入框的hwnd为1148(10进制),但是,只有我在第二次进入对话框的时候,这个输入框才有‘hello’,而第一次进入是没有的!这是为什么呢?
    我的hook类型是:
    SetWindowsHookEx(WH_CALLWNDPROC,proc,hinstance,0);
    事件类型是:
     if cs.message=WM_showwindow then还有,我看不懂winsight32。所以,无法看到设置 visible的地址。这估计是最后一个难点了。我都快虚脱了。
      

  12.   

    WH_CALLWNDPROC,改为WH_GETMESSAGE试试
    WH_CALLWNDPROC记得是所有处理的之前,
    GetMessage好像是之后
      

  13.   

    假如之后的话,那好想就没有意义了?我不想这个窗口出现啊!有个朋友的方法不错:
    xpony(xiezequn) (  ) 信誉:100  2002-04-08 16:01:00  得分:0   
      如果不让它看看太阳的话 就把它的位置搬家啊 
      .Left := -2000 ;
      .Top :- -2000 ;
    等确认要显示的时候把.Left,.Top改为正确的值
    不过这样比较勉强 找到好方法不妨贴出来 
     
    你能帮我做出来吗?300分。