4
如何以编程方式检测某个线程是否具有针对给定进程的窗口句柄?如何检测线程是否有窗口句柄?
间谍++给了我这个信息,但我需要通过编程来完成。
我需要在C#中执行此操作,但.net诊断库不会提供此信息。我想象间谍++使用一些我不知道的Windows API调用。
我有权访问我正在尝试调试的系统的代码。我想嵌入一些由定时器定期调用的代码,它将检测有多少个线程包含窗口句柄并记录此信息。
感谢
如何以编程方式检测某个线程是否具有针对给定进程的窗口句柄?如何检测线程是否有窗口句柄?
间谍++给了我这个信息,但我需要通过编程来完成。
我需要在C#中执行此操作,但.net诊断库不会提供此信息。我想象间谍++使用一些我不知道的Windows API调用。
我有权访问我正在尝试调试的系统的代码。我想嵌入一些由定时器定期调用的代码,它将检测有多少个线程包含窗口句柄并记录此信息。
感谢
我相信你可以用WIN API函数:EnumWindowsProc通过窗口句柄迭代和GetWindowThreadProcessId让与给定的窗口相关的线程ID和进程ID处理
请检查下面的例子将为您工作:
此代码使用System.Diagnostics迭代进程和线程;对于我打电话GetWindowHandlesForThread功能每个线程ID(见下面的代码)
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;
}
结果上面应该转储到控制台水木清华这样的:
...
process chrome b70
thread b78
window 2d04c8
window 10354
...
thread bf8
thread c04
...
非常感谢!这正是我需要的。 – 2009-12-18 16:40:33