2010-06-03 2 views
3

J'ai une forme sans marge qui est toujours au-dessus et avec WS_EX_NOACTIVATE drapeau défini pour l'empêcher de gagner le focus.C# Afficher le formulaire avec le flag WS_EX_NOACTIVATE

const int WS_EX_NOACTIVATE = 0x08000000; 

protected override CreateParams CreateParams { 
    get { 
     CreateParams param = base.CreateParams; 
     param.ExStyle |= WS_EX_NOACTIVATE; 
     return param; 
    } 
} 

formulaire contient une petite zone d'image pour déplacer (car il est sans frontières):

private void pictureBox4_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     ReleaseCapture(); 
     SendMessage(this.Handle, 0xa1, 0x2, 0); 
    } 
} 

Cependant, lorsque je déplace la fenêtre, il ne reçoit pas redessinée/montré, que lorsque je relâche le bouton de la souris ne il déplace le formulaire vers un nouvel emplacement.

J'ai vu des applications qui fonctionnent de la même manière, mais elles montrent la fenêtre en mouvement (par exemple, certains claviers virtuels que j'ai vus). J'ai également vu de nombreuses questions ailleurs sur le net à ce sujet mais sans réponse.

Quelqu'un peut-il s'il vous plaît me dire s'il est possible d'afficher une fenêtre/formulaire comme ça en se déplaçant (comme fenêtre "normale"), et si oui, comment le faire?

+0

La mise en forme du code nécessite de laisser une ligne vide avant et après. Merci de mentionner la propriété 'CreateParams', btw, je connais quelqu'un qui a eu du mal à faire exactement ce que vous faites ces derniers temps et je pense que je vais lui en parler. –

+0

Hmya, qu'est-ce que vous essayez vraiment de faire? Obtenir des messages de la souris nécessite d'obtenir le focus. –

+0

Il reçoit des messages, par exemple des clics de souris. Le programme lui-même est une sorte de clavier virtuel, il doit être sur le dessus mais ne pas avoir le focus pour que l'utilisateur par exemple puisse l'utiliser pour taper sur le bloc-notes. – Maks

Répondre

2

Je pense avoir trouvé une solution. Je serais très reconnaissant si quelqu'un pouvait vérifier pour voir si tout est fait correctement (aucun conflit avec les messages). J'ai changé le code ci-dessus pour déplacer la forme d'utiliser l'image, dans les éléments suivants: appels

[DllImportAttribute("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInstertAfter, int x, int y, int cx, int cy, uint flags); 

const int SWP_NOSIZE = 0x0001; 
const int SWP_NOZORDER = 0x0004; 

private void pictureBox4_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     //ReleaseCapture(); 
     //SendMessage(this.Handle, 0xa1, 0x2, 0); 
     SetWindowPos(Handle, IntPtr.Zero, this.Location.X + e.X, 
       this.Location.Y + e.Y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); 
    } 
} 

Donc, fondamentalement, j'ai enlevé ces deux méthode (fonction) et les repleaced avec SetWindowPos(). J'ai d'abord eu des problèmes avec le scintillement et le mauvais positionnement mais ensuite je me suis souvenu de vérifier si les coordonnées sont des coordonnées client ou écran ...

Questions connexes