powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отследить событие появления окна Help (нужен его hwnd) по F1?
8 сообщений из 8, страница 1 из 1
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38365107
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую сформулировать:
Есть App
У него есть файл справки .chm.
Код: vbnet
1.
 App.HelpFile = App.Path & "\" & "proga.chm"


При вызове справки вызывается окно справки (htmlhelp).
Это окно можно вызвать
1) нажав F1
2) через API напр. так
Код: vbnet
1.
hwndHelp = HTMLHelp(0, App.Path & "\" & "proga.chm", HH_DISPLAY_TOPIC, ByVal Combo1.Text)


Это одно и то жк единственное окно (неважно как вызывали), "привязано" к App и закрывается вместе с App.

При использовании HTML Help API Function всегда возвращается hwnd этого окна. Здесь более менее ясно.

Вопрос:
1) Как отследить момент когда окно Help появилось? OnHelp (????)
Хотя бы если это явилось следствием нажатия F1.
Но важен не факт нажатия F1 а факт появления окна Help привязанного к App.
2) Соответственно найти его hwnd по факту появления.


Конечной целью является кастомизация-стилизация окна хэлпа по факту его появления.
Как здесь: 14699711 (это реально)
...
Рейтинг: 0 / 0
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38365289
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю что
HHN_WINDOW_CREATE message
Но надо играться.
...
Рейтинг: 0 / 0
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38365504
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нажатие F1 генерит сообщение WM_HELP message

В этот момент hwnd доступно, взять его можно через
HH_GET_WIN_HANDLE command

Но для этого нужен "the name of the window type whose handle you want to return".
Это задается в hhp файле chm -проекта:
Код: html
1.
2.
[WINDOWS]
MyProgaHelp=,"Table of Contents.hhc",,"Introduction_Main.htm",,,,,,0x2120,,0x3006,,,,,,,, 1


MyProgaHelp -это и есть "window type"
1 в конце это "notification ID (referred to as idNotify)" -обеспечивает генерацию Notification Messages от окна хэлпа через сабклассинг вызывающего окна.
http://msdn.microsoft.com/en-us/library/office/aa164216(v=office.10).aspx

Итого имеем:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Public Help_Created As Boolean

