2009-02-06 9 views
2

메인 응용 프로그램의 스레드 핸들을 찾으려고합니다. 주 스레드를 찾으려고하는 프로그램은 다중 스레드이며 항상 주 스레드를 찾는 것이 중요합니다. 나는이 프로그램의 복사본 하나가 기껏해야 실행된다는 것을 안다. 이것은 지금 제가하는 방법입니다 :외부 응용 프로그램 찾기 주 스레드 ID

Process[] someProcesses = Process.GetProcessesByName("some"); 
IntPtr threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)someProcesses[0].Threads[0].Id); 

대부분의 경우 스레드 [0]은 주 스레드이지만 다른 경우는 그렇지 않습니다. 내가 찾은 스레드가 다른 응용 프로그램의 주 스레드인지 어떻게 확인할 수 있습니까?

고마워요.

답변

3

이것은 대략적인 추측이지만 Processes을 통해 Threads 속성을 통해 ProcessThreadCollection을 얻을 수 있습니다. 각 스레드는 StartTime (Ticks으로도 가능합니다.)이므로 주 스레드가 처음 시작한다고 가정하면 가장 낮은 시작 시간을 가진 스레드를 선택할 수 있습니다.

그렇지 않으면 각 스레드에 대한 호출 스택을 얻을 수있는 경우 응용 프로그램 진입 점을 찾을 수 있습니다. 내가 관리 전화를 찾을 수 없지만 P/Invoke를 통해 얻을 수 있다고 확신합니다.

+0

기본 스레드에서 Dispatcher를 얻는 방법에 대한 아이디어가 있습니까? 호출 응용 프로그램이 기본 스레드에서 내 GUI를 표시하고 있는지 확인하기 위해 Invoke를 호출하고 싶습니다. docs (http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.aspx)에서 보았을 때, 정상적인' 쓰레드는'FromThread'를 통해 전달됩니다. – Dave

+0

여기에 정보가 주어지면 (http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/ed307fa4-5717-44e2-91ec-f219abf29dad) 아마도 그렇게 될지도 모르는 것처럼 추한 것, StartTime에 의해 메인 쓰레드를 찾은 다음 모든 .NET 쓰레드를 반복하고'main'thread.Id'와'GetHashCode'를 통해 같은 값을 갖는'Thread'를 비교하는 것입니다. – Dave

0

늦게 파티 오는 이야기 - 누군가가 Google 검색 등에서이 사실을 발견하면 내 앱이 시작될 때 내 메인 스레드가 Thread.CurrentThread.Name ("메인"과 같은)으로 설정됩니다. .

관련 문제