4

Windows フォームで作成したフォームは、どこをクリックしてもドラッグできます。タイトルバーのクリックであったため、各クリックを順番に変更する WndProc 関数をオーバーライドして作成しました。

    //found at: http://stackoverflow.com/questions/3995009/how-to-make-a-window-draggablec-winforms
    private const int WM_NCHITTEST = 0x84;
    private const int HTCLIENT = 0x1;
    private const int HTCAPTION = 0x2;

    ///
    /// Handling the window messages 
    ///
    protected override void WndProc(ref Message message)
    {
        base.WndProc(ref message);

        if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
            message.Result = (IntPtr)HTCAPTION;
    }

問題は、ダブルクリックするとウィンドウが全画面表示になることです。これは望ましくありません。この動作をブロックするにはどうすればよいですか?

4

5 に答える 5

2

私はうまく機能しているJexと同じことをしました。

private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
private const int WM_LBUTTONDBLCLK = 0x00A3;

protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONDBLCLK)
        {
            return;
        }
        switch (m.Msg)
        {

            case WM_NCHITTEST:      
                base.WndProc(ref m);
                if ((int)m.Result == HTCLIENT)
                    m.Result = (IntPtr)HTCAPTION;
                return;
        }
        base.WndProc(ref m);
    }
于 2014-05-07T14:11:33.567 に答える
2

JaredPar に加えて、その方法でドラッグ可能なフォームを作成しないことをお勧めしますが、3 つのステップで処理します

  • フォーム上でマウスダウンを識別する
  • 捕獲マウス
  • マウスアップイベントを識別する

処理は複雑ではありません。フォームのダブルクリックを無効にする方が良いでしょう。

あなたがそれを行うことができる方法の完全な例については、見てみることができます

ドラッグ可能なボーダレス フォームの作成

于 2012-04-07T14:24:16.560 に答える
2

私は今日C++で同じ問題を抱えていました。JaredPar のソリューションを使用しましたが、WM_LBUTTONDBLCLK の代わりに WM_NCLBUTTONDBLCLK (0x00A3) を使用すると、うまくいきました。ダブルクリック メッセージは非クライアント (NC) 領域 (この場合は「仮想」タイトル バー (HTCAPTION)) から送信されているため、機能しています。

于 2013-09-19T20:39:42.777 に答える
1

解決しようとしている別の問題を引き起こした問題の解決策を見つけたようです。簡単なことを提案できれば、ウィンドウをドラッグ可能にするためのより良い解決策です。

InteropServices を using 宣言に追加します。

using System.Runtime.InteropServices;

コードについては次のとおりです。

    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;

    [DllImportAttribute("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd,
                     int Msg, int wParam, int lParam);
    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

次に、フォームの MouseDown イベントに移動して、これを貼り付けます。

        if (e.Button == MouseButtons.Left)
        {
            ReleaseCapture();
            SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        }

終わり。

于 2012-04-07T14:23:31.780 に答える
-1

オーバーライドしたウィンドウでダブルクリックがデフォルトの動作になるのを止めたいだけの場合は、メッセージWndProcを傍受しますWM_LBUTTONDBLCLK

private const int WM_LBUTTONDBLCLK = 0x0203;

...

protected override void WndProc(ref Message message) {
  if (message.Msg == WM_LBUTTONDBLCLK) {
    return;
  }

  base.WndProc(ref message);

  if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
    message.Result = (IntPtr)HTCAPTION;
}
于 2012-04-07T14:20:54.497 に答える