首页 > 解决方案 > 如何从光标位置获取应用程序标题(标题)(winapi)

问题描述

我正在尝试获取光标位置的 VMware Workstation Player 标题(标题)[或 mspaint]。例如像这样:

[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(System.Drawing.Point p);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetWindowTextLength(IntPtr hWnd);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

    Cursor.Position = new System.Drawing.Point(500, 300);

    IntPtr hWnd = WindowFromPoint(Cursor.Position);
    if (hWnd != IntPtr.Zero)
    {

      int length = GetWindowTextLength(hWnd);
      StringBuilder sb = new StringBuilder(length + 1);
      GetWindowText(hWnd, sb, sb.Capacity);
      var name = sb.ToString();
      MessageBox.Show(name);

    }

这将适用于当前窗口,但如果应用程序(VMware、MSPaint)由子窗口和父窗口组成,则它将不起作用。如何获取由多个窗口组成的应用程序的标题?

标签: c#winapi

解决方案


感谢 Simon 向我指出 UI 自动化,我找到了可行的解决方案:

    var title = "";

    IntPtr hWnd = winapi.WindowFromPoint(Cursor.Position);
    if (hWnd != IntPtr.Zero)
    {

      var window = AutomationElement.FromHandle(hWnd);

      TreeWalker tWalker = TreeWalker.ControlViewWalker;
      while (tWalker.GetParent(window) != null)
      {
        title = window.Current.Name;
        window = tWalker.GetParent(window);
      }

    }
    MessageBox.Show(title);

推荐阅读