代码之家  ›  专栏  ›  技术社区  ›  Vaccano

如何将ShowDialog显示的窗体中的消息附加到Application2?

  •  4
  • Vaccano  · 技术社区  · 14 年前

    我正在尝试使用这个代码 article

    如果您的应用程序只有一个窗体,那么这段代码非常有用。你打电话来 Application2.Run(myOnlyForm) 所有消息都通过Application2中的过滤器进行路由。

    但是如果你在任何时候打电话 mySecondForm.ShowDialog()

    有没有什么办法(没有不良副作用)让这些信息传播出去 mySecondForm 检查“Application2”事件筛选器?

    1. 改变 mySecondForm.ShowDialog Application2.Run(mySecondForm) .
    2. 改变 Application2.ShowDialog(mySecondForm)
      • 这将导致主菜单打开 mySecondForm公司 不工作(点击没有效果,只是嘟嘟声)。
        • common problem
        • 菜单项没有损坏。对菜单使用热键仍然有效。只按一下菜单是不行的。
    3. 改变 mySecondForm.ShowDialog Application2.ShowDialog(mySecondForm, true) (true=清除对话框)。

    理想的情况下,我想一种方式来附加一个表单的消息能力的应用程序2。

    但我欢迎任何建议。


    编辑: 基于对ctacke的建议,我做了以下工作:

    public static DialogResult ShowDialog2(this Form form)
    {
        //form.Activated += InsertMenu;
        //Application2.ShowDialog(form);
        form.Show();
        try
        {
            do
            {
                Application2.DoEvents();
            } while (form.Visible);
        }
        catch (ObjectDisposedException)
        {
            // This just means that the form was closed.  Not a big deal.
        }
        return form.DialogResult;
    
    }
    

    我最终调用showdiolog2而不是showdiolog2

    2 回复  |  直到 14 年前
        1
  •  2
  •   ctacke    14 年前

    我可以解释这种行为,但可能无法提供直接的解决方案。

    当你叫秀的时候 窗体中,窗体的事件由默认消息泵处理(该消息泵与要运行的调用一起设置)。调用ShowDialog时,目标窗体将获得自己的独立消息泵。

    现在,您添加的过滤器驻留在主消息泵中,它查看那里的所有消息,但是ShowDialog调用绕过了这一点—发送到对话框的消息永远不会到达过滤器。

    你能不能不使用ShowDialog的调用,而只是使用Show和一些类似保持表单最顶层的东西?这将允许过滤器获取伪对话框的所有消息。我可以马上想到的另一个选项是对话框的基类,它将通知回过滤器机制,但这开始变得非常难以控制。

        2
  •  0
  •   Blindy    14 年前

    WM_KEYUP , WM_MOUSEMOVE WM_LBUTTONUP 事件。

    WndProc PreProcessMessage 在你的状态下,让它做计时器重置的事情。您甚至可以创建一个基本表单(*),用于执行计时器/重置操作,并从中派生所有表单。对于一个真正的全局解决方案,让计时器是静态的。

    推荐文章