这发生在Word 2000,而不是Word 2007(我不知道其他版本)。
如何摆脱这种行为?
如何复制:
>创建一个新的VCL应用程序
>添加菜单
>添加TOleContainer,Align alClient,AllowInPlace和AllowActiveDoc True。
>使用TOleContainer,插入Word 97-2003文档
>在菜单栏中添加一个“关闭”,在其事件处理程序中,添加OleContainer1.DestroyObject,以便您可以停止编辑
>运行此应用程序,双击OleContainer,使其进入editmode
>现在打开Word 2000
>切换回您的应用程序,上下文菜单将不再工作。
编辑:
我在以下系统上复制了上述行为(使用Citrix):
Windows Server 2003企业版
5.2版(Build 3790.srv03_sp2_rtm.070216-1710:Service Pack 2)
Microsoft Word 2000(9.0.6926 SP-3)
我使用Delphi 7(构建8.1)来创建应用程序。
解决方法
基本上,如果您在失去或获得焦点时不告诉他们,并且每当您的顶级窗口获得或失去焦点时(即使他们的窗口中的孩子控制没有获得关注),那么他们可以去干线。
这是我打了很长时间的东西,特别令人沮丧的是,当你不得不告诉应用程序他们比你更了解的位置(比如当他们失去或直接获得焦点时),或者当他们创建一个弹出菜单,使焦点远离他们,并且必须以不同的方式处理一些其他应用程序/窗口的焦点,你将被遗弃…呃。
无论如何,Office应用程序应该公开一个IOleInPlaceActiveObject接口,您应该确保调用其OnFrameWindowActivate方法来告诉它关于激活/停用。
从记忆中,快速浏览我自己的托管办公室的代码,这是最重要的事情之一。忽略也是一件容易的事情,想想“呃,这不是什么关系……为什么会关心窗口是否活跃?”你可能会认为这只会导致一些小的化妆品问题(如果没有出现活动的话),但是可能导致整个事情被锁定或崩溃。相信我,办公室关心这样的事情太多了!我得到的印象是,在办公室的封面下,从合作多任务处理的时代起,仍然有一个非常老的单线程设计,当两个窗口似乎同时处于活动状态时,可能会感到困惑。
对不起,我不能给出更多的建议,而不仅仅是指向这个方向…编写ActiveX主机是一个黑色的艺术(所有的文档是面向被托管,不是主机()和唯一的方式,我得到我自己的代码工作经历了几个月的尝试和错误,并进行了大量的调试,这是一场噩梦,不幸的是。
最后一条建议:不要害怕为特定应用程序硬编码。这是IE本身所做的,使用注册表设置来控制哪些klud应用于什么(我怀疑有些硬编码到代码中)。 ActiveX是一个很不明确的混乱,各种控件都有自己的怪癖和错误,并且不可能编写一个干净,通用的主机与所有这些。 (修改一个修改将会破坏另一个)。您还将发现仅在IE尝试接口时才能正常工作,只因为它们只能通过IE进行测试;做点事情略有不同,它们分崩离析。