2013-11-20 5 views
0

Я пытаюсь настроить способ обработки сообщений wndproc.Как я могу правильно установить возвращаемое значение Windows Message, вызвав метод и передав возвращаемое значение?

В классе у меня есть простой WNDPROC перекрытых к югу, и когда ИЗВЕСТНОЕ сообщение обрабатывается, то я поднимаю событие с этой информацией сообщения, это то, как я обработка события:

Public Class Form1 

Private WithEvents WndMessages As New WndProcClass(Form2) 

Private Sub MessageHandler(ByVal sender As Object, 
          ByVal e As WndProcClass.MessageInterceptedEventArgs) _ 
Handles WndMessages.MessageIntercepted 

    If e.ID = WndProcClass.Messages.WM_CREATE Then 
     MsgBox(e.Result) ' Result = 0 
     WndMessages.ReturnValueToLastMessage(-1) 
    If e.ID = WndProcClass.Messages.WM_CLOSE Then 
     WndMessages.ReturnValueToLastMessage(0) 
    End If 

End Sub 

Private Shadows Sub Shown() Handles MyBase.Shown 
    Form2.Show() 
End Sub 

End Class 

Ну, Теперь я хотел бы попробовать создать метод, который мог бы установить возвращаемое значение для поднятого сообщения (обратите внимание на WndMessages.ReturnValueToLastMessage(-1) в коде выше), и там, где я полностью потерян, я не знаю, как я мог реализовать этот метод, когда я пытаюсь установить возвращаемое значение, значение не изменяется всегда, является нулевым для этого сообщения.

Это класс WndProc:

#Region " WndProc Class " 

Public Class WndProcClass 
    Inherits NativeWindow 
    Implements IDisposable 

#Region " Variables " 

    ''' <summary> 
    ''' The form to manage Windows Messages. 
    ''' </summary> 
    Private WithEvents form As Form = Nothing 

    ''' <summary> 
    ''' Stores the message arguments. 
    ''' </summary> 
    Private MessageArgs As New MessageInterceptedEventArgs 

#End Region 

#Region " Events " 

    ''' <summary> 
    ''' Event raised when a known message is processed. 
    ''' </summary> 
    Public Event MessageIntercepted As EventHandler(Of MessageInterceptedEventArgs) 
    Public Class MessageInterceptedEventArgs : Inherits EventArgs 

     Public Property ID As Messages 
     Public Property IDWin32Hex As String 
     Public Property HWND As IntPtr 
     Public Property LParam As IntPtr 
     Public Property WParam As IntPtr 
     Public Property LParamAsCoordinate As Point 
     Public Property WParamAsCoordinate As Point 

     ''' <summary> 
     ''' Return value. 
     ''' </summary> 
     Public Property Result As String 

    End Class 

#End Region 

#Region " Message Enumeration " 

    Public Enum Messages As Integer 

     ''' <summary> 
     ''' Sent as a signal that a window or an application should terminate. 
     ''' </summary> 
     WM_CLOSE = &H10 

    End Enum 

#End Region 

#Region " Constructor " 

    Public Sub New(ByVal form As Form) 

     ' Set the Formulary. 
     Me.form = form 

     ' Assign the form handle. 
     SetFormHandle() 

    End Sub 

#End Region 

#Region " Event Handlers " 

    Private Sub SetFormHandle() _ 
    Handles Form.HandleCreated, Form.Load, Form.Shown 

     Try 
      If Not Me.Handle.Equals(Me.form.Handle) Then 
       Me.AssignHandle(Me.form.Handle) 
      End If 
     Catch ' ex As InvalidOperationException 
     End Try 

    End Sub 

    Private Sub OnHandleDestroyed() _ 
    Handles Form.HandleDestroyed 

     Me.ReleaseHandle() 

    End Sub 

#End Region 

#Region " Windows Messages Method " 

    Protected Overrides Sub WndProc(ByRef m As Message) 

     If [Enum].IsDefined(GetType(Messages), m.Msg) Then 

      With MessageArgs 
       .HWND = m.HWnd 
       .ID = [Enum].Parse(GetType(Messages), m.Msg) 
       .IDWin32Hex = "&H" & CStr(Hex(m.Msg)) 
       .LParam = m.LParam 
       .WParam = m.WParam 
       .LParamAsCoordinate = New Point(m.LParam) 
       .WParamAsCoordinate = New Point(m.LParam) 
       .Result = m.Result 
      End With 

      RaiseEvent MessageIntercepted(Me, MessageArgs) 

     End If 

     ' Return Message to base message handler. 
     MyBase.WndProc(m) 

    End Sub 

#End Region 

' Private LastMessage As Message 
Public Sub ReturnValueToLastMessage(ByVal value As IntPtr) 
    ' LastMessage.Result = value 
    ' MyBase.WndProc(LastMessage) 
End Sub 

End Class 

#End Region 

ответ

0

Я нашел решение, просто мне нужно было byrefering сообщения.

Я изменил это:

Public Event MessageIntercepted As EventHandler(Of MessageInterceptedEventArgs) 

К этому еще:

Public Event MessageIntercepted(ByRef m As Message, ByVal args As MessageInterceptedEventArgs) 

И вызвавший событие, как это:

RaiseEvent MessageIntercepted(m, MessageArgs) 

Так что теперь я могу играть с сообщением результаты:

Private WithEvents WindowsMessages As New WndProcClass(Me) 

Private Sub WindowsMessageHandler(ByRef m As Message, ByVal e As WndProcClass.MessageInterceptedEventArgs) _ 
Handles WindowsMessages.MessageIntercepted 

    If e.ID = WndProcClass.KnownMessages.WM_NCHITTEST Then 

     If CType(e.Result, NCHitTest) = NCHitTest.Top Then 

      m.Result = New IntPtr(NCHitTest.Caption) 

     End If 

    End If 

End Sub