2010-09-15 13 views
2

L'instance A essaie de restaurer la fenêtre de l'instance B, mais je ne peux pas obtenir le handle de la fenêtre de B. Je pense que le problème est que la fenêtre est réduite au minimum par B au plateau de système en utilisant:Comment obtenir le handle de fenêtre d'une autre application réduite à la barre d'état système?

this.Visibility = Visibility.Hidden; 

Et A essaie d'obtenir la poignée de fenêtre B à l'aide:

Process process = Process.GetCurrentProcess(); 
Process.GetProcessesByName(process.ProcessName).First().MainWindowHandle; 

est égale à IntPtr.Zero.

J'ai aussi essayé d'obtenir la poignée de fenêtre par nom de classe en utilisant Spy ++, mais le nom de classe a une par instance GUID dans le format suivant:

HwndWrapper[FileName.exe;;ad445199-cf93-48a4-bd24-2f97d54c8af8] 

Répondre

3

C'est parce que ce que vous voulez ne fondamentalement existe pas , et le concept de MainWindowHandle est un terme impropre grossier qui s'est faufilé dans le. Net Framework pour une confusion éternelle. De There can be more than one (or zero): Converting a process to a window:

«Je possède un numéro de fil Comment puis-je obtenir la fenêtre correspondante ? » Vous pouvez utiliser la fonction EnumThreadWindows pour obtenir toutes les fenêtres sur le thread .

"Oui, je connais EnumThreadWindows, mais comment puis-je obtenir la fenêtre que je veux ?" Vous n'avez pas encore dit ce que vous vouliez

"Je veux la fenêtre qui correspond à le fil."

Mais lequel? Comment allez-vous décider parmi toutes les fenêtres?

"C'est ce que je vous demande!" Vous n'avez pas encore décrit ce que vous voulez .

"Je veux la fenêtre correspondant au le fil Pourquoi ne répondez-vous pas à ma question ?"

Notez que disant: « Je cherche haut niveau fenêtre unowned » est un pas en avant , mais il ne fonctionne toujours pas identifie de façon unique une fenêtre. Il peut être plusieurs fenêtres sans cote de haut niveau dans un processus. Par exemple, Explorer a généralement beaucoup de fenêtres de premier niveau . Il ya le bureau, la barre des tâches, vos fenêtres de dossiers ouverts, et les feuilles de propriétés. Si vous demandez "la" fenêtre sans fenêtre de haut niveau de Explorer, laquelle voulez-vous?

Peut-être que les gens sont l'idée qu'il ya un moyen d'unique spécifier « la fenêtre » pour un processus parce que l'objet System.Diagnostics.Process possède une propriété appelée MainWindowHandle.La documentation pour cette propriété ne fait rien pour dissiper la notion, soit. J'ai aucune idée de la façon dont cette propriété décide parmi plusieurs fenêtres sans droit de premier niveau.

Le sujet est élaboré également dans MSDN Q & A Get the Main Window:

Q Comment puis-je trouver la fenêtre principale d'un processus? J'écris un outil semblable à un espion et j'ai besoin d'obtenir la fenêtre principale (HWND) pour un processus afin que je puisse lui envoyer un message comme WM_ACTIVATEAPP.

A Quelle fenêtre principale voulez-vous dire?