151 votes

Afficher un formulaire sans voler l'attention?

J'utilise un formulaire pour afficher les notifications (il apparaît en bas à droite de l'écran), mais lorsque je montre ce formulaire, il vole le focus du formulaire principal. Y a-t-il un moyen d'afficher ce formulaire de "notification" sans voler l'attention?

172voto

Martin Plante Points 2286

Hmmm, est-ce que la simple substitution de Form.ShowWithoutActivation n'est pas suffisante?

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

Et si vous ne souhaitez pas que l'utilisateur clique sur cette fenêtre de notification, vous pouvez remplacer CreateParams:

 protected override CreateParams CreateParams
{
  get
  {
    CreateParams baseParams = base.CreateParams;

    baseParams.ExStyle |= ( int )( 
      Win32.ExtendedWindowStyles.WS_EX_NOACTIVATE | 
      Win32.ExtendedWindowStyles.WS_EX_TOOLWINDOW );

    return baseParams;
  }
}
 

72voto

TheSoftwareJedi Points 15921

Volé PInvoke.net de ShowWindow procédé:

 private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = -1;
private const uint SWP_NOACTIVATE = 0x0010;

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
     int hWnd,             // Window handle
     int hWndInsertAfter,  // Placement-order handle
     int X,                // Horizontal position
     int Y,                // Vertical position
     int cx,               // Width
     int cy,               // Height
     uint uFlags);         // Window positioning flags

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

static void ShowInactiveTopmost(Form frm)
{
     ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
     SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
     frm.Left, frm.Top, frm.Width, frm.Height,
     SWP_NOACTIVATE);
}
 

(Alex Lyman a répondu à cela, je ne fais que l’agrandir en collant directement le code. Quelqu'un avec des droits d’édition peut le copier là-bas et le supprimer pour tout ce qui m’intéresse;))

14voto

Alex Lyman Points 7480

Si vous êtes prêt à utiliser Win32 P / Invoke , vous pouvez utiliser la méthode ShowWindow (le premier exemple de code fait exactement ce que vous voulez).

9voto

Matthew Scharley Points 43262

Faire cela semble être un hack, mais cela semble fonctionner:

 this.TopMost = true;  // as a result the form gets thrown to the front
this.TopMost = false; // but we don't actually want our form to always be on top
 

Edit: Notez que cela ne fait que soulever une forme déjà créée sans voler le focus.

9voto

Micah Points 814

L'exemple de code de pinvoke.net dans les réponses d'Alex Lyman / TheSoftwareJedi fera de la fenêtre une fenêtre "la plus haute", ce qui signifie que vous ne pouvez pas la placer derrière des fenêtres normales après sa sortie. Étant donné la description de Matias de ce qu'il veut utiliser pour cela, cela pourrait être ce qu'il veut. Mais si vous voulez que l'utilisateur puisse placer votre fenêtre derrière d'autres fenêtres après l'avoir créée, utilisez simplement HWND_TOP (0) au lieu de HWND_TOPMOST (-1) dans l'exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X