Form non déplaçable [Résolu]

Signaler
Messages postés
68
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
23 février 2011
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bourjour à tous,
Est ce que quelqu'un saurait comment empècher le déplacement d'une fenêtre ?
Merci d'avance.

6 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
44
Salut,

trouvé sur les forums MSDN, a ajouter dans le code de ta Form

<hr />

protected
override
void WndProc(
ref
Message m)
{
   if (m.Msg 0x216 || m.Msg 0x214)
   { 

      RECT rc;
      rc.Left =
this.Left;
      rc.Top =
this.Top;
      rc.Bottom =
this.Bottom;
      rc.Right =
this.Right;

      Marshal.StructureToPtr(rc, m.LParam,
false);
      m.Result = (
IntPtr)1;

      return;
   }

   base.WndProc(
ref m);
}[

StructLayout(
LayoutKind.Sequential)]

public
struct
RECT
{

   public
int Left;

   public
int Top;

   public
int Right;

   public
int Bottom;
}
<hr />

Mx
MVP C# 
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
arrrrrggggg... la freetextbox

private const int WM_NCHITTEST = 0x84;
private const int HTCAPTION = 2;
private const int HTCLIENT = 1;


protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);


    if (m.Msg WM_NCHITTEST && m.Result new IntPtr(HTCAPTION)) {
        m.Result = new IntPtr(HTCLIENT);
    }
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
le plus simple est de faire une surcharge de WndProc et d'intercepter le message WM_NCHITTEST (0x84 si je me souviens bien)

et si la valeur retournée est HTCAPTION, on retourne HTCLIENT

exemple :

protected override void WndProc(ref Message m) {
   base.WndProc(ref m);
   
   if (m.Result == HTCAPTION) 
      m.Result = HTCLIENT;
}
avec : HTCAPTION 2 et HTCLIENT 1

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
oops... j'ai oublié un truc :

protected override void WndProc(ref Message m) {
   base.WndProc(ref m);
      if (m.Message WM_NCHITTEST && m.Result HTCAPTION) 
      m.Result = HTCLIENT;
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
après vérification... et correction, voici un code qui marche ;)

private

const
int WM_NCHITTEST = 0x84;

private
const
int HTCAPTION = 2;

private
const
int HTCLIENT = 1;

protected
override
void WndProc(
ref
Message m)
{

   base.WndProc(
ref m);
   if (m.Msg WM_NCHITTEST && m.Result
new
IntPtr (HTCAPTION)) {
      m.Result =
new
IntPtr(HTCLIENT);
   }
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Seb, sur le forum Aogie avait donné une version plus élégante qui permet de préserver le double click sur la barre de titre.

private const int WM_NCLBUTTONDOWN = 0x00A1;
private const int HTCAPTION = 2;


protected override void WndProc( ref Message m )
{
    if ( m.Msg != WM_NCLBUTTONDOWN || m.WParam != ( IntPtr )HTCAPTION )
        base.WndProc( ref m );
}