4

我在 Windows Forms 中创建了一个表单,无论我点击哪里都可以拖动它。我通过重写 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

除了 JaredPar,我建议不要以这种方式创建可拖动的表单,而是分 3 步处理它

  • 在表单上识别鼠标
  • 捕获鼠标
  • 识别鼠标向上事件

处理起来并不复杂,更好的是,imo,然后禁用双击表单。

有关如何执行此操作的完整示例,请查看

创建可拖动的无边框表单

于 2012-04-07T14:24:16.560 回答
2

我今天在 C++ 中遇到了同样的问题。我使用了 JaredPar 的解决方案,但使用 WM_NCLBUTTONDBLCLK (0x00A3) 而不是 WM_LBUTTONDBLCLK,这对我有用!它之所以有效,是因为双击消息是从非客户端 (NC) 区域发送的,在这种情况下,它是“虚拟”标题栏 (HTCAPTION)。

于 2013-09-19T20:39:42.777 回答
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 回答
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 回答