我们使用HTML工作室创建了帮助文件(.chm),
在Access 2007数据库表单属性中,我们设置了"Help File“= HelpApp.chm和"Help Context ID”propertiey = 1001,因此当我们按下F1时,它就会用这个上下文ID打开帮助文件。
问题是,当我们多次按F1 (每次针对不同的表单或帮助主题)时,它会打开帮助文件的多个实例。我还观察到,如果我多次按同一表单上的F1,它也会打开多个实例。
我们不希望创建多个帮助文件实例。
如何防止打开帮助文件的多个实例?
数据库应用程序正在开发的Microsoft 2007,.accdb文件格式。
正在创建的帮助文件HTML帮助讲习班4.74.8702.0
我搜索了internet,但是在Microsoft应用程序中没有有多个帮助文件实例打开的文章。但是有一篇文章讨论了C#应用程序,
How do I limit my Windows application to spawning a single instance of a process?
我不知道是否有上述解决方案,检查流程是否已经退出?还是ProcessStartInfo?但我需要这个在VBA。
发布于 2014-08-11 11:06:00
这个问题很困难,取决于如何调用帮助。您必须提供更多信息和调用VBA代码。在将Access窗口移动到一个新位置之后,我只看到过一次帮助窗口的多个实例的问题,然后按下F1按钮。但再也没见过。
我记得有一件事是hh.dat的问题。hh.dat文件将用户特定的信息存储在系统上的所有HTMLHelp文件(*.CHM)上(位置、最喜欢的主题、搜索历史记录等),如果它已经损坏,可能会导致错误。删除或重命名文件hh.dat以重置所有(!)将系统上的CHM窗口设置为默认设置。您应该在这个目录中找到hh.dat:
\文档和设置\%用户名%\应用程序数据\Microsoft\HTML帮助或
C:\Users\%username%\AppData\Roaming\Microsoft\HTML帮助
当您下次打开任何hh.dat文件时,Windows将创建一个新版本的.chm。
尝试将F1设置为AutoKeys (请参阅快照)。
添加一个由HTMLHelp API调用帮助的模块(请参阅代码示例):
Option Compare Database
Option Explicit
'******************************************************************************
'----- Modul - definition for HTMLHelp - (c) Ulrich Kulle, www.help-info.de
'----- 2014-08-26 Version 0.1.9000
'******************************************************************************
Declare Function IsWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Declare Function HtmlHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" _
(ByVal hwndCaller As Long, ByVal pszFile As String, _
ByVal uCommand As Long, ByVal dwData As Long) As Long
Declare Function HTMLHelpTopic Lib "hhctrl.ocx" Alias "HtmlHelpA" _
(ByVal hwndCaller As Long, ByVal pszFile As String, _
ByVal uCommand As Long, ByVal dwData As String) As Long
Private Declare Function HtmlHelpSearch Lib "hhctrl.ocx" Alias "HtmlHelpA" _
(ByVal hwndCaller As Long, ByVal pszFile As String, _
ByVal uCommand As Long, dwData As HH_FTS_QUERY) As Long
'--- to keep the handle of the HH windows when calling help by API --------
Public HHwinHwnd As Long
'--- some constants used by the API ---------------------------------------
Public Const HH_DISPLAY_TOPIC = &H0 ' select last opened tab, [display a specified topic]
Public Const HH_DISPLAY_TOC = &H1 ' select contents tab, [display a specified topic]
Public Const HH_DISPLAY_INDEX = &H2 ' select index tab and searches for a keyword
Public Const HH_DISPLAY_SEARCH = &H3 ' select search tab and perform a search
Public Const HH_HELP_CONTEXT = &HF ' display mapped numeric value in dwData
Public Const HH_CLOSE_ALL = &H12
Public Type HH_FTS_QUERY ' UDT for accessing the Search tab
cbStruct As Long ' Sizeof structure in bytes.
fUniCodeStrings As Long ' TRUE if all strings are unicode.
pszSearchQuery As String ' String containing the search query.
iProximity As Long ' Word proximity.
fStemmedSearch As Long ' TRUE for StemmedSearch only.
fTitleOnly As Long ' TRUE for Title search only.
fExecute As Long ' TRUE to initiate the search.
pszWindow As String ' Window to display in
End Type
Public Function HFile(ByVal i_HFile As Integer) As String
'----- Set the string variable to include the application path of helpfile
Select Case i_HFile
'//--- default help file
Case 1
HFile = CurrentProject.Path & "\CHM-example.chm"
Case 2
'----- Place other Help file paths in successive case statements
HFile = CurrentProject.Path & "\CHM-example.chm"
End Select
End Function
Public Sub OpenHelp(strHelpFile As String, lngID As Long)
Dim hWnd As Long
Dim strHelpFile As String
strHelpFile = CurrentProject.Path & "\CHM-example.chm"
hWnd = HtmlHelp(Application.hWndAccessApp, strHelpFile, HH_DISPLAY_TOC, lngID)
End Sub
Public Function CallHelp()
'//--- TEST invoking help with different methods ----------------------------------
'OpenHelp strHelpFile, 20010
'ShowContents 1
'ShowIndex 1
'ShowSearch 1
If Screen.ActiveForm.Name = "Coordinates-Form-1" Then
MsgBox Screen.ActiveForm.Name
ShowTopicID 1, 10010
ElseIf Screen.ActiveForm.Name = "Coordinates-Form-2" Then
MsgBox Screen.ActiveForm.Name
ShowTopicID 1, 20010
Else
ShowContents 1
End If
End Function
Public Sub ShowContents(ByVal intHelpFile As Integer)
HHwinHwnd = HtmlHelp(Application.hWndAccessApp, HFile(intHelpFile), HH_DISPLAY_TOC, 0)
End Sub
Public Sub ShowIndex(ByVal intHelpFile As Integer)
HHwinHwnd = HtmlHelp(Application.hWndAccessApp, HFile(intHelpFile), HH_DISPLAY_INDEX, 0)
End Sub
Public Sub ShowTopic(ByVal intHelpFile As Integer, strTopic As String)
HHwinHwnd = HTMLHelpTopic(Application.hWndAccessApp, HFile(intHelpFile), HH_DISPLAY_TOPIC, strTopic)
End Sub
Public Sub ShowTopicID(ByVal intHelpFile As Integer, IdTopic As Long)
HHwinHwnd = HtmlHelp(Application.hWndAccessApp, HFile(intHelpFile), HH_HELP_CONTEXT, IdTopic)
End Sub
'------------------------------------------------------------------------------
'----- display the search tab
'----- bug: start searching with a string dosn't work
'------------------------------------------------------------------------------
Public Sub ShowSearch(ByVal intHelpFile As Integer)
Dim searchIt As HH_FTS_QUERY
With searchIt
.cbStruct = Len(searchIt)
.fUniCodeStrings = 1&
.pszSearchQuery = "foobar"
.iProximity = 0&
.fStemmedSearch = 0&
.fTitleOnly = 1&
.fExecute = 1&
.pszWindow = ""
End With
Call HtmlHelpSearch(0&, HFile(intHelpFile), HH_DISPLAY_SEARCH, searchIt)
End Sub
https://stackoverflow.com/questions/25182899
复制