2009-02-18 9 views
24

J'ai déclaré la classe suivante:Obtenir la poignée de fenêtre en C#

public partial class MainWindow : Window 

et je dois obtenir la poignée réelle de la fenêtre une fois que la fenêtre a un. Comment puis-je faire cela et où devrais-je mettre la fonction de requête.

Ce que j'ai essayé à ce jour était:

IntPtr hwnd = new WindowInteropHelper(this).Handle; 

Mais la poignée, j'obtenons est 0, ce qui pourrait être parce qu'il a été planté dans OnInitialized - peut-être la fenêtre est pas encore prêt à ce stade. Et, oui - c'est connecté via WPF, merci de le signaler!

Merci

+0

WPF ou Winforms? –

+0

Devons-nous supposer que "WindowInteropHelper" est du type System.Windows.Forms.Form? –

+0

De leur utilisation de WindowInteropHelper, je pense que c'est WPF (http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.aspx) –

Répondre

25

Dans la méthode OnInitialized la poignée n'a pas encore été créé. Mais vous êtes sur la bonne voie. Si vous mettez votre appel dans l'événement Loaded le gérer aura été créé et il devrait retourner le gérer.

0
[DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
     public static extern int FindWindowEx(int hwndParent, int hwndEnfant, int lpClasse, string lpTitre); 


int hwnd = FindWindowEx(0, 0, 0, title);//where title is the windowtitle 

       //verification of the window 
       if (hwnd == 0) 
       { 
        throw new Exception("Window not found"); 
       } 
+0

Mez, cela fonctionne pour WPF? –

+3

Dans l'article d'origine, l'affiche tente de récupérer la poignée avant qu'elle ne soit créée. Cette méthode échouera donc toujours. La plupart des paramètres int devraient être IntPtr, sur une plate-forme 64 bits, cela échouera spectaculairement. Enfin, cela ne recherchera que les fenêtres de niveau supérieur. –

6

Le premier emplacement où vous pouvez obtenir le handle est OnSourceInitialized

Questions connexes