Windows mobile 如何将ShowDialog显示的表单中的消息附加到Application2?

Windows mobile 如何将ShowDialog显示的表单中的消息附加到Application2?,windows-mobile,compact-framework,opennetcf,python-idle,Windows Mobile,Compact Framework,Opennetcf,Python Idle,我正在尝试使用本文中的代码,让您知道应用程序何时空闲 如果您的应用程序只有一个表单,则此代码非常有效。您在其上调用Application2.Run(myOnlyForm),所有消息都会通过Application2中的过滤器路由 但是,如果在任何时候调用mySecondForm.ShowDialog(),该对话框都不会通过应用程序2过滤其消息 是否有任何方法(没有不良副作用)让mySecondForm上的消息通过“Application2”事件过滤器 我试过: 将mySecondForm.Show

我正在尝试使用本文中的代码,让您知道应用程序何时空闲

如果您的应用程序只有一个表单,则此代码非常有效。您在其上调用
Application2.Run(myOnlyForm)
,所有消息都会通过Application2中的过滤器路由

但是,如果在任何时候调用
mySecondForm.ShowDialog()
,该对话框都不会通过应用程序2过滤其消息

是否有任何方法(没有不良副作用)让mySecondForm上的消息通过“Application2”事件过滤器

我试过:

  • mySecondForm.ShowDialog
    更改为
    Application2.Run(mySecondForm)
    • 这会导致窗口在超出范围时无法清理,并且在需要时无法显示
  • mySecondForm.ShowDialog
    更改为
    Application2.ShowDialog(mySecondForm)
    • 这会导致
      mySecondForm
      上的主菜单不起作用(单击无效,只会发出嘟嘟声)。
      • 这似乎是我应该使用的,但我需要在屏幕上显示菜单。这似乎是OpenNETCF的一个优势
      • 菜单项没有损坏。在菜单中使用热键仍然有效。仅仅点击菜单是不起作用的
  • mySecondForm.ShowDialog
    更改为
    Application2.ShowDialog(mySecondForm,true)
    (true=清理对话框)。
    • 这不起作用,因为我需要在对话框关闭几次后才能访问它
  • 理想情况下,我想要一种将表单附加到Application2的消息功能的方法

    但我欢迎任何建议


    编辑: 根据对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;
    
    }
    

    最后我打电话给ShowDialog2而不是ShowDialog请原谅我的提问,但是为什么你要为这么简单的事情费这么大的劲?查看您链接的文章,它所做的只是启动一个计时器,并在每次
    WM\u KEYUP
    WM\u MOUSEMOVE
    WM\u LBUTTONUP
    事件中重置它

    您可以通过覆盖表单中的
    WndProc
    PreProcessMessage
    并让它执行计时器重置操作来实现同样的效果。您甚至可以创建一个基本表单(*),用于执行计时器/重置操作,并从中派生所有表单。对于真正的全局解决方案,将计时器设为静态


    (*)不要将其标记为抽象,否则表单设计师会发出嘶嘶声。

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

    在任何窗体上调用Show时,该窗体的事件由默认消息泵处理(该消息泵是通过调用Run设置的)。当您调用ShowDialog时,目标表单将获得自己的独立消息泵

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

    现在我们添加了Application2.ShowDialog调用,试图解决这个问题,但老实说,虽然我编写了整个Application.Run/IMEssageFilter实现,但我没有执行ShowDialog解决方案,我真的不知道它的实现情况如何。根据你的报告,我冒昧地猜测“不好”,尽管这确实不是一个简单的问题要解决。这个问题的根源在于,当您调用Show和ShowDialog时,SDF无法控制BCL中发生的事情——我们只是试图超越它,尽可能提供最佳行为。在这种情况下,这是有问题的


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

    这听起来很有趣。您知道使用C#(compact framework)实现此功能的一个例子吗?这是一个合理的建议,但它确实要求每个向解决方案中添加表单的开发人员实现计时器或从您的自定义库派生。这也使得表格对其他项目的可移植性降低。在大多数情况下,这些都不是问题,但请注意它们,因为它们确实会增加支持和维护成本,并略微降低可扩展性。感谢您提供的信息!我将尝试“展示”方法。我想这将适用于我的全屏表单。