2017-06-02 26 views
3

私はForm Border(タイトルバー)のマウスをちょっと手に入れようとしていましたが、それは壊れているようです(同じことを述べている数多くの記事を見つけました)。WndProc WM_NCMOUSEUPいいえ

私がテストしている:

Const WM_LBUTTONUP = &H202 
Const WM_MBUTTONUP = &H208 
Const WM_RBUTTONUP = &H205 
Const WM_NCXBUTTONUP = &HAC 
Const WM_XBUTTONUP = &H20C 
Const WM_MENURBUTTONUP = &H122 
Const WM_NCLBUTTONUP = &HA2 
Const WM_NCRBUTTONUP = &HA5 
Const WM_NCLBUTTONDOWN = &HA1 
Const WM_NCMOUSEMOVE = &HA0 

をかなり徹底的に。私が見ているのは、WM_NCLBUTTONUPは動作しませんが、WM_NCLBUTTONDOWNは動作し、リリース時にはWM_NCLBUTTONUPが必要ですが、代わりにWM_NCMOUSEMOVEを取得します。

:あなたは(フォームの境界線別名)クライアント領域の外にマウスを移動するたび期待どおりもWM_NCMOUSEMOVEを得ること。..

これを克服するための最初の試みであることの問題は、私が出ています「http://www.pinvoke.net/default.aspx/Constants.WMかなり密接にかかわらず、そしてドン:この

Private MouseIsDown As Boolean = False Protected Overrides Sub WndProc(ByRef m As Message) Const WM_NCLBUTTONDOWN = &HA1 Const WM_NCMOUSEMOVE = &HA0 If (m.Msg = WM_NCLBUTTONDOWN) Then MouseIsDown = True Console.WriteLine("NCLButtonDown") ElseIf (m.Msg = WM_NCMOUSEMOVE) Then If MouseIsDown Then Console.WriteLine("NCMouseMove" + Environment.NewLine + "LParam: " + m.LParam.ToString() + Environment.NewLine + "WParam: " + m.WParam.ToString() + Environment.NewLine + "Res: " + m.Result.ToString()) MouseIsDown = False Else Console.WriteLine("Not mouseup") End If Else End If MyBase.WndProc(m) End Sub 

は初期テストを通じて働くことだが、これは適切である場合、私は好奇心、または私は単純に行方不明ですメッセージがある場合は(私が通じ見てきました右のようなものは見ないでください)。

+5

私はこれをしようとすると、私は次のメッセージを得る:NCLBUTTONUPのためのドキュメントによるとWM_NCLBUTTONDOWN [161] WM_SYSCOMMAND [274] WM_CAPTURECHANGED [533] を:_if窓このメッセージは投稿されていません._おそらく、ボタンをクリックすることによって、ウィンドウがマウスをキャプチャしますか?ちょうど推測。 –

答えて

0

フォームインテンスでNativeWindowを使用するか、WndProcを呼び出すことができます Code Translator | VB WindowsMessages

これを試してみてください:

private NativeWnd _nativeWnd; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     _nativeWnd = new NativeWnd(this); 
    } 

    class NativeWnd : NativeWindow, IDisposable 
    { 
     public NativeWnd(Form owner) 
     { 
      base.AssignHandle(owner.Handle); 
     } 

     private enum WindowMessages 
     { 
      // non client mouse 
      WM_NCMOUSEMOVE = 0x00A0, 
      WM_NCLBUTTONDOWN = 0x00A1, 
      WM_NCLBUTTONUP = 0x00A2, 
      WM_NCLBUTTONDBLCLK = 0x00A3, 
      WM_NCRBUTTONDOWN = 0x00A4, 
      WM_NCRBUTTONUP = 0x00A5, 
      WM_NCRBUTTONDBLCLK = 0x00A6, 
      WM_NCMBUTTONDOWN = 0x00A7, 
      WM_NCMBUTTONUP = 0x00A8, 
      WM_NCMBUTTONDBLCLK = 0x00A9, 
     } 


     private bool MouseIsDown; 
     protected override void WndProc(ref Message m) 
     { 
      switch (m.Msg) 
      { 
       //Mouse Down 
       case (int)WindowMessages.WM_NCLBUTTONDOWN: 
       case (int)WindowMessages.WM_NCRBUTTONDOWN: 
       case (int)WindowMessages.WM_NCMBUTTONDOWN: 
        MouseIsDown = true; 
        Debug.Write("NCMouseDown"); 
        break; 
       //MouseMove 
       case (int)WindowMessages.WM_NCMOUSEMOVE: 

        if (MouseIsDown) 
        { 
         Debug.Write("NCMouseMove"); 
         MouseIsDown = false; 
        } 
        break; 
       //Mouse Up 
       case (int)WindowMessages.WM_NCRBUTTONUP: 
       case (int)WindowMessages.WM_NCLBUTTONUP: 
       case (int)WindowMessages.WM_NCMBUTTONUP: 
        Debug.Write("NCMouseUp"); 
        break; 
       default: 
        base.WndProc(ref m); 
        break; 
      } 
     } 

     #region IDisposable 

     public void Dispose() 
     { 
      base.ReleaseHandle(); 
     } 

     #endregion 
    } 
+0

私はこれが彼が問題を解決するのを助ける方法を見ていない。これをテストし、それが機能していることを確認しましたか? OPによると、 'WM_NCLBUTTONUP'は動作しません。 –

+0

確かに、私はそれを試みました。 'WM_NCLBUTTONDOWN'が** DefWndProc()**メソッドをデフォルトで呼び出すため、' WM_LBUTTONUP'は動作しません。コードは次のようになります:[link](https://1drv.ms/u/s!AphqixWU563eiiBc7sduu-JlcSnU) –

+0

あなたは 'WM_NCLBUTTONUP'を意味しますか?それはOPが問題を抱えているため、あなたのコードでうまくいかない場合は、彼の質問に答えません(私はそれをテストする立場にないので、私はこのコメントを書いています)。 –

関連する問題