web-dev-qa-db-fra.com

Comment empêchez-vous les fenêtres d'être déplacées?

Comment ferais-je pour empêcher un formulaire d'être déplacé. J'ai le style de bordure de formulaire défini en FixedSingle et j'aimerais le conserver de cette façon, car il a l'air bien dans Vista :)

34
Ozzy

Jetez un oeil à ce link . Vous pourriez être intéressé par l'option n ° 3. Vous devrez envelopper du code natif, mais cela devrait fonctionner. Il y a aussi un commentaire au bas du lien qui montre un moyen plus facile de le faire. Tiré du commentaire (je ne peux pas en prendre le crédit, mais je vous épargne quelques recherches):

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

Vous pouvez définir la propriété FormBorderStyle du formulaire sur Aucune.

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

J'ai trouvé que cela empêchait le formulaire de bouger (son en 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);
        }

Trouvé ici

8
V4Vendetta

Ce n'est pas une bonne pratique de rendre votre formulaire inamovible. J'y penserais bien si j'étais toi.
Quoi qu'il en soit, vous pouvez le faire en remplaçant le WinProc pour désactiver le menu [Move] dans le menu système. 

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

En outre, vous pouvez gérer l'événement OnMove de votre formulaire. Mais je pense que cela va provoquer des scintillements: 

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

Ce n'est pas beau (il y a des clignotements lorsque vous essayez de déplacer le formulaire), mais vous pouvez utiliser la propriété LocationChanged pour conserver le formulaire à l'endroit souhaité:

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

Par curiosité; pourquoi voudriez-vous faire cela?

2
Fredrik Mörk

Sous Windows, le style WS_CAPTION est la zone non-client qui permet de déplacer votre fenêtre avec une souris. Donc, le moyen le plus simple de faire ce que vous voulez est de supprimer ce style de votre fenêtre.

Toutefois, si vous avez besoin d'une légende tout en obtenant ce que vous voulez, le prochain style consisterait à capturer le message WM_NCHITTEST et à vérifier la présence de HTCAPTION. Si le code est HTCAPTION, retournez NTNOWHERE à la place. Cela empêchera la procédure de fenêtre par défaut d’exécuter la fonction de fenêtre de déplacement par défaut.

2
Tommy Hui

Essayez de remplacer 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);
}
2
Reniuz
  1. Aller à la forme des événements-> Lieu modifié

écrire le code suivant

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

Il suffit de changer la propriété FormBorderStyle en None.

1
Hamza Javed

Il suffit de réinitialiser l’emplacement de l’événement formlocation_changed à son état actuel, c’est-à-dire de définir le Form.Location sur une variable avant son déplacement. Lorsque l’utilisateur essaie de le déplacer, il retourne à l’emplacement de la variable sur lequel il a été défini.

0
Riftus

Sous-maître privé MyFormLock () Me.Location = Nouveau 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
Manish Bhankharia

Je m'interroge sur votre besoin de rendre le formulaire inamovible. Cela ne sonne pas bien. Vous pouvez bien sûr enregistrer l'emplacement de la fenêtre lorsque celle-ci se ferme et rouvrir la fenêtre dans cette position. Cela donne à l'utilisateur un certain contrôle sur l'emplacement de la fenêtre.

0
David McEwing

remplacez la propriété de formulaire StartPostion par Manuel . Ensuite, gérez l'événement LocationChanged:

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

Tu peux essayer:

this.Locked = true;
0
Dylan Roberts

Vous pouvez vous abonner à l'événement Form.Move et vous en repositionner.

0
Oded