我这里有点小问题。
我有一个第三方ActiveX控件,它可以将文件从一种类型转换为另一种类型。我想转换很多文件,所以我需要批量转换。然而,这个控件经常崩溃(我不是在谈论漂亮的C++异常,它做了一些可爱的事情,比如访问已经释放的内存,执行访问冲突,等等)。
所以我的问题是:
1)我需要将这个ActiveX控件包装在一个单独的进程中,以防止它损坏我的主进程的内存。
2)我可能需要调用这个进程数百次,对于速度很快的计算机上的小文件,它每秒被调用5-6次
3)我需要让这个进程完全静默,用户一定不能意识到一个进程正在被多次执行
4)但是,因为它是一个ActiveX控件,所以我还需要在托管ActiveX控件的进程中创建一个隐藏的对话框
但当我创建隐藏对话框时,它似乎暂时将焦点从活动窗口中移走,然后又将其返回。由于这个过程每秒可以被调用5-6次,它会中断用户的键盘输入,还会使当前活动的窗口快速闪烁,从活动状态切换到非活动状态。
我正在使用一个CDialog派生类来承载ActiveX控件。资源编辑器中的Visible标志被关闭,以防止其显示。我通过调用CDialog::Create来创建对话框,而不是调用DoModal。
如何防止对话框移走焦点?
发布于 2012-03-23 22:20:31
事实证明问题完全出在CDialog身上。它甚至在没有ActiveX或任何修改的情况下也偷走了焦点。因此,解决方案是创建我自己的使用DefWindowProc的窗口类,并使用它作为ActiveX的父类(它确实需要一个父类,当我为pParent指定NULL时,它失败了)。
发布于 2012-03-16 05:49:20
很难在看不到任何源代码的情况下说你在你的CDialog派生类中重写了OnInitDialog,试着在方法的末尾返回FALSE而不是TRUE。
只是猜测..。
祝好运。
发布于 2012-03-16 16:12:30
可能不是对话框偷走了焦点,可能是ActiveX控件。在没有AX的对话框中尝试它,看看它是否显示出相同的行为。CDialog::Create确实创建了对话框,但直到您调用ShowWindow/UpdateWindow时才显示该对话框。
此外,我还记得能够实例化ActiveX控件,而不需要主机。VS可以为它创建包装器类,您可以使用这些包装器类来动态创建。ActiveX是否真的需要一个对话框(比如,显示输入控件)?
https://stackoverflow.com/questions/9723745
复制相似问题