隐藏的对话框需要关注片刻

时间:2012-03-15 16:15:36

标签: c++ mfc focus activex

我在这里遇到了一些问题。

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

所以我的问题如下:

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

2)我需要将这个过程调用数百次,并且在快速计算机上使用小文件,每秒调用5-6次

3)我需要让这个过程完全无声,用户一定不能意识到进程多次被执行

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

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

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

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

3 个答案:

答案 0 :(得分:1)

很难说没有看到任何源代码但是....如果你在CDialog派生类中覆盖OnInitDialog,尝试在方法结束时返回FALSE而不是TRUE。

猜猜......

祝你好运。

答案 1 :(得分:1)

事实证明问题完全在于CDialog。即使没有ActiveX或任何修改,它也在窃取焦点。因此,解决方案是创建我自己的使用DefWindowProc的窗口类,并将其用作ActiveX的父级(它确实需要父级,当我为pParent指定NULL时失败)。

答案 2 :(得分:0)

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

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