24
A
回答
11
使用Win32 API EnumWindows(如果您想要子窗口EnumChildWindows)),或者您也可以使用EnumThreadWindows。
[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData);
然后检查其处理每个窗口属于通过使用Win32 API GetWindowThreadProcessId
[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);
64
delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
IntPtr lParam);
static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
var handles = new List<IntPtr>();
foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
EnumThreadWindows(thread.Id,
(hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);
return handles;
}
和样本用法:
private const uint WM_GETTEXT = 0x000D;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam,
StringBuilder lParam);
[STAThread]
static void Main(string[] args)
{
foreach (var handle in EnumerateProcessWindowHandles(
Process.GetProcessesByName("explorer").First().Id))
{
StringBuilder message = new StringBuilder(1000);
SendMessage(handle, WM_GETTEXT, message.Capacity, message);
Console.WriteLine(message);
}
}
+1
感谢您发布这一个!用这种方法(“扫描进程” - >“扫描线程” - >“扫描窗口”,而不是“扫描窗口” - >“检查进程ID”),我看到了更好的性能。 – Marcus 2014-04-26 06:29:16
3
古老的线程,但它让我开始所以这里有一个小实用函数,它会找到一个匹配lambda(Predicate)的子窗口。易于更改以返回列表。谓词中处理了多个标准。
public delegate bool Win32Callback(IntPtr hwnd, IntPtr lParam);
[DllImport("user32.Dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr parentHandle, Win32Callback callback, IntPtr lParam);
/// <summary>
/// Find a child window that matches a set of conditions specified as a Predicate that receives hWnd. Returns IntPtr.Zero
/// if the target window not found. Typical search criteria would be some combination of window attributes such as
/// ClassName, Title, etc., all of which can be obtained using API functions you will find on pinvoke.net
/// </summary>
/// <remarks>
/// <para>Example: Find a window with specific title (use Regex.IsMatch for more sophisticated search)</para>
/// <code lang="C#"><![CDATA[var foundHandle = Win32.FindWindow(IntPtr.Zero, ptr => Win32.GetWindowText(ptr) == "Dashboard");]]></code>
/// </remarks>
/// <param name="parentHandle">Handle to window at the start of the chain. Passing IntPtr.Zero gives you the top level
/// window for the current process. To get windows for other processes, do something similar for the FindWindow
/// API.</param>
/// <param name="target">Predicate that takes an hWnd as an IntPtr parameter, and returns True if the window matches. The
/// first match is returned, and no further windows are scanned.</param>
/// <returns> hWnd of the first found window, or IntPtr.Zero on failure </returns>
public static IntPtr FindWindow(IntPtr parentHandle, Predicate<IntPtr> target) {
var result = IntPtr.Zero;
if (parentHandle == IntPtr.Zero)
parentHandle = Process.GetCurrentProcess().MainWindowHandle;
EnumChildWindows(parentHandle, (hwnd, param) => {
if (target(hwnd)) {
result = hwnd;
return false;
}
return true;
}, IntPtr.Zero);
return result;
}
例
var foundHandle = Win32.FindWindow(IntPtr.Zero, ptr => Win32.GetWindowText(ptr) == "Dashboard");
相关问题
- 1. 如何枚举属于我的进程的顶级wxWidgets窗口?
- 2. 如何枚举进程内的所有窗口?
- 3. vb.net/pinvoke:枚举特定的进程窗口
- 4. 枚举窗口内的所有控件
- 5. 特定的.NET XML枚举过程
- 6. 枚举应用程序创建的所有窗口
- 7. 枚举所有“始终位于顶部”的窗口
- 8. 枚举属于特定类型
- 9. 使用特定于该枚举的int设置枚举?
- 10. 如何在Delphi中枚举另一个进程的窗口?
- 11. .NET Compact Framework,枚举窗口(Windows Mobile)
- 12. 如何使用Name属性枚举.NET中的线程?
- 13. 如何枚举所有进程及其关联窗口标题和进程的名称
- 14. 如何枚举具有自定义类属性的所有类?
- 15. C#试图枚举每个进程线程的每个窗口
- 16. 枚举桌面上的所有窗口句柄
- 17. 如何枚举实现通用接口的所有项目?
- 18. 如何枚举所有可用的网络接口?
- 19. 如何在.NET中使用枚举
- 20. 如何在WinApi中枚举EnumChildProc时检查特定的窗口名称?
- 21. 如何使用JavaScript枚举所有自定义HTML标记?
- 22. C++使用枚举声明:如何导入所有的枚举项?
- 23. 如何枚举属于C中给定组或SID的用户?
- 24. 在Windows XP上,我如何枚举系统显示的所有窗口(C#)
- 25. 如何枚举.NET中的所有时区?
- 26. Visualstudio宏 - 枚举所有项目属性
- 27. 如何在.net中查找程序集中特定接口的所有类.net
- 28. 有没有一个程序来枚举窗口?
- 29. 如何枚举进程的模块?
- 30. 如何枚举JDK的所有MBean?
重复http://stackoverflow.com/questions/2281429/how-to-enumerate-all-windows-within-a-process – 2010-03-28 03:54:33
@布赖恩的 - 不会键入从Process.MainWindowHandle和EnumChildWindows工作,而不是枚举所有打开的窗口? – Gishu 2010-03-28 04:06:10
@Gishu:不,但您可能可以使用Win32 API中的MainWindowHandle FindWindowEx – 2010-03-28 12:38:32