2017-06-07 5 views
1

私は以下のコードを持っており、そのボタンはタスクを実行できる唯一のボタンなので、ボタンの名前を知る必要があります。MessageFilter関数でボタン名を取得することはできますか?

Class MessageFilter 
    Implements IMessageFilter 
    Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage 
     If Form1.SavingData Then 
      Const WM_KEYDOWN As Integer = &H100 
      'Const WM_MOUSELEAVE As Integer = &H2A3 
      Const WM_MOUSE_LEFT_CLICK As Integer = &H201 

      Select Case m.Msg 
       Case WM_KEYDOWN, WM_MOUSE_LEFT_CLICK 
        ' Do something to indicate the user is still active. 
        Form1.SavingData = False 

        Exit Select 
      End Select 

      ' Returning true means that this message should stop here, 
      ' we aren't actually filtering messages, so we need to return false. 
     End If 

     Return False 
    End Function 
End Class 
+0

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.fromhandle(v=vs.110).aspx –

答えて

2

デフォルトのForm1インスタンスを使用せず、フォーム参照をメッセージフィルタのコンストラクタの引数として渡すことをお勧めします。既定のフォームインスタンスは、VB.NetにVB6コードの変換を容易にするためにVBに追加されます。

あなたはこのようなあなたのフィルタクラスを宣言する場合:

Class MessageFilter 
    Implements IMessageFilter 
    Private frm As Form1 
    Private targetButton As Button 
    Public Sub New(frm As Form1, targetbutton As Button) 
     Me.frm = frm 
     Me.targetButton = targetbutton 
    End Sub 

    Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage 
     Const WM_KEYDOWN As Integer = &H100 
     Const WM_MOUSE_LEFT_CLICK As Integer = &H201 

     If Me.frm.SavingData AndAlso 
      m.HWnd = Me.targetButton.Handle AndAlso 
      (m.Msg = WM_KEYDOWN OrElse m.Msg = WM_MOUSE_LEFT_CLICK) Then 
      Me.frm.SavingData = False 
     End If 
     ' Returning true means that this message should stop here, 
     ' we aren't actually filtering messages, so we need to return false. 
     Return False 
    End Function 
End Class 

あなたはこのようにフィルタを適用することができます

Private filter As MessageFilter 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    filter = New MessageFilter(Me, Me.Button2) 
    Application.AddMessageFilter(filter) 
End Sub 

これは、あなたが使用したい特定のボタンを指定することができます。フィルタは、そのNameプロパティを使用する代わりに、固有の値になるHandleプロパティを使用して、その特定のボタンにメッセージを送信するかどうかを確認します。

関連する問題