0

ありがとう!! WM_MDICREATEメッセージを使用して、clientWndProcでmdi子のハンドルを取得したい

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 に答える