wake-up-neo.net

Wie verhindern Sie, dass Fenster verschoben werden?

Wie gehe ich vor, um das Verschieben eines Formulars zu stoppen? Ich habe den Formrahmenstil als FixedSingle festgelegt und möchte ihn auf diese Weise beibehalten, da er unter Vista gut aussieht :)

34
Ozzy

Schauen Sie sich diesen link an. Möglicherweise interessieren Sie sich für Option 3. Es wird erforderlich sein, dass Sie nativen Code einpacken, sollte aber funktionieren. Es gibt auch einen Kommentar am unteren Rand des Links, der einen einfacheren Weg zeigt. Aus dem Kommentar genommen (Ich kann es nicht anerkennen, aber ich werde Ihnen einige Suchen ersparen):

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);
}
64
Jason Down

Sie können die FormBorderStyle-Eigenschaft des Formulars auf None festlegen

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

Ich habe festgestellt, dass sich das Formular nicht bewegt (in 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);
        }

hier gefunden

8
V4Vendetta

Es ist keine gute Praxis, Ihre Form unbeweglich zu machen. Wenn ich Sie wäre, würde ich darüber nachdenken.
Sie können dies jedoch tun, indem Sie WinProc überschreiben, um das Menü [Move] im Systemmenü zu deaktivieren. 

[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);
}  

Sie können auch das OnMove-Ereignis Ihres Formulars behandeln. Aber ich denke, das wird flackern: 

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

Es ist nicht alles hübsch (wenn Sie versuchen, das Formular zu verschieben, blinken einige), aber Sie können die LocationChanged-Eigenschaft verwenden, um das Formular an dem gewünschten Ort zu behalten:

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;
    }
}

Aus Neugier; warum möchtest du das tun?

2
Fredrik Mörk

In Windows ist der WS_CAPTION-Stil der Nicht-Client-Bereich, in dem das Fenster mit der Maus verschoben werden kann. Der einfachste Weg, um das zu tun, was Sie möchten, besteht darin, diesen Stil aus Ihrem Fenster zu entfernen.

Wenn Sie jedoch eine Beschriftung benötigen und dennoch das erreichen, was Sie möchten, können Sie als Nächstes die WM_NCHITTEST-Nachricht erfassen und nach HTCAPTION suchen. Wenn der Code HTCAPTION ist, geben Sie stattdessen NTNOWHERE zurück. Dadurch wird verhindert, dass die Standardfensterprozedur das Standardelement für das Verschiebefenster ausführt.

2
Tommy Hui

Versuchen Sie, WndProc zu überschreiben:

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);
}
2
Reniuz
  1. Gehen Sie zu Formularereignisse-> Standort geändert

schreibe den folgenden Code

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

Ändern Sie einfach die FormBorderStyle-Eigenschaft in None.

1
Hamza Javed

Setzen Sie einfach den Speicherort des formlocation_changed -Ereignisses auf den Ort zurück, an dem es sich befand, d. H. Setzen Sie Form.Location vor dem Verschieben auf eine Variable. Wenn der Benutzer versucht, sie zu verschieben, wird er an den Variablenspeicherort zurückgesetzt, an dem Sie ihn festgelegt haben.

0
Riftus

Private Sub MyFormLock () Me.Location = Neuer Punkt (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

Ich würde Ihre Notwendigkeit in Frage stellen, das Formular unbeweglich zu machen. Das hört sich nicht schön an. Sie können natürlich die Position des Fensters speichern, wenn das Fenster geschlossen wird, und das Fenster wieder an dieser Position öffnen. Dies gibt dem Benutzer eine gewisse Kontrolle darüber, wo sich das Fenster befinden soll.

0
David McEwing

Ändern Sie die Form-Eigenschaft StartPostion in Manual . Behandeln Sie dann das LocationChanged-Ereignis:

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

Du kannst es versuchen:

this.Locked = true;
0
Dylan Roberts

Sie können das Ereignis Form.Move abonnieren und es neu positionieren.

0
Oded