Ms Access CHM 帮助文件无法获得焦点

Ms Access CHM Help File Can't Get Focus

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

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

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

刚开始测试帮助文件时(在Win8.1机器上),它在Accesswindow前面正确打开,但现在不会了。有没有人对导致这种行为的原因有任何建议?

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

您可以致电 SetForegroundWindow() 来完成这项工作。 Someone has solved similar problem already,您只需将对 SetForegroundWindow()SetForegroundWindowNative() 的调用移植到 VBA.


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

尝试发出 VBA 的 AppActivate command – it has helped someone else

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

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


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

hh.dat 文件存储有关您系统上所有 HTML 帮助文件 (*.CHM) 的 user-specific 信息(位置、收藏主题、搜索历史等),如果它以某种方式被损坏,可能会导致错误。 删除或重命名文件 hh.dat 以将系统上的所有 (!) CHM windows 重置为默认设置。 您应该在这个目录中找到 hh.dat:

\Documents and Settings\%username%\Application Data\Microsoft\HTML Help

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


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

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

所以帮助 window 保持焦点的事实实际上是标准行为。

如果您查看典型的 HTML 帮助 API 调用,您会看到第一个参数指定 window 的 "handle",帮助来自叫:

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

如果开发人员将 "null" 而不是 window 句柄作为调用的第一个参数,则帮助 window 不再由调用程序拥有,因此也是如此不保持焦点。以下是修改后的调用示例:

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

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