如何获取外部应用程序列表视图的 HWND?在 Windows Api 中使用 c++

Mar*_*o29 5 c++ windows winapi

所以我试图制作应用程序来获取我的资源管理器列表视图的内容并从中获取项目文本等,但这里有问题......

如果我使用列表视图检查 Windows 资源管理器文件夹(使用间谍++),仅出于测试目的,我将使用随机文件夹。

它显示窗口的标题是“FolderView”,类为“SysListView32”,嵌套此列表视图的顶层窗口称为“reference”,这也是所有文件所在的 Windows 资源管理器文件夹的标题。

所以我所做的是..

HWND hWndLV = FindWindow(NULL, TEXT("reference")); // first i get hwnd of the main window, this is where listview window is also nested according to spy++, thats why i do this first.

HWND child = FindWindowEx(hWndLV, NULL,NULL,TEXT("FolderView")); // trying to get hwnd of the listview here but it fails, same happens if i also put the class name along as 

HWND child = FindWindowEx(hWndLV, NULL,TEXT("SysListView32"),TEXT("FolderView"));
Run Code Online (Sandbox Code Playgroud)

我用来bool test = IsWindow(child);测试失败,VS 调试器0x0000000000每次都会显示,所以我确信我读得很好。

所以我坚持这个对大多数人来说可能很简单的事情:(

PS我在vista64上(如果这很重要的话)

编辑:看来只有当我搜索我正在搜索的父窗口的第一个嵌套级别时,此功能才有效。所以我认为我需要的是一种处理某种深层嵌套级别搜索的方法。

我还尝试一步步定义每个父级的 hwnd,然后我在上面使用 findwindowex,但是天哪,然后我发现有 5 个嵌套窗口都具有相同的名称,并且其中只有一个包含我的列表视图,所以不错啊?

Vla*_*mir 4

如果您有主窗口的句柄(FindWindow例如使用),则可以使用EnumChildWindows枚举其子窗口。

  • @Marko29 您可以在这里找到一个示例:http://blogs.msdn.com/b/oldnewthing/archive/2007/01/16/1478717.aspx (2认同)
  • 抱歉,Marko,我不想折磨你:) 不管怎样,使用函数 GetClassName 你可以获得一个类名。我在前面的评论中发布的最后一个链接是一个示例,通过它您将能够找到 WNDCLASSEX 结构中使用了哪些参数(类名只是其中之一)。因此,为了简化:假设您枚举了窗口并在回调过程中检索 HWND - 将该 HWND 传递给 GetClassName,您将获得窗口类的名称并识别它。 (2认同)