2011-09-28 53 views
4

我想创建一个应用程序来更改Windows 7中的默认播放设备。唯一的解决方案是与声音小程序进行交互。我成功地获得了具有设备名称但无法从ListView中获取文本的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

您是否尝试过使用LWM_GETITEMTEXTW?

+0

是的,我试过..相同的东西 – Sp3ct3R

+0

@ Sp3ct3R:比字符串编码?你可以尝试使用PtrToStringUni/PtrToStringAnsi而不是PtrToStringAuto吗? –

+0

还有另一个字符,但不可辨认。我曾尝试使用LWM_GETITEMTEXTW和LWM_GETITEMW,就像在我的原始帖子中一样。感谢回复。 – Sp3ct3R