Я пытаюсь настроить способ обработки сообщений 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