.NET — поиск идентификатора основного потока внешних приложений
-
22-08-2019 - |
Вопрос
Я пытаюсь найти ручку основной поток внешнего приложения.Программа, основной поток которой я пытаюсь найти, является многопоточной, и важно, чтобы я всегда находил основной поток.Я знаю, что будет работать максимум одна копия этой программы.Вот как я это делаю на данный момент:
Process[] someProcesses = Process.GetProcessesByName("some");
IntPtr threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)someProcesses[0].Threads[0].Id);
В большинстве случаев Threads[0] является основным потоком, но иногда это не так.Как я могу убедиться, что найденный поток является основным потоком другого приложения?
Спасибо.
Решение
Это дикая догадка, но через Processes
, вы можете получить ProcessThreadCollection
через Threads
свойство.Каждая нить имеет StartTime
(доступно как Ticks
также), поэтому, предполагая, что основной поток запускается первым, вы можете выбрать тот, у которого время запуска наименьшее.
В противном случае, если вы можете получить стек вызовов для каждого потока, вы можете поискать точку входа приложения.Мне не удалось найти для этого управляемый вызов, но я уверен, что вы можете получить его через P/Invoke.
Другие советы
Поговорим об опоздании на вечеринку - но если кто-то найдет это в поиске Google или что-то в этом роде, то, что я делаю, чтобы идентифицировать мою основную тему, установлено. Thread.CurrentThread.Name
на значение (например, «Основное») при запуске моего приложения.