首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >隐藏对话框可暂时获得焦点

隐藏对话框可暂时获得焦点
EN

Stack Overflow用户
提问于 2012-03-16 00:15:36
回答 3查看 507关注 0票数 2

我这里有点小问题。

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

所以我的问题是:

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

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

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

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-23 22:20:31

事实证明问题完全出在CDialog身上。它甚至在没有ActiveX或任何修改的情况下也偷走了焦点。因此,解决方案是创建我自己的使用DefWindowProc的窗口类,并使用它作为ActiveX的父类(它确实需要一个父类,当我为pParent指定NULL时,它失败了)。

票数 1
EN

Stack Overflow用户

发布于 2012-03-16 05:49:20

很难在看不到任何源代码的情况下说你在你的CDialog派生类中重写了OnInitDialog,试着在方法的末尾返回FALSE而不是TRUE。

只是猜测..。

祝好运。

票数 1
EN

Stack Overflow用户

发布于 2012-03-16 16:12:30

可能不是对话框偷走了焦点,可能是ActiveX控件。在没有AX的对话框中尝试它,看看它是否显示出相同的行为。CDialog::Create确实创建了对话框,但直到您调用ShowWindow/UpdateWindow时才显示该对话框。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9723745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档