【问题标题】:.NET - Find external applications main thread ID.NET - 查找外部应用程序主线程 ID
【发布时间】:2009-02-06 22:03:56
【问题描述】:

我正在尝试查找外部应用程序的 线程的句柄。我试图找到主线程的程序是多线程的,重要的是我总是找到主线程。我知道最多只会运行这个程序的一个副本。这就是我目前的做法:

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

大多数时候,Threads[0] 是主线程,但其他时候不是。如何确保我找到的线程是其他应用程序的主线程?

谢谢。

【问题讨论】:

    标签: .net multithreading external


    【解决方案1】:

    这是一个疯狂的猜测,但是通过Processes,您可以通过Threads 属性获得ProcessThreadCollection。每个线程都有一个StartTime(也有Ticks),所以假设主线程是第一个启动的,你可以选择启动时间最短的那个。

    否则,如果您可以获得每个线程的调用堆栈,则可以查找应用程序入口点。我找不到管理调用,但我相信你可以通过 P/Invoke 获得它。

    【讨论】:

    • 知道如何从主线程获取 Dispatcher 吗?我想这样做,然后调用 Invoke 以确保调用应用程序正在从主线程显示我的 GUI。通过查看文档 (msdn.microsoft.com/en-us/library/…),我看不到到达 Dispatcher 的路径,就像我通过 FromThread 处理普通的 Threads 一样。
    • 鉴于这里的信息 (social.msdn.microsoft.com/Forums/en/csharplanguage/thread/…),也许要做的事情,尽管它可能很丑陋,是通过 StartTime 找到主线程,然后遍历所有 .NET 线程并将main_thread.IdThread 通过GetHashCode 具有相同值的任何值进行比较。
    【解决方案2】:

    谈论迟到 - 但如果有人在 Google 搜索或其他内容中找到这个,我会在我的应用启动时将 Thread.CurrentThread.Name 设置为一个值(如“Main”)起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多