Определите, когда хук мыши обработал последнее сообщение - PullRequest
0 голосов
/ 16 ноября 2009

У меня есть форма, которая действует как выпадающий список, который я отображаю немодальным. Я прикрепляю крючок мыши к форме, чтобы определить, когда мышь щелкает по ней, чтобы я знал, чтобы закрыть ее, установив Visible = False.

Поскольку я хочу, чтобы HookProc обрабатывал последний щелчок, я не могу удалить Hook или свой Dropdown, пока не буду уверен, что мой обработчик событий вернулся в HookProc.

Это немного сложно объяснить, но я надеюсь, что приведенный ниже код делает его немного понятнее: -

//Loop to display the dropdown.
Dim dd as New DropDown
dd.Visible = True
Do While dd.Visible
    Application.DoEvents()
    NativeMethods.MsgWaitForMultipleObjectsEx(0, IntPtr.Zero, 250, &HFF, 4)
Loop
// I want to dispose dd now, but how can I be sure that e.Handled (See below)
// has been returned to HookProc?

//A handler within dropdown to determine what to do with the mouse click.
Private Sub DropDown_MouseHookClick(ByVal sender As Object, ByVal e As MouseClickEventArgs)
    If IWantToCloseTheDropDown Then
        e.Handled = True
        MyHook.UnHook
        Me.Visible = False
    End If
    // All done, e.Handled is returned to HookProc.
    // But which happens first? Will e.Handled arrive at HookProc first, or will
    // the form display loop, above, notice that Visible is now False?
End Sub

//The main part of the hooking class.
Public Function MouseHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
    Dim MyMouseHookStruct As MouseHookStruct = DirectCast(Marshal.PtrToStructure(lParam, GetType(MouseHookStruct)), MouseHookStruct)
    If nCode < 0 Then
        Return CallNextHookEx(hHook, nCode, wParam, lParam)
    Else
        Dim handle As Integer = MyMouseHookStruct.hwnd
        Dim c As Control = Control.FromHandle(New IntPtr(handle))
        If MouseUpOrDown Then
            Dim e As MouseHookClickEventArgs
            OnMouseClick(e)
            If e.Handled Then
                Return 1
            EndIf
        End If
        Return CallNextHookEx(hHook, nCode, wParam, lParam)
    End If
End Function

Ответы [ 2 ]

0 голосов
/ 19 ноября 2009

Вы обходите механизмы .NET для обработки событий Windows

Вам не нужно ничего нативного для работы с WinForms. Также весь код является сборщиком мусора, поэтому do НЕ ДОЛЖНО беспокоиться об удалении хуков

Возможно, вы захотите посмотреть на событие form.deactivate

0 голосов
/ 19 ноября 2009

Почему бы просто не обработать события фокуса? Form_LostFocus сообщит вам, когда они сосредоточатся на другом элементе управления / форме. В этот момент вы можете скрыть свою форму.

Хук мыши кажется излишним для определения, имеет ли ваша форма фокус или нет.

...