Win32Api - 窗口名称属性
Posted
技术标签:
【中文标题】Win32Api - 窗口名称属性【英文标题】:Win32Api - Window Name Property 【发布时间】:2009-10-06 05:57:04 【问题描述】:有没有办法通过win32api获取控件的名字? (c++)
我说的是 C# 中的“名称”属性,例如“frmMain”或“btnNext”。 有没有办法通过 win32API 检索这些数据?
我已经尝试过 GetWindowInfo() 之类的,但我认为我没有朝着正确的方向前进..
谢谢
编辑:我正在使用 EnumChildWindows() 进行迭代,我得到了正确的 HWND.. 不确定是否可以使用它来打印它的名称..(我是 c++/win32 绝对菜鸟)
2009 年 7 月 10 日添加
顺便说一句,我发现这是一个非常好的操作 win32 应用程序的工具。 http://www.autoitscript.com/autoit3/
看看它看起来不错,看起来像是免费软件? :)
【问题讨论】:
看看 Spy++ 工具;它是一个有用的工具,可用于了解 Win32 API 在所有 Windows 上的可用功能。 我在看我的安装,我只安装了Vs2008的C#端!我认为这是 VC++ 附带的。我必须设置和修复。它通常在 Visual Studio Tools >> ? 下 我以前用过,真的很适合这种东西。不幸的是,我认为您不能单独下载它,或者我需要用 C++ 修复我的 VS 的安装(我认为它附带) 【参考方案1】:控件的名称通常是控件的私有变量,不会暴露给win32。您可以尝试 GetWindowText 获取某些控件的标题或 GetWindowLong 获取某些属性,但我认为您无法获取大多数控件的名称。
【讨论】:
我实际上只是针对 GetWindowText()。真可惜。问题是重新运行时句柄会改变,而名称不会。我想知道我可以硬编码哪些参考信息,以便我的代码在同一个 Windows 应用程序上重用,以访问相同的控件或窗口。 对于 ListBoxs,我怀疑 GetWindowText() 会有任何东西.. :(【参考方案2】:我严重怀疑这些信息是否存在于可执行代码中,我认为从 c# 编译器的角度来看,这些符号被简化为对象指针或窗口标识符值(上面提到的 IDC_)。
在我选择创建隐藏的静态文本控件并在每个窗口上识别文本以向外部进程提供这种命名窗口功能之前,我就遇到过此类问题。不是很优雅,但解决了我当时的问题。
【讨论】:
呵呵,我明白了。 :) 你是从实际制作软件而来的吗?这是我要控制的第 3 方,抱歉,如果我没有明确说明。我有问题要问一个具体问题而不是整体观点。 是的,我做了两面——作为第三方,我没有看到任何具体的解决方案——你真的需要窗口的名称还是只是一种唯一标识它的方法? 我实际上需要这个,因为我需要解析网格视图中的单元格文本并从那里开始操作..【参考方案3】:name 属性是编译器添加的,AFAIK。 Win32 本质上不支持这样的命名。 在 C/C++ 中,使用 IDC_* 值代替了整数比较比字符串比较快得多的额外好处。
编辑:顺便说一句,通过使用 GetDlgItemInt( hDlgWnd, IDC_* ) 获取控件的 HWND,可以使用上述 IDC 值来获取对话框的子控件。比使用 EnumWindows 容易得多 ....
【讨论】:
这个 IDC_* 值到底是什么?我怎样才能访问它? 当您定义一个给定的控件时,您为其分配一个“id”。使用 Visual Studio 对话框设计器,它将自动获得一个表示它的常量(它实际上是“resource.h”中的 #define)整数值。这通常具有 IDC_* 的形式,即 ID = 标识符和 C = 控件。 那么我如何从 C++/Win32 的角度访问它呢?它是结构的一部分吗?或者我是否通过传递句柄来使用 Win32 API 函数?对不起,如果我听起来很困惑,这是全新的(我是一个对内部了解甚少的 .NET 男孩)以上是关于Win32Api - 窗口名称属性的主要内容,如果未能解决你的问题,请参考以下文章
widnows 使用WIN32 APi 实现修改另一打开程序的窗口显示方式