相关疑难解决方法(0)

在所有Open Explorer Windows的ListBox中获取路径

我想列出所有打开的Windows资源管理器窗口及其活动路径ListBox.ListBox如果浏览器窗口导航到其他路径,应用程序应刷新.

例如,两个浏览器窗口是打开的.一个导航到C:\Windows另一个导航到另一个导航D:\Stuff.当应用程序运行它,它增加C:\WindowsD:\StuffListBox.然后,用户导航到其中一个打开的资源管理器窗口中的其他文件夹C:\Windows\system32.然后应用程序应刷新ListBox和列表C:\Windows\system32,D:\Stuff而不是.

我对如何做到这一点没有任何想法.任何指针将不胜感激.

.net c# vb.net vbscript windows-explorer

9
推荐指数
1
解决办法
4004
查看次数

坚持一个pidl(ITEMIDLIST)

我想在会话之间保持pidl,以便我的应用程序可以记住用户的文件夹选择,无论它们在命名空间中的哪个位置,即使它们不是文件系统文件夹.

我有一种感觉,这样做的方法是写出自己的二进制内容ITEMIDLIST,但我无法确认这一点,因为这些内容应该是不透明的,并且取决于提供者.我不知道重启后,甚至在另一个进程中,如果此数据有效.它可以包含指针,就我所知.

什么是坚持并随后重建pidl的正确方法?

更新:

Jerry Coffin 提出了一对似乎完全符合我要求的功能.然而,一个问题仍然存在.

正如Joel Spolsky所指出的那样,Raymond Chen 似乎暗示保存二进制内容ITEMIDLIST确实是持久化pidl的正确方法,人们可以从中推断出这一点ILSaveToStream并且ILLoadFromStream正是这样做的辅助函数.

但是,我无法找到证明这一点的文档.由于这个项目是在C#中,我宁愿避免必须IStreamIL...函数进行互操作,如果可能的话我自己只保留二进制数据.任何人都可以确认这是正确的吗?

解决方案说明

查看ILSaveToStreamILLoadFromStream的文档,我发现这些函数在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)

当然,这可以在没有使用指针的情况下完成 …

winapi

6
推荐指数
1
解决办法
1461
查看次数

标签 统计

.net ×1

c# ×1

vb.net ×1

vbscript ×1

winapi ×1

windows-explorer ×1