Файл справки MS Access CHM не может получить фокус

Я открываю пользовательский файл справки (CHM), используя VBA и API 'HtmlHelp', например:

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

Файл справки открывается, но он скрыт за окном доступа, и хотя его значок отображается на панели задач, нажатие на значок все равно не выводит его на передний план - оно остается скрытым за доступом.

Когда я впервые начал тестировать файл справки (на компьютере с Win8.1), он правильно открылся перед окном доступа, но теперь этого не происходит. Кто-нибудь есть какие-либо предложения относительно того, что вызывает такое поведение?

2 ответа

Решение

Только некоторые мысли - но будьте осторожны с первым намеком:


Какой цели служит файл hh.dat?

Файл hh.dat хранит пользовательскую информацию обо всех файлах HTMLHelp (*.CHM) в вашей системе (позиция, избранные темы, история поиска и т. Д.) И может вызвать ошибку, если она каким-либо образом повреждена. Удалите или переименуйте файл hh.dat, чтобы сбросить все (!) Окна CHM в вашей системе к настройкам по умолчанию. Вы должны найти hh.dat в этом каталоге:

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

Windows создаст новую версию hh.dat при следующем открытии любого файла.chm.


В соответствии с документацией Microsoft HTML Help API ( http://msdn2.microsoft.com/en-us/library/ms644703(VS.85).aspx):

Любое окно справки, которое вы создаете через API справки HTML, принадлежит вызывающей или родительской программе. Это позволяет окну справки оставаться поверх своего родителя, но не быть поверх любой другой программы, которая имеет фокус.

Поэтому тот факт, что окно справки сохраняет фокус, на самом деле является стандартным поведением.

Если вы посмотрите на типичный вызов API справки HTML, то увидите, что первый параметр указывает "дескриптор" окна, из которого вызывается справка:

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

Если разработчик передает "ноль", а не дескриптор окна, в качестве первого параметра вызова, окно справки больше не принадлежит вызывающей программе и поэтому не сохраняет фокус. Вот пример модифицированного вызова:

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

Однако в этом есть недостаток: при вызове таким способом окно справки больше не связано с действиями вызывающей программы. Поэтому, если пользователь закрывает или сворачивает программу, окно справки также не закрывается и не сворачивается.

Я вижу, у вас есть hWnd - Как вы думаете, вы можете добавить код для отправки окна справки на передний план программно?

Ты можешь позвонить SetForegroundWindow() сделать работу. Кто-то уже решил подобную проблему, вам просто нужно перенести вызов на SetForegroundWindow() или же SetForegroundWindowNative() в VBA.


РЕДАКТИРОВАТЬ: Вы сообщаете о странном поведении, которое SetForegroundWindow() заставляет окно справки мигать ненадолго.

Попробуйте ввести команду VBA AppActivate - она помогла кому-то еще.

Если эта проблема не устранена, вы можете попробовать обходной путь, например изменить размер приложения и окно справки, чтобы показать их рядом.

Другие вопросы по тегам