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

时间:2011-09-28 21:06:53

标签: c# marshalling listviewitem sendmessage cross-process

我想制作一个改变Windows 7中默认播放设备的小应用程序。唯一的解决方案是与Sound Applet交互。我成功获取了具有设备名称的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)是一些中文字母。脚本有什么问题?

UPDATE :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句柄是正确的...已检入间谍++。 我需要做什么测试来检查问题出在哪里?如果有帮助,我可以给你所有的脚本。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用LWM_GETITEMTEXTW?