0

我正在使用 VBA 和 api 'HtmlHelp' 打开一个自定义帮助文件 (CHM),例如:

hWnd = HtmlHelp(Application.hWndAccessApp, sFile, HH_HELP_CONTEXT, context_id)

帮助文件打开,但它隐藏在 Access 窗口后面,尽管它的图标显示在任务栏中,但单击该图标仍然不会将其带到前台 - 它仍然隐藏在 Access 后面。

当我第一次开始测试帮助文件时(在 Win8.1 机器上),它在 Access 窗口前正确打开,但现在它不会。有没有人对导致这种行为的原因有任何建议?

4

2 回答 2

2

只是一些想法 - 但要小心第一个提示:


文件 hh.dat 的用途是什么?

hh.dat 文件存储有关您系统上所有 HTMLHelp 文件 (*.CHM) 的用户特定信息(位置、喜爱的主题、搜索历史等),如果它以某种方式损坏,可能会导致错误。删除或重命名文件 hh.dat 以将系统上的所有 (!) CHM 窗口重置为其默认设置。您应该在此目录中找到 hh.dat:

\Documents and Settings\%username%\Application Data\Microsoft\HTML 帮助

当您下次打开任何 .chm 文件时,Windows 将创建一个新版本的 hh.dat。


根据微软的 HTML 帮助 API 文档(http://msdn2.microsoft.com/en-us/library/ms644703(VS.85).aspx):

您通过 HTML 帮助 API 创建的任何帮助窗口都归调用程序或父程序所有。这允许帮助窗口保持在其父程序之上,但不在任何其他具有焦点的程序之上。

因此,帮助窗口保持焦点的事实实际上是标准行为。

如果您查看一个典型的 HTML 帮助 API 调用,您会看到第一个参数指定调用帮助的窗口的“句柄”:

 HtmlHelp(hwndCaller,"YourHelpFile.chm",HH_HELP_CONTEXT,1001); 

如果开发人员传递“null”而不是窗口句柄作为调用的第一个参数,则帮助窗口不再归调用程序所有,因此不保留焦点。这是一个修改后的调用示例:

HtmlHelp(0,"YourHelpFile.chm",HH_HELP_CONTEXT,1001);

但是,这样做有一个缺点:当以这种方式调用时,帮助窗口不再受调用程序的操作的约束。因此,如果用户关闭或最小化程序,帮助窗口也不会关闭或最小化。

于 2015-09-04T10:43:38.787 回答
0

我看到你有hWnd- 你认为你可以添加代码以编程方式将帮助窗口发送到前台吗?

你可以打电话SetForegroundWindow()来做这项工作。有人已经解决了类似的问题,您只需要将调用移植到 VBASetForegroundWindow()SetForegroundWindowNative()转入 VBA。


SetForegroundWindow()编辑:您报告了使帮助窗口仅短暂闪烁的奇怪行为。

尝试发出 VBA 的AppActivate 命令——它帮助了其他人

如果此问题仍然存在,您可以尝试一些解决方法,例如调整应用程序和帮助窗口的大小以并排显示它们。

于 2015-09-02T04:43:25.580 回答