隐藏的对话框需要关注一会儿
我在这里遇到了一些问题。
我有第三方ActiveX控件将文件从一种类型转换为另一种类型。 我想转换很多文件,所以我需要在批量转换中运行它。 然而,这个控件崩溃了很多(我不是在谈论漂亮的C ++异常,它可以做一些可爱的事情,比如访问已经释放的内存,访问冲突,你的名字)。
所以我的问题是以下几点:
1)我需要将这个ActiveX控件包装在一个单独的进程中,以防止它破坏我的主进程的内存。
2)我需要调用这个过程数百次,并且在一台快速计算机上使用小文件时,它会被称为每秒5-6次
3)我需要使这个过程完全沉默,用户一定不会意识到一个进程正在被执行很多次
4)但是,因为它是一个ActiveX控件,我还需要在承载ActiveX控件的过程中创建一个隐藏对话框
但是,当我创建隐藏的对话框时,它似乎将焦点从活动窗口中取出一会儿,然后将其返回。 由于该过程每秒可以调用5-6次,因此会中断用户的键盘输入,并且还会使当前活动的窗口快速闪烁,从活动状态切换到非活动状态。
我使用CDialog派生类来托管ActiveX控件。 Visible标志从资源编辑器关闭以防止显示。 我通过调用CDialog :: Create而不是DoModal来创建对话框。
我怎样才能防止对话消除焦点?
很难说,没有看到任何源代码,但是....如果您覆盖CDialog派生类中的OnInitDialog,请尝试在方法结束时返回FALSE而不是TRUE。
只是猜测...
祝你好运。
原来问题完全在于CDialog。 即使没有ActiveX或任何修改,它也在偷窃焦点。 所以解决方法是创建我自己的使用DefWindowProc的窗口类,并将其用作ActiveX的父级(它确实需要一个父级,当我为pParent指定NULL时它失败了)。
它可能不是对话窃取焦点,它可能是ActiveX控件。 在没有AX的对话框中试试它,看它是否显示相同的行为。 CDialog :: Create确实创建了对话框,但在调用ShowWindow / UpdateWindow之前它不会显示它。
另外,我记得能够在不需要主机的情况下实例化ActiveX控件。 VS可以为它创建包装类,您可以使用它来动态创建。 ActiveX实际上是否需要一个对话框(比如输入控件来显示)?
链接地址: http://www.djcxy.com/p/39255.html上一篇: Hidden dialog takes focus for a moment
下一篇: How do I set focus to CEdit in child dialog that is inside TabCtrl?