おそらくネイティブの方法で、右マウスボタンを保持しているボーダーレスのウィンフォームを移動します
-
27-10-2019 - |
質問
クライアントエリアに右マウスボタンを保持して、Windowsフォームを移動したい状況があります。私が述べたように、それはボーダーレスです。
私はそれを「ネイティブに」動かしたいと思います(可能であれば、そうでなければ他の答えも大丈夫です)。タイトルバーの左マウスボタンを保持したときの動作を意味します(マウスモーブなど、多くの奇妙な行動が得られますが、たぶんそれは私だけかもしれません)。
私はたくさんのことを読んでいます、そしてこの投稿は役に立ちました
私はそれを使用するためにさまざまな方法を試みて、通り抜けました http://msdn.microsoft.com/en-us/library/ff468877%28v = vs.85%29.aspx 他の有用なものを見つけるために、WM_NCRBUTTONDOWNが私の頭の中に来ましたが、WNDProcはそれを検出しません。
どんな提案にも感謝されています、ありがとう
フランチェスコ
解決
public partial class DragForm : Form
{
// Offset from upper left of form where mouse grabbed
private Size? _mouseGrabOffset;
public DragForm()
{
InitializeComponent();
}
protected override void OnMouseDown(MouseEventArgs e)
{
if( e.Button == System.Windows.Forms.MouseButtons.Right )
_mouseGrabOffset = new Size(e.Location);
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
_mouseGrabOffset = null;
base.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (_mouseGrabOffset.HasValue)
{
this.Location = Cursor.Position - _mouseGrabOffset.Value;
}
base.OnMouseMove(e);
}
}
他のヒント
これを完了するには、2つのp/invokeメソッドが必要です。
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);
[DllImport("user32.dll")]
static extern bool ReleaseCapture();
いくつかの定数:
const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;
を処理します MouseDown
フォームでイベントをしてから、これを行います。
private void Form_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ReleaseCapture();
SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
}
}
これにより、マウスがクリックしてキャプションエリアを押したときに受け取るのと同じイベントがフォームに送信されます。マウスを動かし、窓が動きます。マウスボタンを放すと、動きが停止します。非常に簡単。
所属していません StackOverflow