web-dev-qa-db-ja.com

ウィンドウの移動を防ぐにはどうすればよいですか?

フォームの移動を停止する方法を教えてください。私はフォームの境界線スタイルをFixedSingleに設定しましたが、Vistaで見栄えが良いので、この方法を維持したいと思います:)

37
Ozzy

これを見てください link 。オプション#3に興味があるかもしれません。ネイティブコードをラップする必要がありますが、動作するはずです。リンクの下部には、簡単な方法を示すコメントもあります。コメントから取られた(それを信用することはできませんが、検索を保存します):

protected override void WndProc(ref Message message)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MOVE = 0xF010;

    switch(message.Msg)
    {
        case WM_SYSCOMMAND:
           int command = message.WParam.ToInt32() & 0xfff0;
           if (command == SC_MOVE)
              return;
           break;
    }

    base.WndProc(ref message);
}
70
Jason Down

フォームのFormBorderStyleプロパティをNoneに設定できます

this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.None
26
crypted

私はこれがフォームの移動を停止することがわかりました(C#で)

protected override void WndProc(ref Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MOVE = 0xF010;

            switch (m.Msg)
            {
                case WM_SYSCOMMAND:
                    int command = m.WParam.ToInt32() & 0xfff0;
                    if (command == SC_MOVE)
                        return;
                    break;
            }
            base.WndProc(ref m);
        }

ここにあります

9
V4Vendetta

WndProcをオーバーライドしてみてください。

protected override void WndProc(ref Message m)
{
   const int WM_NCLBUTTONDOWN = 161;
   const int WM_SYSCOMMAND = 274;
   const int HTCAPTION = 2;
   const int SC_MOVE = 61456;

   if ((m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_MOVE))
   {
       return;
   }

   if ((m.Msg == WM_NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION))
   {
       return;
   }

   base.WndProc(ref m);
}
3
Reniuz

フォームを動かせないようにすることはお勧めできません。私があなただったら、それについてアグファインだと思います。
とにかく、WinProcをオーバーライドしてシステムメニューの[移動]メニュー項目を無効にすることで、これを行うことができます。

[DllImport("user32.dll")]
private static extern Int32 EnableMenuItem ( System.IntPtr hMenu , Int32uIDEnableItem, Int32 uEnable);  
private const Int32 HTCAPTION = 0×00000002;  
private const Int32 MF_BYCOMMAND =0×00000000;  
private const Int32 MF_ENABLED =0×00000000;  
private const Int32 MF_GRAYED =0×00000001;  
private const Int32 MF_DISABLED =0×00000002; 
private const Int32 SC_MOVE = 0xF010; 
private const Int32 WM_NCLBUTTONDOWN = 0xA1;
private const Int32 WM_SYSCOMMAND = 0×112;
private const Int32 WM_INITMENUPOPUP = 0×117;

protected override void WndProc(ref System.Windows.Forms.Message m )
{
if (m.Msg == WM_INITMENUPOPUP)
{
    //handles popup of system menu
    if ((m.LParam.ToInt32() / 65536) != 0) // 'divide by 65536 to get hiword
    {
        Int32 AbleFlags = MF_ENABLED;
        if (!Moveable)
        {
            AbleFlags = MF_DISABLED | MF_GRAYED; // disable the move
        }
        EnableMenuItem(m.WParam, SC_MOVE, MF_BYCOMMAND | AbleFlags);
    }
}
if (!Moveable)
{
    if (m.Msg == WM_NCLBUTTONDOWN) //cancels the drag this is IMP
    {
        if (m.WParam.ToInt32() == HTCAPTION) return;
    }
    if (m.Msg == WM_SYSCOMMAND) // Cancels any clicks on move menu
    {
        if ((m.WParam.ToInt32() & 0xFFF0) == SC_MOVE) return;
    }
}
base.WndProc(ref m);
}  

また、フォームのOnMoveイベントを処理できます。しかし、これはいくつかのちらつきを引き起こすと思います:

private void Form1_Move(object sender, EventArgs e)
{
    this.Location = defaultLocation;
}
2
Kamyar

すべてがきれいなわけではありません(フォームを移動しようとすると点滅が発生します)が、LocationChangedプロパティを使用して、フォームを希望の場所に保持できます。

private Point _desiredLocation;
// assign the _desiredLocation variable with the form location at some
// point in the code where you know that the form is in the "correct" position


private void Form_LocationChanged(object sender, EventArgs e)
{
    if (this.Location != _desiredLocation)
    {
        this.Location = _desiredLocation;
    }
}

好奇心から。なぜあなたはこれをしたいのですか?

2
Fredrik Mörk

Windowsでは、WS_CAPTIONスタイルは、マウスでウィンドウを移動できる非クライアント領域です。したがって、必要な操作を行う最も簡単な方法は、このスタイルをウィンドウから削除することです。

ただし、キャプションが必要なのに目的を達成する必要がある場合、次のスタイルはWM_NCHITTESTメッセージをキャプチャし、HTCAPTIONを確認することです。コードがHTCAPTIONの場合、代わりにNTNOWHEREを返します。これにより、デフォルトのウィンドウプロシージャがデフォルトのウィンドウ移動を実行できなくなります。

2
Tommy Hui
  1. フォームイベントに移動->場所を変更

次のコードを書きます

Location = new Point(this.Width,this.Height);
2
Prasad Bhosale

FormBorderStyleプロパティをNoneに変更するだけです。

1
Hamza Javed

Formlocation_changedイベントの場所を元の場所にリセットするだけです。つまり、Form.Locationを移動する前に変数に設定し、ユーザーが移動しようとすると、設定した変数の場所に戻ります。

0
Riftus

Private Sub MyFormLock()Me.Location = New Point(0、0)End Sub

Private Sub SearchSDR_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
    Call MyFormLock()
End Sub
0

フォームを動かせないようにする必要性に疑問を呈します。これはいい感じではありません。もちろん、ウィンドウが閉じるときにウィンドウの場所を保存し、その位置にウィンドウを再度開くこともできます。これにより、ユーザーはウィンドウを配置する場所をある程度制御できます。

0
David McEwing

フォームプロパティStartPostionをManualに変更します。次に、LocationChangedイベントを処理します。

private void frmMain_LocationChanged(object sender, EventArgs e)
{
Location = new Point(0, 0);
}
0
sayadyanh

あなたが試すことができます:

this.Locked = true;
0
Dylan Roberts

Form.Move イベントとそこからの再配置。

0
Oded