【问题标题】:Hidden dialog takes focus for a moment隐藏的对话框暂时聚焦
【发布时间】:2012-04-01 04:45:07
【问题描述】:

我这里有点问题。

我有一个第三方 ActiveX 控件,可以将文件从一种类型转换为另一种类型。我想转换很多文件,所以我需要批量转换运行它。然而,这个控件经常崩溃(我不是在谈论好的 C++ 异常,它会做一些可爱的事情,比如访问已经释放的内存、进行访问冲突等等)。

所以我的问题如下:

1) 我需要将此 ActiveX 控件包装在一个单独的进程中,以防止它破坏我的主进程的内存。

2) 我可能需要调用这个过程数百次,并且对于快速计算机上的小文件,它每秒被调用 5-6 次

3) 我需要让这个进程完全静默,用户一定不会意识到一个进程被执行了很多次

4) 但是因为它是一个 ActiveX 控件,所以我还需要在承载 ActiveX 控件的进程中创建一个隐藏对话框

但是当我创建隐藏对话框时,它似乎会暂时从活动窗口中移开焦点,然后将其返回。由于这个过程每秒可以调用 5-6 次,它会中断用户的键盘输入,并且还会使当前活动的窗口快速闪烁,从活动状态切换到非活动状态。

我正在使用 CDialog 派生类来承载 ActiveX 控件。 Visible 标志从资源编辑器中关闭以防止其显示。我通过调用 CDialog::Create 来创建对话框,而不是 DoModal。

如何防止对话框带走焦点?

【问题讨论】:

    标签: c++ mfc focus activex


    【解决方案1】:

    没有看到任何源代码很难说,但是....如果您在 CDialog 派生类中重写 OnInitDialog,请尝试在方法末尾返回 FALSE 而不是 TRUE。

    只是猜测......

    祝你好运。

    【讨论】:

    • 谢谢,我尝试返回 FALSE,但子进程仍在关注。
    【解决方案2】:

    原来问题完全出在 CDialog 上。即使没有 ActiveX 或任何修改,它也正在窃取焦点。所以解决方案是创建我自己的使用 DefWindowProc 的窗口类,并将其用作 ActiveX 的父级(它确实需要一个父级,当我为 pParent 指定 NULL 时它失败了)。

    【讨论】:

      【解决方案3】:

      可能不是对话框窃取了焦点,可能是 ActiveX 控件。在没有 AX 的对话框上尝试它,看看它是否显示相同的行为。 CDialog::Create 确实创建了对话框,但在您调用 ShowWindow/UpdateWindow 之前它不会显示它。

      另外,我记得能够在不需要主机的情况下实例化 ActiveX 控件。 VS 可以为它创建包装类,您可以使用它们来动态创建。 ActiveX 是否真的需要一个对话框(例如,要显示的输入控件)?

      【讨论】:

      • 您好,感谢您的建议。 ActiveX 有一个包装类,它有自己的 Create 方法。我还尝试将其从对话框中删除,但对话框仍在窃取焦点。
      猜你喜欢
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多