8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Winforms-如何使 MessageBox 显示在 MainForm 的中心?

Gus D 2月前

60 0

Winforms-如何让对话框显示在 MainForm 的中心?这与基于普通窗口默认设置相反,后者将它们显示在屏幕的中心。在我的例子中,我有一个小的

Winforms-如何使对话框显示在 MainForm 的中心?这与基于普通窗口默认设置(将对话框显示在屏幕中心)相反。

在我的例子中,我有一个小的主窗体,例如,它可能被放置在一个角落里,MessageBox 弹出窗口显示在看似很远的地方。

帖子版权声明 1、本帖标题:Winforms-如何使 MessageBox 显示在 MainForm 的中心?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Gus D在本站《winforms》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 不需要自制消息框或 GetForegroundWindow、EnumWindows、AutomationElement.RootElement.FindAll、SetWindowsHookEx 等。

    当消息框打开或者关闭的时候都会向窗体发送WM_ACTIVATE消息,然后就可以得到消息框的窗口句柄(LParam)。

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg) {
        case Pinvoke.WM_ACTIVATE:
            Debug.WriteLine($"{MethodBase.GetCurrentMethod().Name} {DateTime.Now.ToString("HH:mm:ss.fff")} {m.ToString()}");
            if (m.LParam == IntPtr.Zero) break;
            if (_messageBoxCaption == null) break; // donot call MessageBox.Show
            if ((ushort)m.WParam.ToInt32() != 0/*WA_INACTIVE*/) break; // maybe close messagebox
    
            // check messagebox
            if (Pinvoke.GetWindowProcessId(m.LParam) != Process.GetCurrentProcess().Id) break;
            string className = Pinvoke.GetClassName(m.LParam);
            if (className == null || className != "#32770") break; // not dialog
            if (_messageBoxCaption != Pinvoke.GetWindowText(m.LParam)) break; // another caption
    
            // move messagebox
            //Debug.WriteLine("messageBox detected");
            Rectangle rect = Pinvoke.GetWindowRect(m.LParam);
            Pinvoke.MoveWindow(m.LParam, this.Left + this.Width / 2, this.Top + this.Height / 2, rect.Width, rect.Height, true);
            break;
        }
    
        base.WndProc(ref m);
    }
    

    GetWindowProcessId 是 GetWindowThreadProcessId 的包装器。根据需要添加其他 Pinvoke 方法。如果要尽可能减少 P/Invoke,请将其替换为 UIAutomation。

    private string _messageBoxCaption = null; // messageBox caption
    
    _messageBoxCaption = caption;
    ret = MessageBox.Show(this, text, caption, ...);
    _messageBoxCaption = null;
    
返回
作者最近主题: