标签: shell32

如何在C#应用程序中使用Shell32?

为了使Shell32工作,我应该在C#应用程序中包含哪些内容?

编辑:

我的应用程序无法识别shell32.我应该包括哪些参考或库?我想要做的是:

Shell32.Shell shell = new Shell32.Shell(); 
Run Code Online (Sandbox Code Playgroud)

我得到的是一个错误:

错误1找不到类型或命名空间名称"Shell32"(您是否缺少using指令或程序集引用?)

c# shell32

29
推荐指数
5
解决办法
6万
查看次数

从.NET Windows服务调用Shell32.dll

我有一个.NET 4.0库,它使用Shell32和Folder.GetDetailsOf()从WTV文件中获取元数据.我已成功使用它与控制台和Windows窗体应用程序没有问题.但由于某种原因,从.NET 4.0 Windows服务调用组件时,启动Shell类的调用会导致COM错误.

库中失败的代码:

Shell32.Shell shell = new Shell();

错误:

无法将"System .__ ComObject"类型的COM对象强制转换为接口类型"Shell32.Shell".此操作失败,因为对IID为"{286E6F1B-7113-4355-9562-96B7E9D64C54}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .

我阅读了我的公寓线程,COM Interops,动态,PIA等等,但是我找到的解决方案没有解决问题.它必须是来自另一个无法看到Interop的线程的调用.请帮忙 :)

.net c# com multithreading shell32

10
推荐指数
2
解决办法
7030
查看次数

从Windows桌面获取所选文件的列表

我试图从Windows桌面和资源管理器Windows获取所选文件的列表.要求是我应该能够从活动资源管理器窗口或桌面检索当前选择.

在完成在线资源后,我设法将以下代码放在一起,但它没有提供桌面上所选项目的列表.

ArrayList selected = new ArrayList();
var shell = new Shell32.Shell();
IntPtr handle = IntPtr.Zero;
handle = GetForegroundWindow();
int intHandle = handle.ToInt32();

//For each explorer
foreach (InternetExplorer window in new ShellWindowsClass())
{

    if (window.HWND == (int)handle)
    {
        Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
        foreach (Shell32.FolderItem item in items)
        {
            selected.Add(item.Path);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除此之外,我尝试了以下内容,但它只是在所有打开的资源管理器窗口中提供所有选定元素的列表,而忽略了桌面.

string filename; = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
if (filename.ToLowerInvariant() == "explorer")
{
    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
    foreach (Shell32.FolderItem item in items)
    {
        //MessageBox.Show(item.Path.ToString());
        selected.Add(item.Path);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我总是最终得到一个来自资源管理器窗口的列表,即使没有打开资源管理器窗口也没有结果.目前的技术似乎完全忽略了桌面.

如果有人可以帮助我从当前活动的窗口/桌面获取所选文件的列表,我将非常感激.

谢谢.

c# windows shell32 windows-shell visual-c++

8
推荐指数
1
解决办法
2558
查看次数

如何检查Shell32.Folder.CopyHere()何时完成

我需要使用Shell32解压缩我的应用程序中的一些文件.现在,我 srcFolder.CopyHere(destFolder.Items())用来实现这一目标.但是,我的下一行代码需要新制作的ZIP文件.但由于该CopyHere方法是Async,我如何检查它何时完成?现在我使用一个Thread.Sleep大约500毫秒,这足以让我的电脑完成创建ZIP文件,但它不是很好的代码imo.

有任何想法吗?

如有必要,可以提供更多信息/代码.

vb.net zip asynchronous shell32

7
推荐指数
2
解决办法
7414
查看次数

再次引用shell32,C#Visual Studio

嗯.好的,重新访问PInvoke后,我确信我不太明白: - /(刚问过这个问题)

让我举例说明我需要处理的代码.当我使用"添加引用 - > COM - > Microsoft Shell控件和自动化"时它可以工作......但遗憾的是它在我的项目中放置了一个如下所示的引用:"C:\ Users\Tim\Documents\Visual Studio 2008 \项目\翼\ FileWing\OBJ \调试\ Interop.Shell32.dll"

我正在挖掘回收箱并寻找我想要恢复的物品.有没有办法不通过PInvoke来完成这项工作?或者获取对system32/shell32.dll的引用,它允许我在运行时使用此代码?

private void recoverRecyclerBinEntry(string fileName, int size)
{
    try
    {
        Shell Shl = new Shell();
        Folder Recycler = Shl.NameSpace(10);

        // scans through all the recyclers entries till the one to recover has been found
        for (int i = 0; i < Recycler.Items().Count; i++)
        {
            FolderItem FI = Recycler.Items().Item(i);
            string FileName = Recycler.GetDetailsOf(FI, 0);
            if (Path.GetExtension(FileName) == "")
                FileName += Path.GetExtension(FI.Path); …
Run Code Online (Sandbox Code Playgroud)

c# shell32 reference visual-studio-2008

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

为什么我在通过 Shell32 读取公共快捷方式时会得到 E_ACCESSDENIED?

我正在尝试读取 C# 4 应用程序中所有桌面快捷方式的目标。Windows 桌面上的快捷方式可以来自多个位置,具体取决于快捷方式是为所有用户创建还是仅为当前用户创建。在这种特定情况下,我试图从公共桌面读取快捷方式,例如从 C:\Users\Public\Desktop\shortcut.lnk。

代码是这样的(路径是一个包含 lnk 文件路径的字符串):

var shell = new Shell32.ShellClass();
var folder = shell.NameSpace(Path.GetDirectoryName(path));
var folderItem = folder.ParseName(Path.GetFileName(path));
if (folderItem != null)
{
    var link = (Shell32.ShellLinkObject)folderItem.GetLink;
Run Code Online (Sandbox Code Playgroud)

最后一行抛出 System.UnauthorizedAccessException,表示不允许读取快捷方式文件的内容。我已尝试在用户的私人桌面 (c:\Users\username\Desktop) 上使用快捷方式文件,效果很好。

所以,我的问题是:

(1) 为什么我的应用程序不允许 /read/ 代码中的快捷方式,当我作为用户可以清楚地阅读内容时?

(2) 有没有办法解决这个问题?也许为应用程序使用特殊的清单文件?

而且,顺便说一下,我的操作系统是 Windows 7,64 位。

好好的

-H-

.net c# windows shell32

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

如何以编程方式更改.lnk以更改其目标?

有没有办法打开Windows快捷方式(.lnk文件)并更改它的目标?我找到了以下代码片段,它允许我找到当前目标,但它是一个只读属性:

Shell32::Shell^ shl = gcnew Shell32::Shell();
String^ shortcutPos = "C:\\some\\path\\to\\my\\link.lnk";
String^ lnkPath = System::IO::Path::GetFullPath(shortcutPos);
Shell32::Folder^ dir = shl->NameSpace(System::IO::Path::GetDirectoryName(lnkPath));
Shell32::FolderItem^ itm = dir->Items()->Item(System::IO::Path::GetFileName(lnkPath));
Shell32::ShellLinkObject^ lnk = (Shell32::ShellLinkObject^)itm->GetLink;
String^ target = lnk->Target->Path;
Run Code Online (Sandbox Code Playgroud)

我找不到任何改变目标的东西.我唯一的选择是创建一个新的快捷方式来覆盖当前的快捷方式吗?..如果是的话,我该怎么做?

.net shell32 c++-cli windows-xp-embedded

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

在线程中调用SHGetFileInfo以避免UI冻结

在.NET 4.0应用程序(WPF)中,我们使用SHGetFileInfo获取目录树的shell图标.由于这在某些情况下需要相当长的时间(即对于无法访问的网络驱动器或软盘驱动器),我们希望在一个线程中执行此操作,然后在读入时更新图标.

调用基本相同,现在只是在一个线程中执行.因为有人说线程必须STA为此工作,我们使用Thread而不是ThreadPool进行测试,结果相同.使用ThreadPool也没有用.

SHGetFileInfo 成功(返回1),但结构中的hIcon成员为零.

IntPtr GetIcon(string name)
{
    Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
    uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES | Shell32.SHGFI_SMALLICON;

    Shell32.SHGetFileInfo(
        name, System.IO.Directory.Exists(name) ? Shell32.FILE_ATTRIBUTE_DIRECTORY : Shell32.FILE_ATTRIBUTE_NORMAL,
        ref shfi, 
        (uint) System.Runtime.InteropServices.Marshal.SizeOf(shfi), 
        flags );
    return shfi.hIcon;
}
Run Code Online (Sandbox Code Playgroud)

完全相同的代码可以从GUI线程中正常工作.要使函数从单独的线程工作,或者使其在不阻塞GUI线程的情况下工作,必须做些什么?


更新:围绕这个的代码基本上是这样的:

var thread = new System.Threading.Thread(() => {
    var result = GetIcon("C:\\");
    // ... do something with the result
});
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
Run Code Online (Sandbox Code Playgroud)

如果只留下线程委托中的行,它可以正常工作(当然,在GUI线程上).


更新:目前,我们只是调用SHGetFileInfo它来使其工作.这样做的好处是,原始问题(在加载所有图标之前未显示文件视图的页面)已经解决,但这意味着页面会挂起每个图标.但至少用户现在看到了一些事情正在发生.我们仍在寻找问题的实际解决方案.

windows multithreading shell32 .net-4.0

6
推荐指数
2
解决办法
2009
查看次数

实现托管属性处理程序Shell扩展的正确方法是什么?

既然.NET CLR 4.0支持并行(SxS)操作,现在应该可以在托管代码中编写shell扩展.我试过这个并成功编写了一个实现IPropertyStore,IInitializeWithStream和IPropertyStoreCapabilities的Property Handler.

处理程序工作正常,并在通过资源管理器浏览文件时按预期调用.它还可以在预览面板和文件属性"详细信息"面板中显示自定义属性.

但是,当我尝试在预览面板中编辑属性,然后单击"保存"时,出现"正在使用文件"错误,指出该文件在Windows资源管理器中已打开.

一些花絮:

  1. 当资源管理器调用IInitializeWithStream.Initialize时,STGM属性设置为STGM_SHARE_DENY_WRITE.
  2. 并且探测器决不会调用IPropertyStore.SetValue或IPropertyStore.Commit.
  3. 我看到在不同线程上对我的处理程序重复调用相同的文件属性.

那么我需要更改(或设置在注册表中)以使属性保存工作?

更新:

感谢Ben,我已经开始工作了."困难部分"(至少对我来说)是理解COM互操作永远不会在我的PropertyHandler上调用Dispose或Finalize.这使我处理的文件保持打开状态,直到GC运行.

幸运的是,"属性处理程序协议"的作用是,当为ReadValue()调用IInitializeWithSream.Initialize()时,streamMode是ReadOnly,当为SetValue()调用它时,streamMode是ReadWrite,并且将调用Commit()在末尾.

int IInitializeWithStream.Initialize( IStream stream, uint grfMode )
{
    _stream = stream;
    _streamMode = (Stgm)grfMode;

    Load();

    // We release here cause if this is a read operation we won't get called back, 
    // and our finializer isn't called. 
    if ( ( _streamMode & Stgm.ReadWrite ) != Stgm.ReadWrite )
    {
        Marshal.ReleaseComObject( _stream );
        _stream = null;
    }
    return HResult.S_OK;
}

int IPropertyStore.Commit()
{
    bool result = false;

    if …
Run Code Online (Sandbox Code Playgroud)

.net windows shell32 com-interop

5
推荐指数
1
解决办法
1168
查看次数

Internet 快捷方式 IDList 值解码

我一直在尝试查找有关存储在从 MS-Office for SharePoint 库生成的 url 快捷方式中的值的任何信息。我们正在从 Office 2007 迁移到 Office 365,并且创建这些链接的 2007 功能在 Office 365 中似乎不可用。

如果 .url 文件在另存为对话框中单击它时没有 IDList 值,它会将文件名更改为快捷方式。我尝试将 .url 更改为 .lnk 但非办公室应用程序无法处理它们。

.url 文件的内容

[InternetShortcut]
IDList=UAwHYBGLNCi66kGEieNCAsCMw0pTAMcAlzFXj9mZr5yalx2b35WYuMWYcRUY2d1VXJ1bvRHAXVmYgMEbpVmb0BiTlR3dvJ3aAgGd0BnOv8yYvZ2ausWZs92duFmLjFGAuAATAEDAAAAAAAAAAAAEAQXZh12cAgDAIAABA8uvAAAAAAAAAAgKAAAAAAAAAAAAAAAAAAAA8gPuuBAAAAAAAQHAlBQYA0GAzBAAAQBAKBQMAAAAAAAAAAAAQAQZk12cAAgNAgAAEAw7+CAAAAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZAQGAtBwcAAAAUAAAAA
URL=file://blart/DavWWWRoot/teams/edms
IconFile=C:\ProgramData\Microsoft\Office\SharePointTeamSite.ico
IconIndex=0
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,9
Run Code Online (Sandbox Code Playgroud)

同一用户重新生成的文件

IDList=UAwHYBGLNCi66kGEieNCAsCMw0pTAMcAlzFXj9mZr5yalx2b35WYuMWYcRUY2d1VXJ1bvRHAXVmYgMEbpVmb0BiTlR3dvJ3aAgGd0BnOv8yYvZ2ausWZs92duFmLjFGAuAATAEDAAAAAAAAAAAAEAQXZh12cAgDAIAABA8uvAAAAAAAAAAgKAAAAAAAAAAAAAAAAAAAA0baRNAAAAAAAAQHAlBQYA0GAzBAAAQBAKBQMAAAAAAAAAAAAQAQZk12cAAgNAgAAEAw7+CAAAAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZAQGAtBwcAAAAUAAAAA
Run Code Online (Sandbox Code Playgroud)

来自另一个用户的文件的值

IDList=UAwHYBGLNCi66kGEieNCAsCMw0pTAMcAlzFXj9mZr5yalx2b35WYuMWYcRUY2d1VXJ1bvRHAXVmYgMEbpVmb0BiTlR3dvJ3aAgGd0BnOv8yYvZ2ausWZs92duFmLjFGAuAATAEDAAAAAAAAAAAAEAQXZh12cAgDAIAABA8uvAAAAAAAAAAgKAAAAAAAAAAAAAAAAAAAA4BZpCAAAAAAAAQHAlBQYA0GAzBAAAQBAKBQMAAAAAAAdHBlfQAQZk12cAAgNAgAAEAw7+qXQJdJdHBlfqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZAQGAtBwcAAAAUAAAAA
Run Code Online (Sandbox Code Playgroud)

我一直无法弄清楚如何解码这个值,或者我无法弄清楚其中存储了哪些数据。我已经阅读了许多不同的方法来使用 Windows 脚本和 shell 32 在 Powershell 和 C# 包装器中以编程方式创建快捷方式,C++ 寻找任何信息。我唯一的一线希望是 shell 链接也有一个 pidl 的项目 ID 列表,但我无法确认这是否相关。

我所知道的是,可以将 IDList 移动到另一个 .url,它会将您带到原始路径。IDList 的某些部分会根据创建它们的用户或重新创建 url 文件的时间而变化。

Internet 快捷方式 https://msdn.microsoft.com/en-us/library/bb776784(v=vs.85).aspx

外壳链接 https://msdn.microsoft.com/en-us/library/dd891312.aspx

shell32 wsh shortcut ms-office

5
推荐指数
1
解决办法
1126
查看次数