Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从其他窗口获取ListView项文本_C#_Marshalling_Listviewitem_Sendmessage_Cross Process - Fatal编程技术网

C# 从其他窗口获取ListView项文本

C# 从其他窗口获取ListView项文本,c#,marshalling,listviewitem,sendmessage,cross-process,C#,Marshalling,Listviewitem,Sendmessage,Cross Process,我想制作一个小应用程序来更改Windows7中的默认播放设备。唯一的解决方案是与声音小程序交互。我成功获取了SysListView32窗口的句柄,该窗口具有设备名称,但无法从ListView获取文本 这是使用的代码: IntPtr sListView = (window handle received from another function) LVITEM lvi = new LVITEM(); lvi.mask = LVIF_TEXT; lvi.cchTextMax = 1024; lvi

我想制作一个小应用程序来更改Windows7中的默认播放设备。唯一的解决方案是与声音小程序交互。我成功获取了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;
}
滑动视图句柄是正确的。。。签入spy++。
我需要执行什么测试来检查问题出在哪里?如果有帮助的话,我可以给你所有的脚本。

你试过使用LWM\u GETITEMTEXTW吗?

@Sp3ct3R:那么字符串编码呢?您可以尝试使用PtrToStringUni/PtrToStringAnsi而不是PtrToStringAuto吗?还有其他字符,但无法破译。我在我的原始帖子中尝试了LWM_GETITEMTEXTW和LWM_GETITEMW。感谢您的回复。@Sp3ct3R:在Internet上进行了一些搜索-似乎您的代码通常是正确的,但仅用于进程内通信。您不能将它用于进程间通信,因为调用SendMessage返回的指针将与进程相关,因此在您的进程上下文中无效。链接到论坛主题,你可以找到一些建议:谢谢,我会尝试把C++脚本转换成C语言。如果我遇到麻烦,我会在这里发帖。好的。。。我在这一行遇到了一个问题:lvItem.pszText=(LPTSTR)(lpRemoteBuffer+sizeof(lvItem));如何在C#中设置pszText?