0

谢谢!!我希望使用 WM_MDICREATE 消息在 clientWndProc 中获取 mdi child 的句柄

procedure TFrmMain.ClientWndProc(var Message: TMessage);
var
Hwnd : HWND;
procedure Default;
begin
 with Message do
  Result := CallWindowProc(FClientWndProc, ClientHandle, Msg, wParam, lParam);
end;

begin
case Message.Msg of
  WM_MDICREATE:
   begin
    hwnd := Message.LParam; //dont' work
    hwnd := TWMMDICreate(Message).MDICreateStruct^.lparam; //don't work
   Default;
   end;

  end;

  inherited ClientWndProc(Message);
  end;

我想在启动 MDICHILD 时将下一个过程(ChildProc)绑定到 MainForm 的 ClientWndProc 过程中

    function childProc(hwnd: HWND;  msg, wParam,lParam: LongInt): LongInt; stdcall;
    begin
     if msg = WM_SYSCOMMAND then
      begin
       CallWindowProc(p,hwnd,msg,wparam,lparam);
        if WParam = SC_MINIMIZE then
          //do something
       end;

    result := CallWindowProc(p,hwnd,msg,wparam,lparam);

    end;

我需要新儿童形态的手柄,类似的东西

        P := Pointer(SetWindowLong(ActiveMDIChild.Handle, GWL_WNDPROC, integer(@Child)));
4

2 回答 2

7

根据以下文档WM_MDICREATE

返回值

类型:HWND

如果消息成功,则返回值是新子窗口的句柄。

如果消息失败,则返回值为 NULL。

所以,答案是窗口过程返回的值的窗口句柄。Message.Result在你调用了继承的窗口过程之后把它读出来。

如果您想要在创建窗口之前获得窗口句柄,那么您就不走运了!

于 2012-09-20T13:12:07.690 回答
0

非常感谢!你的回答很完美

  procedure TMain.ClientWndProc(var Message: TMessage);
   begin

      case Message.Msg of

         WM_MDICREATE:
          begin
          inherited ClientWndProc(Message);
          with Message do
          FindControl(Result).Tag := SetWindowLong(Result, GWL_WNDPROC, Integer(@MDIChildProc));
          Exit; 
          end;

       end;

   end;
于 2012-09-21T13:30:57.337 回答