Public Function NewFormMeWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
  Dim uNMHDR  As NMHDR

  If IsWinVista And ThemesEnabled(Form1.hwnd) Then
    Select Case Msg
      Case WM_HELP ' по нажатию F1
        Debug.Print "WM_HELP"
        Dim hwndHelp As Long
        hwndHelp = HTMLHelp(Form1.hwnd, App.Path & "\" & "proga.chm", HH_GET_WIN_HANDLE, ByVal "MyProgaHelp")
        Help_Created = True
        If hwndHelp <> 0 Then ApplyHelpStyle hwndHelp
      Case WM_NOTIFY
        CopyMemory uNMHDR, ByVal lParam, Len(uNMHDR)
        Select Case uNMHDR.code
          Case HHN_WINDOW_CREATE 'вызов через Help API, но стиль применять еще рано
            Debug.Print "HHN_WINDOW_CREATE"
            Help_Created = True
          Case HHN_NAVCOMPLETE
            'Debug.Print "HHN_NAVCOMPLETE"
            If Help_Created Then
              hwndHelp = HTMLHelp(Form1.hwnd, App.Path & "\" & "proga.chm", HH_GET_WIN_HANDLE, ByVal "MyProgaHelp")
              If hwndHelp <> 0 Then ApplyHelpStyle hwndHelp
            End If
          Case HHN_TRACK
            'Debug.Print "HHN_TRACK"
            If Help_Created Then
              hwndHelp = HTMLHelp(Form1.hwnd, App.Path & "\" & "proga.chm", HH_GET_WIN_HANDLE, ByVal "MyProgaHelp")
              If hwndHelp <> 0 Then ApplyHelpStyle hwndHelp
            End If
        End Select
      Case Else
    End Select
  End If
    
  NewFormMeWindowProc = CallWindowProc( _
   OldFormMeWindowProc, hwnd, Msg, wParam, _
   lParam)
End Function




Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
'при вызове Help-а через API (напр. нажали кнопку Help)
'срабатывает только почле HHN_WINDOW_CREATE
Private Sub Combo1_Click()
  Dim hwndHelp As Long
  hwndHelp = HTMLHelp(Me.hwnd, App.Path & "\" & "proga.chm", HH_DISPLAY_TOPIC, ByVal Combo1.Text)
  If IsWinVista And ThemesEnabled(Form1.hwnd) Then
    If hwndHelp <> 0 Then
      If Help_Created Then
        ApplyHelpStyle hwndHelp
      End If
    End If
  End If
End Sub



Ну а стиль применяется так, делаю стандартное вистовское TreeView:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Public Sub ApplyHelpStyle(hwndHelp As Long)
  Dim hwndHHChild As Long
  Dim hwndTv As Long
  Do
    hwndHHChild = FindWindowEx(hwndHelp, hwndHHChild, "HH Child", vbNullChar)
    If hwndHHChild = 0 Then Exit Do
    hwndTv = FindWindowEx(hwndHHChild, 0, "SysTreeView32", vbNullChar)
    If hwndTv <> 0 Then Exit Do
  Loop
  If hwndTv <> 0 Then
    Dim lStyle As Long
    SetWindowTheme hwndTv, StrPtr("explorer"), 0
    'линии не нужны - не стильно,гориз. scroll не нужен
    SetWindowLong hwndTv, GWL_STYLE, (GetWindowLong(hwndTv, GWL_STYLE) Or TVS_HASBUTTONS Or TVS_LINESATROOT Or TVS_NOHSCROLL) And Not TVS_HASLINES
    'применяем горизонт. авто-scroll и фейдер (стрелка что вместо +/- растворится при потере фокуса формой)
    lStyle = SendMessage(hwndTv, TVM_GETEXTENDEDSTYLE, 0, 0)
    lStyle = lStyle Or TVS_EX_FADEINOUTEXPANDOS Or TVS_EX_AUTOHSCROLL Or TVS_EX_DOUBLEBUFFER
    Call SendMessageLong(hwndTv, TVM_SETEXTENDEDSTYLE, 0, ByVal lStyle)
    
    Help_Created = False
    Debug.Print "Style applied"
  End If
End Sub



Т.е. либо
F1 -> WM_HELP -> hwndHelp

Либо
hwndHelp=HTMLHelp(HH_DISPLAY_TOPIC) - HHN_WINDOW_CREATE срабатывает раньше

Частный случай - когда Context (дерево Navigation Pane) в справке скрыт на момент открытия, для этого и нужны махинации с HHN_NAVCOMPLETE, HHN_TRACK и Help_Created - не 100% грамотно но все же.

Думаю как сделать чтобы
Navigation Pane всегда отображалась при открытии .chm -независимо от того как обстояло дело при последнем закрытии файла .chm.


С иконками бы в дереве еще разобраться, "обновить" бы их.
...
Рейтинг: 0 / 0
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38365526
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77С иконками бы в дереве еще разобраться, "обновить" бы их.
Стандартный метод описан здесь:
Change or Create Icons for Contents Entries
Но попахивает гнилью.
Там предполагается рисовать свой image-strip - полоску-битмап из 14-42 картинок (не ICO !!!), при этом похоже еще таскать эту фигню за .chm проектом.

Либо от затеи надо отказываться (потому как опять увлекся), либо...

Думаю можно создать свой API-ImageList из 32-битных иконок (как я делаю в своих TreeView) и попытаться подменить стандартный ImageList (-ы ??) на свой через API - в своей ф-ции ApplyHelpStyle, которая выше. Главное, чтоб htmlhelp -хрень не пыталась перерисовывать свои книжки обратно, в чем я не уверен. Но попробовать можно.
По идее должно сработать. TreeView там не VB-шный (не OCX-совкий), перерисовывать картинки назад думаю не должен.
...
Рейтинг: 0 / 0
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38365546
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Думаю можно создать свой API-ImageList из 32-битных иконок (как я делаю в своих TreeView) и попытаться подменить стандартный ImageList (-ы ??) на свой через API - в своей ф-ции ApplyHelpStyle, которая выше. Главное, чтоб htmlhelp -хрень не пыталась перерисовывать свои книжки обратно, в чем я не уверен. Но попробовать можно.
По идее должно сработать. TreeView там не VB-шный (не OCX-совкий), перерисовывать картинки назад думаю не должен.
Да вроде все получилось. Думаю как ниже лучше смотрится.
Если еще с тулбаром побороться по этому же принципу...картинки выдрать из какого-нибудь нового IE и т.п.
...
Рейтинг: 0 / 0
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38367001
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Если еще с тулбаром побороться по этому же принципу...картинки выдрать из какого-нибудь нового IE и т.п.
Как-то так... как на картинке.
...
Рейтинг: 0 / 0
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38367002
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее можно еще попробовать нарисовать тематический ребар и вставить тулбар в него (тулбар в html-help на голой форме).
Все-таки API это сила.
...
Рейтинг: 0 / 0
Как отследить событие появления окна Help (нужен его hwnd) по F1?
    #38368364
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77нарисовать тематический ребар и вставить тулбар в него
Ну, как то так. Правда несколько мелочей не сумел сделать совсем по-человечески.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отследить событие появления окна Help (нужен его hwnd) по F1?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]