使用menustrip移动无边框形式

时间:2012-03-30 01:51:42

标签: c# winforms

我正在寻找一种使用menustrip来移动表单的方法。

虽然有一些解决方案,但我不喜欢它们的特殊问题。为了使这些方法起作用,在拖动menustrip之前,需要先关注表单。

有没有办法解决这个特定问题,所以menustrip实际上会表现得像一个合适的Windows标题栏?

1 个答案:

答案 0 :(得分:4)

最好的选择是使用pinvoke。将“mousedown”事件与您想要拖动的事件联系起来。

using System.Runtime.InteropServices;

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

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

public Form1()
{
    InitializeComponent();
}

private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
}

这仍然需要重点关注表单,但您可以使用鼠标悬停进行处理。它并不优雅,但它确实有效。

private void menuStrip1_MouseHover(object sender, EventArgs e)
{
    Focus();
}

更新:Hover有一点延迟,mousemove响应更快

private void menuStrip1_MouseMove(object sender, MouseEventArgs e)
{
    if (!Focused)
    {
        Focus();
    }
}