2010-10-27 8 views
12

Je cherche à créer un formulaire en C# qui ne peut pas accepter le focus, c'est-à-dire lorsque je clique sur un bouton du formulaire, le focus n'est pas volé dans l'application qui a actuellement le focus. Voir le clavier à l'écran de Windows pour un exemple de ceci.Comment créer un formulaire "unfocusable" en C#?

Notez que lorsque vous cliquez sur un bouton, le focus n'est pas pris à partir de l'application que vous utilisez actuellement.

Comment puis-je implémenter ce comportement?

Mise à jour:

s'avère que c'est aussi simple que remplaçant la propriété CreateParams et en ajoutant WS_EX_NOACTIVATE au style de fenêtre étendu. Merci de m'indiquer dans la bonne direction! Malheureusement, cela a un effet secondaire indésirable qui perturbe le mouvement du formulaire, c'est-à-dire que vous pouvez toujours faire glisser le formulaire autour de l'écran mais la bordure de la fenêtre ne s'affiche pas pendant le glissement.

Si quelqu'un sait comment résoudre ce problème, il serait apprécié.

+0

Copie possible de [Afficher un formulaire sans détourner le focus?] (Https://stackoverflow.com/questions/156046/show-a-form-without-stealing-focus) – rugk

Répondre

9

Pour désactiver l'activation par la souris:

class NonFocusableForm : Form 
{ 
    protected override void DefWndProc(ref Message m) 
    { 
     const int WM_MOUSEACTIVATE = 0x21; 
     const int MA_NOACTIVATE = 0x0003; 

     switch(m.Msg) 
     { 
      case WM_MOUSEACTIVATE: 
       m.Result = (IntPtr)MA_NOACTIVATE; 
       return; 
     } 
     base.DefWndProc(ref m); 
    } 
} 

Pour afficher le formulaire sans activation (la seule manière qui a fonctionné pour moi en cas de forme sans frontières):

[DllImport("user32.dll")] 
    public static extern bool ShowWindow(IntPtr handle, int flags); 

    NativeMethods.ShowWindow(form.Handle, 8); 

méthode standard pour le faire (il semble que cela ne fonctionne pas pour tous les styles de formulaire):

protected override bool ShowWithoutActivation 
    { 
     get { return true; } 
    } 

S'il existe d'autres façons d'activer t Dans la forme, ils peuvent être supprimés de la même manière.

+1

Malheureusement, cela empêche la mise au point de la forme lorsque cliqué, cela n'empêche pas la dernière application de perdre le focus. Merci de m'avoir indiqué la bonne solution. – robinjam

+0

@robinjam Alors, quelle est la bonne solution? – jnm2

+1

@ jnm2 Vérifiez ma modification sur la question d'origine - vous voulez le style de fenêtre étendue 'WS_EX_NOACTIVATE'. https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543 – robinjam

Questions connexes