从其他窗口获取 ListView 项目文本

Posted

技术标签:

【中文标题】从其他窗口获取 ListView 项目文本【英文标题】:Get ListView item text from other window 【发布时间】:2011-09-28 21:06:52 【问题描述】:

我想制作一个小应用程序来更改 Windows 7 中的默认播放设备。唯一的解决方案是与声音小程序交互。我成功获得了具有设备名称的 SysListView32 窗口的句柄,但我无法从 ListView 中获取文本。

这是使用的代码:

IntPtr sListView = (window handle received from another function)
LVITEM lvi = new LVITEM();
lvi.mask = LVIF_TEXT;
lvi.cchTextMax = 1024;
lvi.iItem = 0; // i tried with a loop trought all the items
lvi.iSubItem = 0;
lvi.pszText = Marshal.AllocHGlobal(1024);

IntPtr ptrLvi = Marshal.AllocHGlobal(Marshal.SizeOf(lvi));
Marshal.StructureToPtr(lvi, ptrLvi, false);

SendMessage(sListView, (int)WinMesages.LVM_GETITEMW, IntPtr.Zero, ptrLvi);

string strLvi = Marshal.PtrToStringAuto(lvi.pszText);

结果 (strLvi) 是一些中文字母。脚本有什么问题?

更新:LVITEM 结构是这样的:

private struct LVITEM

    public uint mask;
    public int iItem;
    public int iSubItem;
    public uint state;
    public uint stateMask;
    public IntPtr pszText;
    public int cchTextMax;
    public int iImage;
    public IntPtr lParam;

sLIstView 句柄是正确的...检查了 spy++。 我需要执行什么测试来检查问题出在哪里?如果有帮助,我可以给你所有的脚本。

【问题讨论】:

【参考方案1】:

您是否尝试过改用 LWM_GETITEMTEXTW?

【讨论】:

@Sp3ct3R: 那么字符串编码呢?您可以尝试使用 PtrToStringUni/PtrToStringAnsi 代替 PtrToStringAuto 吗? 还有其他字符但无法辨认。我已经尝试过使用 LWM_GETITEMTEXTW 和 LWM_GETITEMW ,就像在我原来的帖子中一样。感谢您的回复。 @Sp3ct3R:在 Internet 上进行了一些搜索 - 似乎您的代码通常是正确的,但仅用于进程内通信。您不能将它用于进程间通信,因为从调用 SendMessage 返回的指针将与进程相关,因此在您的进程上下文中无效。链接到论坛主题,您可以在其中找到一些建议:dotnetmonster.com/Uwe/Forum.aspx/dotnet-interop/1285/…。 谢谢,我会尝试将该 c++ 脚本转换为 C#。如果我遇到麻烦,我会在这里发帖。 好的...我在这一行遇到了问题: lvItem.pszText = (LPTSTR)(lpRemoteBuffer + sizeof( LVITEM ));如何在 C# 中设置 pszText?

以上是关于从其他窗口获取 ListView 项目文本的主要内容,如果未能解决你的问题,请参考以下文章

如何从android的listview中的不同项目获取数据

Android:在 ListView 中移动项目的窗口?

如何在单击android中的listview项目时从数据库中获取id

Listview 项目文本重力

python 向其他程序listview发送消息,选中某一行

在 ListView 中修改文本大小时更新项目高度