防止隐藏的Word实例从我的应用程序中窃取焦点

时间:2014-08-27 22:58:10

标签: vba delphi ms-word

我有一个从Word模板上的宏调用的Delphi ActiveX。它管理文档并在单词实例中打开它们。

在其中的一部分,我使用另一个隐藏的单词实例来生成打开前要显示的文档的文本预览。

TBlobField(fieldbyname( cdocumentDatafield)).SaveToFile(tmpDocPath +HTMLDOCPREVIEWFILE);
DMMain.WordApphtml.documents.Open(tmpDocPath +HTMLDOCPREVIEWFILE);
DMMain.WordApphtml.activedocument.Saveas(tmpDocPath +HTMLPREVIEWFILE, wdFormatText);
DMMain.WordApphtml.activedocument.Close;

变量就像这样创建

dmmain.Wordapphtml :=  CreateOleObject('Word.Application');
dmmain.WordApphtml.Visible := false;

基本上,代码从数据库中转储文件,在隐藏的单词实例中打开文件并将其保存为文本文件然后加载。

我的问题是,在生成文本文件并加载它之后,我的应用程序失去了焦点(它仍然显示在单词之上,但是如果我按下某个键,则没有任何反应)。我认为隐形应用程序现在具有焦点

2 个答案:

答案 0 :(得分:2)

最简单的方法就是“偷”"重点关注......

SetActiveWindow(Application.Handle)

或者您希望特定表单处于活动状态

SetActiveWindow(MySpecialForm.Handle)

答案 1 :(得分:0)

最后,我通过代码点击我的表单来修复它。使用此SO hack来实现目标。

    SavedGridPosition :=  THackDBGrid(DBGridRecipes).cellRect(0,THackDBGrid(DBGridRecipes).row);
    SavedGridPoint.X  := SavedGridPosition.Left;
    SavedGridPoint.Y :=  SavedGridPosition.Top;

    SavedGridPoint := ClientToScreen(SavedGridPoint) ;

    SavedGridPoint.X := savedgridpoint.x + dbgridRecipes.Left;

然后在我创建了我的预览文档后,我称之为点击事件。

setcursorpos(SavedGridPoint.X, savedgridpoint.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

似乎工作