Разговор с неуправляемым процессом из .NET - PullRequest
4 голосов
/ 07 октября 2010

Я создаю процесс из .NET, используя Process.Start.Новый процесс - это устаревшее приложение, написанное на C / C ++.Чтобы связаться с ним, мне нужно сделать эквивалент PostThreadMessage для его основного потока.

Я был бы рад использовать P / Invoke для вызова PostThreadMessage, но я не вижу, как найти основной поток,У объекта Process есть коллекция потоков, но в документе сказано, что первый элемент в коллекции не должен быть основным потоком.Сами объекты Thread, похоже, не имеют никаких признаков того, являются ли они первичными.И хотя я мог бы взглянуть на коллекцию потоков сразу после создания процесса, это не гарантирует, что будет только один.

Итак, есть ли способ определить основной поток другого процесса из .NET, илимне нужно прибегнуть к использованию Win32 CreateProcess?

Спасибо,

Боб

Ответы [ 2 ]

0 голосов
/ 07 декабря 2010

Вам не нужно окно, чтобы использовать очереди сообщений потока. Очереди сообщений потока создаются, как только поток вызывает пользовательские функции, такие как GetMessage или PeekMessage.

см. Дополнительную информацию здесь: О сообщениях и очередях сообщений

Тем не менее, вам нужно будет определить «основной» идентификатор потока (и потоку / процессу публикации также понадобятся достаточные права) в некотором смысле.

Здесь есть ответ: http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/42de8f6a-61f4-495e-a69d-bd018e07c6f7

(см. Ответ "nobugz")

0 голосов
/ 08 октября 2010

Если у процесса есть окно, вы можете использовать API GetWindowThreadProcessId для получения потока GUI, который обычно является основным (используйте Process.MainWindowHandle для получения дескриптора окна).

Другой вариант - перечислить потоки (Process.Threads) и выбрать первый запущенный на основе StartTime:

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

Но это, вероятно, не очень точная техника ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...