2010-10-07 6 views
4

Je crée un processus à partir de .NET à l'aide de Process.Start. Le nouveau processus est une application héritée, écrite en C/C++. Pour communiquer avec lui, j'ai besoin de faire l'équivalent de PostThreadMessage à son thread primaire.Parler à un processus non géré à partir de .NET

Je serais heureux d'utiliser P/Invoke pour appeler PostThreadMessage, mais je ne vois pas comment trouver le thread principal. L'objet Process possède une collection de threads, mais le document indique que le premier élément de la collection n'a pas besoin d'être le thread principal. Les objets Thread eux-mêmes ne semblent pas indiquer s'ils sont primaires. Et bien que je puisse regarder la collection de threads immédiatement après la création du processus, ce n'est pas une garantie qu'il n'y en aurait qu'une seule.

Alors, existe-t-il un moyen pour moi de déterminer le thread principal d'un autre processus à partir de .NET, ou dois-je recourir à CreateProcess de Win32?

Merci,

Bob

Répondre

0

Si le processus a une fenêtre, vous pouvez utiliser l'API GetWindowThreadProcessId pour obtenir le fil de l'interface graphique, ce qui est généralement le thread principal (utilisation Process.MainWindowHandle pour obtenir la poignée de fenêtre).

Une autre option serait d'énumérer les fils (Process.Threads) et choisir la première qui a été commencé, sur la base StartTime:

Process process = Process.Start(...); 
process.WaitForInputIdle(); 
ProcessThread primaryThread = process.Threads.OrderBy(t => t.StartTime).First(); 

Mais il est sans doute pas une technique très précise ...

+0

Malheureusement, l'application hérité ne dispose pas de fenêtre. Et si un processus démarre plusieurs threads rapidement, leurs heures de début peuvent être les mêmes. –

0

Vous n'avez pas besoin d'une fenêtre pour utiliser les files d'attente de messages de threads. Les files d'attente de messages Thread sont créées dès que le thread appelle des fonctions utilisateur telles que GetMessage ou PeekMessage.

voir plus d'infos ici à: About Messages and Message Queues

Pourtant, vous devrez déterminer l'identifiant du thread « primaire » (et le fil d'affichage/processus aura besoin de droits suffisants) et par certains moyenne.

Il y a une réponse ici: http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/42de8f6a-61f4-495e-a69d-bd018e07c6f7

(voir la réponse "nobugz")

Questions connexes