Recherche du handle d'une fenêtre WPF

109

Les formulaires Windows avaient une propriété win1.Handle qui, si je me souviens bien, retourne le handle de la poignée de la fenêtre principale?

Existe-t-il un moyen équivalent d'obtenir le handle d'une fenêtre WPF?

J'ai trouvé le code suivant en ligne,

IntPtr windowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;

mais je ne pense pas que cela m'aidera car mon application a plusieurs fenêtres.

Merci!!

Evan
la source
24
Laissez-moi vous donner quelques conseils amicaux, Evan. Ne faites pas de programmation culte du fret! Disséquer le code que vous avez trouvé en ligne. Vous pouvez voir clairement qu'il passe Application.Current.MainWindow, et à partir de là, vous pouvez raisonner qu'en lui passant une référence à une fenêtre différente, vous obtiendrez votre réponse. Je n'ai jamais utilisé WindowInteropHelper, mais j'ai quand même pu répondre à la question simplement en la raisonnant.
Gregory Higley
1
tu as raison, merci! je suis fatigué aujourd'hui :).
Evan
5
Aucun problème! Et je ne voulais pas dire que c'était une critique, juste pour être utile. Nous avons tous fait un peu de culture de la cargaison de temps en temps. :)
Gregory Higley

Réponses:

142

Eh bien, au lieu de passer Application.Current.MainWindow, transmettez simplement une référence à la fenêtre souhaitée: new WindowInteropHelper(this).Handleet ainsi de suite.

Gregory Higley
la source
Je viens de découvrir que la boîte de dialogue commune FileSave prend une référence à une fenêtre de niveau supérieur, vous pouvez donc passer, par exemple, une référence à la MainWindow de l'application. Enregistrez les services Interop lorsque vous en avez vraiment besoin.
David A. Gray
39

Utilisez simplement votre fenêtre avec la classe WindowsInteropHelper:

// ... Window myWindow = get your Window instance...
IntPtr windowHandle = new WindowInteropHelper(myWindow).Handle;

En ce moment, vous demandez la fenêtre principale de l'application, dont il y en aura toujours une. Vous pouvez cependant utiliser cette même technique sur n'importe quelle fenêtre, à condition qu'il s'agisse d'une classe Window dérivée de System.Windows.Window.

Reed Copsey
la source
8

vous pouvez utiliser :

Process.GetCurrentProcess().MainWindowHandle
Amer Sawan
la source
3

Si vous voulez des poignées de fenêtre pour TOUS vos applications Windowpour une raison quelconque, vous pouvez utiliser la Application.Windowspropriété pour obtenir à tous les Windows, puis utiliser WindowInteropHandlerpour accéder à leurs poignées comme vous l'avez déjà démontré.

poussiéreux
la source