none
MessageBox什么时候是非模式的? RRS feed

  • 问题

  • 一个项目报出一个bug: messagebox弹起时,用户可以操作后台UI.

    而且是有些机型有时会出现这个现象,我想请问下什么情况下会出现这个bug?

    代码就不贴了,就是简单的一个MessageBox.Show(message, caption, MessageBoxButton.OK);

    2011年7月26日 6:49

答案

  • 虽然不知道原因,但是之后改成MessageBox.Show(this, message, caption, MessageBoxButton.OK);就好了。

    建议大家还是用这个调用方法,比较保险一点。

    • 已标记为答案 Colinfc 2011年9月21日 9:42
    2011年9月21日 9:42

全部回复

  • MessageBox模态只是阻塞了当前线程,如果你在另外一个线程弹出模态窗体,当然不会阻塞当前线程操作了。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月26日 8:14
    版主
  •       Hwnd hwnd = new WindowInteropHelper(this).Handle; 
          HwndSource src = HwndSource.FromHwnd(hwnd); 
          src.AddHook(new HwndSourceHook(WndProc));
    
    
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
          if (msg == 0x401)
          {
            MessageBox.Show(message, caption, MessageBoxButton.OK);
          }
    
        }


    这样的实现应该是在UI线程show的messagebox吧.

    而且并非每次都是非模式...是可能在某些机型上出现这种奇怪的情况.


    2011年7月26日 8:22
  • 单从代码来看是在UI线程的,不过我好奇这个0x401是什么消息?

    还有,仅仅这个代码和你所说的某些机型出问题,这就难办了,因为要解决任何一个问题,我们是不可能完全靠运气和猜测的,也许就是某些机器有其他组件挂了钩子呢,也许还有其它代码或者消息呢。所以我们需要做的是,缩小问题的范围,尽可能找到和发生问题相关的一些特征。

     

    提一下,WPF线程模型和一般的Winform的是不一样的,注意WPF线程的Dispatcher的作用,而WPF中的MessageBox实际上是通过向当前线程的Dispatcher 推一个循环Frame来造成阻塞的 (调用 System.Windows.Threading.Dispatcher.PushFrame(new System.Windows.Threading.DispatcherFrame()); ),所以就有一个问题,如果当前线程没有一个调度器 Dispatcher, 那么MessageBox 就无法起到阻塞。请确认你的UI或者你问题发生时的代码是否是一个WPF线程,是否有调度器 (调用 Thread.CurrentThread == App.Current.Dispatcher.Thread  检查)。或者你也可以看看VS的Threads窗口 (菜单 〉调试 〉窗口 〉线程,在设置断点后,可以找到这个选项)

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月26日 9:52
    版主
  • 有结果了吗?


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月27日 19:23
    版主
  • 0401我瞎写的,代码里面是个自定义的消息,我这边没能重现出对方测试的现象,因此也暂时无法调试.

    现在也只能从代码那里看看是否有什么问题了...

    2011年7月28日 7:02
  • 试着看看是不是有什么防火墙软件或者杀毒软件导致这个问题,还有有一些翻译软件可能也会进行挂勾子的,所以这个软件可能会处理你的程序的消息,导致一些奇怪的问题,你可以往这个方向看一下。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月28日 11:56
    版主
  • Check if you show the modal dialog inside another modal dialog's OnInitDialog, if so, the original modal dialog will become modalless.

     

    2011年7月29日 18:15
  • 虽然不知道原因,但是之后改成MessageBox.Show(this, message, caption, MessageBoxButton.OK);就好了。

    建议大家还是用这个调用方法,比较保险一点。

    • 已标记为答案 Colinfc 2011年9月21日 9:42
    2011年9月21日 9:42