【发布时间】:2020-06-28 20:01:48
【问题描述】:
我正在尝试从桌面获取选定文件的列表。我得到了正确数量的文件,但我得到了像这样的奇怪文件名,例如:㺘䁐\u0086\u0002。我正在使用LVM_GETITEM message 来获取信息。这是我的代码:
public string GetItemText(int idx)
{
const int MAX_SIZE = 512;
byte[] szBuffer = new byte[MAX_SIZE];
LVITEM lvi = new LVITEM
{
mask = LVIF_TEXT,
cchTextMax = MAX_SIZE,
iItem = idx,
iSubItem = 0,
pszText = Marshal.AllocHGlobal(MAX_SIZE)
};
// Fill LVITEM structure
IntPtr ptrLvi = Marshal.AllocHGlobal(Marshal.SizeOf(lvi));
Marshal.StructureToPtr(lvi, ptrLvi, false);
int readBytes = 0;
try
{
readBytes = SendMessagePtr(ShellListViewHandle, LVM_GETITEM, IntPtr.Zero, ptrLvi);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
// Get the text
string itemText = Marshal.PtrToStringAuto(lvi.pszText);
return itemText;
}
【问题讨论】:
-
行不通。您需要在资源管理器进程中分配内存。但是,你为什么要黑客攻击。难道没有shell接口可以做到这一点吗?
-
请注意“从桌面获取选定文件列表”的确切含义。如果您的意思是从桌面上打开的视图中获取所选项目的列表,您可以使用 C# 中的 Shell API docs.microsoft.com/en-us/windows/win32/shell/… 和示例:stackoverflow.com/questions/8292953/…
-
不,我的意思是当我选择一些文件时,就在我的桌面上。单击其中一个文件,例如 howtogeek.com/wp-content/uploads/2018/08/img_5b6e4770e6897.jpg
-
我相信你也可以从 shell api 做到这一点。在我看来,尝试破解桌面的特定实现是一个错误。除此之外,您编码失败的原因是您提供了在错误进程中分配的内存。
-
您有如何使用 Shell API 的代码示例吗?如果这更容易,那就太好了。