我想列出所有打开的Windows资源管理器窗口及其活动路径ListBox.ListBox如果浏览器窗口导航到其他路径,应用程序应刷新.
例如,两个浏览器窗口是打开的.一个导航到C:\Windows另一个导航到另一个导航D:\Stuff.当应用程序运行它,它增加C:\Windows和D:\Stuff到ListBox.然后,用户导航到其中一个打开的资源管理器窗口中的其他文件夹C:\Windows\system32.然后应用程序应刷新ListBox和列表C:\Windows\system32,D:\Stuff而不是.
我对如何做到这一点没有任何想法.任何指针将不胜感激.
我想在会话之间保持pidl,以便我的应用程序可以记住用户的文件夹选择,无论它们在命名空间中的哪个位置,即使它们不是文件系统文件夹.
我有一种感觉,这样做的方法是写出自己的二进制内容ITEMIDLIST,但我无法确认这一点,因为这些内容应该是不透明的,并且取决于提供者.我不知道重启后,甚至在另一个进程中,如果此数据有效.它可以包含指针,就我所知.
什么是坚持并随后重建pidl的正确方法?
Jerry Coffin 提出了一对似乎完全符合我要求的功能.然而,一个问题仍然存在.
正如Joel Spolsky所指出的那样,Raymond Chen 似乎暗示保存二进制内容ITEMIDLIST确实是持久化pidl的正确方法,人们可以从中推断出这一点ILSaveToStream并且ILLoadFromStream正是这样做的辅助函数.
但是,我无法找到证明这一点的文档.由于这个项目是在C#中,我宁愿避免必须IStream为IL...函数进行互操作,如果可能的话我自己只保留二进制数据.任何人都可以确认这是正确的吗?
查看ILSaveToStream和ILLoadFromStream的文档,我发现这些函数在shell 5.0版本之前甚至都不存在(Windows 2000).那么在Win2K之前如何完成呢?经过一些测试,我得出的结论是,正如我所怀疑和Joel Spolsky所假设的那样,写下原始文件ITEMIDLIST是要走的路.
C#中的一个简单实现如下:
unsafe{
byte* start = (byte*)pidl.ToPointer();
byte* ptr = start;
ushort* length;
do{
length = (ushort*)ptr;
ptr += *length;
}while(*length != 0);
byte[] rtn = new byte[ptr + 2 - start];
Marshal.Copy(pidl, rtn, 0, rtn.Length);
return rtn;
}
Run Code Online (Sandbox Code Playgroud)
当然,这可以在没有使用指针的情况下完成 …