我怎样才能以编程方式检测一个线程是否有一个给定的进程的窗口句柄?
间谍++给了我这个信息,但我需要以编程方式。
我需要在C#中执行此操作,但.net诊断库不会提供此信息。 我想间谍++是使用一些我不知道的Windows API调用。
我有权访问我正在尝试debugging的系统的代码。 我想定期embedded一些定时器调用的代码,它将检测有多less个线程包含窗口句柄并logging这些信息。
谢谢
我相信你可以使用win api函数: EnumWindowsProc遍历窗口句柄和GetWindowThreadProcessId获得与给定窗口句柄关联的线程ID和进程ID
请检查下面的例子是否适合你:
此代码使用System.Diagnostics迭代进程和线程; 为每个线程ID我打电话GetWindowHandlesForThread函数(见下面的代码)
foreach (Process procesInfo in Process.GetProcesses()) { Console.WriteLine("process {0} {1:x}", procesInfo.ProcessName, procesInfo.Id); foreach (ProcessThread threadInfo in procesInfo.Threads) { Console.WriteLine("\tthread {0:x}", threadInfo.Id); IntPtr[] windows = GetWindowHandlesForThread(threadInfo.Id); if (windows != null && windows.Length > 0) foreach (IntPtr hWnd in windows) Console.WriteLine("\t\twindow {0:x}", hWnd.ToInt32()); } }
GetWindowHandlesForThread实现:
private IntPtr[] GetWindowHandlesForThread(int threadHandle) { _results.Clear(); EnumWindows(WindowEnum, threadHandle); return _results.ToArray(); } private delegate int EnumWindowsProc(IntPtr hwnd, int lParam); [DllImport("user32.Dll")] private static extern int EnumWindows(EnumWindowsProc x, int y); [DllImport("user32.dll")] public static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); private List<IntPtr> _results = new List<IntPtr>(); private int WindowEnum(IntPtr hWnd, int lParam) { int processID = 0; int threadID = GetWindowThreadProcessId(hWnd, out processID); if (threadID == lParam) _results.Add(hWnd); return 1; }
上面的代码的结果应该转储到控制台smth像这样:
... process chrome b70 thread b78 window 2d04c8 window 10354 ... thread bf8 thread c04 ...