2010-04-23 1 views
1

J'ai quelques fenêtres ancrées aux bords/coins de la zone de travail, et j'ai besoin de savoir si/quand le WorkingArea de l'écran change afin que je puisse mettre à jour la position de ces fenêtres. J'ai essayé d'aborder cela en vain, si je me souviens bien.Comment puis-je savoir quand WorkingArea d'un écran change (c'est-à-dire que la barre des tâches est déplacée)?

+0

Quel type de panneau utilisez-vous pour la zone de travail? Quelle langue, WinForms ou WPF? –

+0

Eh bien j'utilise WPF pour la plupart (les fenêtres sont des fenêtres WPF), mais en utilisant WinForms pour obtenir le WorkingArea via System.Windows.Forms.Screen.PrimaryScreen.WorkingArea. – devios1

Répondre

0

Un moyen serait d'enregistrer vos fenêtres comme une barre d'outils de bureau Application (AppBar) http://msdn.microsoft.com/en-us/library/bb776821(VS.85).aspx Ensuite, le système vous enverra des notifications lorsque la fenêtre doit être repositionné, redimensionné, etc. Par exemple, une barre d'accès reçoit une notification de ABN_POSCHANGED le système quand quelque chose se produit qui affectera la taille/position/visiblity etc. de l'AppBar. Voici un article de Code Project sur le faire avec C#, bien que je ne l'ai fait qu'en C++, donc je ne peux pas garantir l'article, mais ce devrait être un bon point de départ. http://www.codeproject.com/KB/dotnet/AppBar.aspx

+0

Merci pour la réponse. Je noterai ceci comme une bonne idée, même si j'ai fini par adopter une approche différente (plus simple, mais pas aussi élégante) (voir article). – devios1

0

je fini juste prendre l'approche très simple de l'exécution d'un DispatcherTimer qui fait tic tac toutes les deux secondes et vérifie simplement le workingarea courant contre la dernière vérification workingarea, l'envoi d'un événement si elles sont différentes.

0

1- Créez une propriété dans votre formulaire qui enregistre le dernier emplacement de workingArea ou de la dernière image (comme dans l'exemple de code).

2- Remplacer LocationChanged dans votre formulaire pour vérifier si le nouvel emplacement du formulaire est sur un nouveau WorkingArea. Si oui, le formulaire est sur un nouvel écran (zone de travail).

protected override void OnLocationChanged(EventArgs e) 
    { 
     base.OnLocationChanged(e); 
     WorkingScreen = Screen.AllScreens.ToList().FirstOrDefault(s => s.WorkingArea == Screen.GetWorkingArea(this)); 
    } 

    Screen _WorkingScreen = null; 

    Screen WorkingScreen 
    { 
     get { return _WorkingScreen; } 
     set 
     { 
      if (WorkingScreen != value) 
      { 
       _WorkingScreen = value; 
       // Screen changed or working area changed!!!! 
      } 
     } 
    } 
+1

Salut Alnaouq et bienvenue sur le site! Ce serait bien si vous pouviez ajouter du texte pour clarifier comment et pourquoi votre exemple de code résout le problème pour lui donner un peu de contexte. – GeorgDangl

Questions connexes