【问题标题】:Ms Access CHM Help File Can't Get FocusMs Access CHM 帮助文件无法获得焦点
【发布时间】:2015-09-02 01:41:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 桌面上的其他窗口有什么奇怪的问题吗? (如果有,请先尝试重新启动 PC。)
  • @maxhugen :在 CHM 文件编译过程中是否有任何选项更改,例如喜欢扩展样式 > 第一次测试后的 TopMost?

标签: vba ms-access chm html-help


【解决方案1】:

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


文件 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);

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

【讨论】:

  • 我按照您的建议重命名了 hh.dat 文件,它似乎已经修复了问题。帮助文件现在按预期运行。干杯!
【解决方案2】:

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

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


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

尝试发出 VBA 的 AppActivate command - 它有 helped someone else

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

【讨论】:

  • 我试过 SetForegroundWindow()。我短暂地看到了帮助文件,然后它消失在 Access 后面。我发现如果我点击访问,帮助将重新出现!如果我然后单击帮助窗口标题栏,它会消失,但如果我单击窗口的“正文”,帮助屏幕不会消失,我可以在帮助中导航等。很奇怪。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多