Конференция "KOL" » Position message box
 
  • Jon © (12.08.08 13:20) [0]
    How can ShowMsg be centered on parent form instead of sreen?
  • azsd © (12.08.08 23:58) [1]
    you can use SetWindowHookEx to get rid of popuped MessageBox, or you can using an NewThreadEx() to create a thread, then get the message box by findwindow and move it. but I suggest to new a form with same layout like Messagebox then ShowModal() it.
  • Jon © (13.08.08 01:58) [2]
    Thanks for mentioning hooks!
    This is my solution:


    program Test;

    uses
     Windows, Messages, KOL;

    var
     Hook: HHOOK;

    function HookProc(Code,wParam,lParam: Integer): Lresult; stdCall;
    var
     Wnd: Hwnd;
     Rect: TRect;
     MB_Width, MB_Height: Integer;
    begin
     if Code < 0 then
       CallNextHookEx(Hook,Code,wParam,lParam);
     if Code = HCBT_ACTIVATE then
     begin
       Wnd := wParam;
       GetWindowRect(Wnd,Rect);
       MB_Width := Rect.Right - Rect.Left;
       MB_Height := Rect.Bottom - Rect.Top;
       MoveWindow(Wnd,Applet.Left + ((Applet.Width - MB_Width) div 2),Applet.Top + ((Applet.Height - MB_Height) div 2),MB_Width,MB_Height,True);
       UnhookWindowsHookEx(Hook);
     end;
     Result := CallNextHookEx(Hook,Code,wParam,lParam);
    end;

    procedure MouseDown(Dummy: Pointer; Sender: PControl; var Mouse: TMouseEventData);
    begin
     if Mouse.Button <> mbLeft then Exit;
     Hook := SetWindowsHookEx(WH_CBT,HookProc,0,GetCurrentThreadId);
     ShowMsg('>> Click! <<',MB_OK or MB_APPLMODAL or MB_SETFOREGROUND);
    //  UnhookWindowsHookEx(Hook);
    end;

    begin
     Applet := NewForm(nil,'Test').SetSize(640,480);
     Applet.OnMouseDown := TOnMouse(MakeMethod(nil,@MouseDown));
     Run(Applet);
    end.

 
Конференция "KOL" » Position message box
Есть новые Нет новых   [134431   +15][b:0][p:0.001]