获取没有标题的窗口的句柄..(C#)

我们如何获得没有标题的窗口的句柄? 有没有办法枚举桌面上的所有窗口并过滤没有标题的窗口(在我的情况下,只有一个)并获取它的句柄..或通过指定其他属性,如一个窗口,特定的按钮或列表框等…

这应该这样做:

... using System.Runtime.InteropServices; using System.Diagnostics; ... public class foo() { ... [DllImport ("user32")] internal static extern int GetWindowText (int hWnd, String text, int nMaxCount); [DllImport ("user32.dll")] public static extern int GetWindowTextLength (int hWnd); [DllImport ("user32.dll")] public static extern int FindWindow (String text, String class_name); [DllImport ("user32.dll")] public static extern int FindWindowEx (int parent, int start, String class_name); [DllImport ("user32.dll")] public static extern int GetWindow (int parent, uint cmd); public List FindTitlelessWindows() { List titleless = new List (); Process [] procs = Process.GetProcesses (); IntPtr hWnd; foreach (Process proc in procs) { hWnd = proc.MainWindowHandle; if (hWnd != IntPtr.Zero) { TraverseHierarchy (hWnd.ToInt32 (), 0, titleless); } } foreach (int i in titleless) { System.Console.WriteLine (i); } return titleless; } public void TraverseHierarchy (int parent, int child, List titleless) { String text = ""; GetWindowText (parent, text, GetWindowTextLength (parent)); if (String.IsNullOrEmpty (text)) { titleless.Add (parent); } TraverseChildern (parent, titleless); TraversePeers (parent, child, titleless); } public void TraverseChildern(int handle, List titleless) { // First traverse child windows const uint GW_CHILD = 0x05; int child = GetWindow (handle, GW_CHILD); if (0 != child) { TraverseHierarchy (child, 0, titleless); } } public void TraversePeers(int parent, int start, List titleless) { // Next traverse peers int peer = FindWindowEx(parent, start, ""); if (0 != peer) { TraverseHierarchy (parent, peer, titleless); } } } 

看看EnumChildWindows函数。

我认为,如果您将主窗口(即桌面)的指针传递给此函数,您将能够获得所有窗口及其子窗口的列表。

与FindWindow结合使用,一旦找到预期的子控件,就可以获得所需窗口的句柄。

像这样的东西应该工作, 而不是测试

 [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)] internal static extern int GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern int GetWindowTextLength(IntPtr hWnd); .... Process[] procs = Process.GetProcesses(); IntPtr hWnd; foreach(Process proc in procs) { hWnd = proc.MainWindowHandle; if (hWnd != IntPtr.Zero) { int length = GetWindowTextLength(hWnd); StringBuilder sb = new StringBuilder(length + 1); GetWindowText(hWnd, sb, length); if (String.IsNullOrEmpty(sb.ToString()) { // we have a window with no title! } } } 

http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

WindowFromPoint返回一个句柄,如果光标下没有窗口,则返回null。 可以使用,还是你试图自动化这个过程?

在这里,您可以找到一个库来处理托管代码中的Windows API内容。
下载dll并在您的项目中引用它,从那里可以很容易地获得您想要的任何窗口的任何信息;

  void ForAllSystemWindows() { foreach (SystemWindow window in SystemWindow.AllToplevelWindows) { if (window.Title == string.Empty) { //Found window without title //Get window handle IntPtr windowhandle = window.HWnd; //Do other stuff .. } } }