c# - 如何从光标位置获取应用程序标题(标题)(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)由子窗口和父窗口组成,则它将不起作用。如何获取由多个窗口组成的应用程序的标题?
解决方案
感谢 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);
推荐阅读
- hyperledger-fabric - fabric-orderer/fabric-peer 和 fabric-ca-orderer/fabric-ca-peer 图像之间的区别
- c# - 从通用列表中删除项目不起作用
- google-apps-script - 启动错误“检索附加配置”
- python - 如何将 .py 文件作为 .pynb 中的模块导入?
- prolog - Prolog:最小功能失败
- laravel - 无法通过 facebook API 创建广告或广告素材
- javascript - 用两条规则分割和替换文本(正则表达式)
- vba - VBA 中的 Unicode UTF-8
- activeweb - 试图找出 activeweb 日志记录到一个单独的文件
- sql - 将查询添加到子查询然后不会产生任何结果