背景:通过代码去读另外一个窗体上(调用的dll)的控件,先去加载那个窗体(dll),但是在那个窗体的create事件里面有消息框提示,而我不需要显示这个消息框,这个怎么去做?
或者有什么好的办法去读取窗体上的控件?

解决方案 »

  1.   

    除非修改OnCreate的执行地址(OnCreate前固定控件都已经创建完毕,是可以读的)
      

  2.   

    FindWindows 后的 SendMessage  WM_Close给找到的消息窗口百度一下  以上函数用法
      

  3.   

    create有消息提示,加载的时候就一定会出来你可以改变一下create代码,用传入参数来判断要不要提示
      

  4.   


    有很多dll,我根据名字动态调的,改dll的create代码怎么可能?
      

  5.   

    安装个钩子
    SetWindowsHookEx, WH_CBT,在nCode为HCBT_CREATEWND时,判断是不是消息框,是就返回非0值,否则返回0
      

  6.   


    哥们,再详细一点行吗?
    不知道怎么屏蔽,详细指教下var
    HookHandle: HHOOK;procedure TForm1.FormCreate(Sender: TObject);
    begin
    HookHandle:=SetWindowsHookEx(WH_CBT ,TestHookProc,0,GetCurrentThreadID);
    end;
    function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
    begin
    if (Code = HCBT_CREATEWND) then
    if PMsg(Msg)^.Message = WM_PAINT then
    begin
    Exit;
    //Form1.Memo1.Lines.Add('123');
    end;
    Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
    end;
      

  7.   

    var
      H: HHOOK;function CBTProc(          nCode: Integer;
         wParam: WPARAM;
         lParam: LPARAM
    ): Integer; stdcall;
    var
      c, w: PChar;// array[0..99] of Char;
    begin
      if nCode = HCBT_CREATEWND then
      begin
        c := PCBTCreateWnd(lParam)^.lpcs^.lpszClass;
        w := PCBTCreateWnd(lParam)^.lpcs^.lpszName;    if lstrcmp(c, 'TMessageForm') = 0 then //ShowMessage方式
        begin//如果是消息窗口
          PostMessage(wParam, WM_CLOSE, 0, 0);//关闭它
          Result := 0;
          Exit;
        end;    if lstrcmp(w, 'ddd') = 0 then//MessageBox方式
        begin//如果是消息窗口
          Result := 1;//直接销毁窗口
          Exit
        end;  end;
      
      Result := CallNextHookEx(H, nCode, wParam, lParam)
    end;
    procedure TForm3.Button1Click(Sender: TObject);
    begin
      ShowMessage('abc');
      //MessageBox(0, 'abc', 'ddd', 0)
    end;procedure TForm3.Button2Click(Sender: TObject);
    begin
      H := SetWindowsHookEx(WH_CBT, @CBTProc, 0, GetCurrentThreadId)
    end;procedure TForm3.FormDestroy(Sender: TObject);
    begin
      if H <> 0 then
        UnhookWindowsHookEx(H)
    end;ps:问题如果解决就请及时结贴!!!
      

  8.   


    ShowMessage方式 的可以,
    可是MessageBox方式的不行呢???
    我主要需要的是MessageBox方式的
    哥们,再研究下
      

  9.   

    你把ddd改成你的消息窗口的标题!!!
      

  10.   


    不是的,知道了,
    把上面那段
    if lstrcmp(c, 'TMessageForm') = 0 then //ShowMessage方式
        begin//如果是消息窗口
          PostMessage(wParam, WM_CLOSE, 0, 0);//关闭它
          Result := 0;
          Exit;
        end;
    去掉就可以了假如我是屏蔽加载的dll的messagebox,是不是也是怎么做?
      

  11.   


    procedure TForm1.Button1Click(Sender: TObject);
    var hdll :Thandle;
        prodll :Procedure ;
        hmainclient :THandle;
    begin
        hdll := LoadLibrary('Project1.dll');
        if hdll <> 0 then
        begin
            @prodll := GetProcAddress(hdll,pchar('ffun'));
            if @prodll <> nil then
            begin
                hmainclient := Application.MainForm.ClientHandle;
                H := SetWindowsHookEx(WH_CBT, @CBTProc, 0, hmainclient);
                ShowWindow(hmainclient,SW_HIDE);
                prodll;
                UnhookWindowsHookEx(H)
            end;
        end;
    end;你帮我看下呢?好像不行,触发不到,指点下
      

  12.   

    问题解决了,
    用当前线程
    H := SetWindowsHookEx(WH_CBT, @CBTProc, 0, GetCurrentThreadId);
    就可以了感谢
    s11ss