标签: windows-shell

如何将子菜单项添加到Windows资源管理器上下文菜单?

我可以通过在注册表中将键添加到HKEY_CLASSES_ROOT\Folder\shell,在Windows资源管理器上下文菜单中创建一个菜单项.

如何创建刚刚创建的菜单项的子菜单项?

windows user-interface windows-shell

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

拖放动态创建的快捷方式

我有一个C#应用程序,它创建了一个快捷方式来启动具有特定参数和初始目录的其他程序.我希望用户能够从Windows窗体中拖动一个快捷方式,并将其放在任何相关的位置,如桌面,开始菜单等,但我真的不知道如何处理,有人可以指向我正确的方向?

我一直在使用的PInvoke,看到几件样品的IShellLink这一个,或阅读等等之类的答案在这里,它已经帮助创建快捷方式,并将它们保存在一个.lnk文件.我假设DoDragDrop()当用户启动拖动操作时,我必须在调用中移交数据,例如通过处理MouseDown信号.就我所知,我想我需要确切知道目标期望接受丢弃的类型,以及如何序列化快捷方式,但无法找到该部分的任何信息.

也许另一种选择是获取drop的位置,并从我的应用程序中管理它,但是我再次对如何做到这一点有点无能为力.

框架版本目前是3.5,我只考虑Windows平台.

在此先感谢您的帮助!


更新/解决方案:

使用上面提到的ShellLink代码创建临时快捷方式文件,我只是用于DataObject拖放,如下例所示:

private void picShortcut_MouseDown(object sender, MouseEventArgs e)
{
    ShellLink link = new ShellLink();

    // Creates the shortcut:
    link.Target = txtTarget.Text;
    link.Arguments = txtArguments.Text;
    link.Description = txtDescription.Text;
    link.IconPath = txtIconFile.Text;
    link.IconIndex = (txtIconIndex.Text.Length > 0 ?
        System.Int32.Parse(txtIconIndex.Text) : 0);
    link.Save("tmp.lnk");

    // Starts the drag-and-drop operation:
    DataObject shortcut = new DataObject();
    StringCollection files = new StringCollection();
    files.Add(Path.GetFullPath("tmp.lnk"));
    shortcut.SetFileDropList(files);
    picShortcut.DoDragDrop(shortcut, DragDropEffects.Copy);
}
Run Code Online (Sandbox Code Playgroud)

如果你考虑PInvoke代码(这里没有显示),那么相当复杂,我仍然需要用目标名称创建这个临时文件.如果有人知道......呃,快捷方式,欢迎!也许通过移植 …

.net c# drag-and-drop windows-shell

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

IShellLink :: SetIconLocation将我的图标路径转换为%Program Files%,这是错误的

有谁知道如何纠正这种行为?

当前,当我们的安装程序安装我们的应用程序时,它将获取IShellLink,然后使用快捷方式图标(在开始菜单和桌面中)所需的数据将其加载,然后使用IPersistFile :: Save编写快捷方式。

问题是通过IShellLink :: SetIconLocation为图标指定的路径使用%ProgramFiles%...(对于x64 ...)被转换为WRONG。

我注意到很多其他32位软件在x64下都无法通过此操作-但后来我假定他们自己在自己的.lnk创建代码中使用%ProgamFiles%作为文字元素。但是,似乎是IShellLink强迫该错误存在,并且我没有解决方法(或者说Shell中的链接属性编辑器对此问题负责,并且基础链接可以)。

一些Google搜索没有发现任何问题……是否有人遇到过这个问题,或者是否知道一篇文章/示例,说明如何强制x64 Windows不要对此进行处理?

澄清的例子:

hr = m_shell_link->SetIconLocation("C:\\Program Files (x86)\\Acme\\Prog.exe", 0);
Run Code Online (Sandbox Code Playgroud)

将产生一个带有正确图标的快捷方式,但是当您在快捷方式属性页中按“更改图标”时,将报告“ Windows找不到文件%ProgramFiles%\ Acme \ Prog.exe”。

c++ windows-shell

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

用什么语言编写windows shell扩展

我知道如何在python中编写shell extesions.
缺点是

  • 它不适用于64位Windows
  • 我不确定每次"发生"时创建python进程会降低性能.

我知道如何使用.Net(C#)编写shell扩展
.缺点是

  • MS气馁
  • 我不确定这会如何降低性能.(可以?)

我看过用(免费)pascal写的shell扩展.

  • 使用这种方法有缺点吗?
  • 这适用于64位窗口.

显然,可以使用c或c ++编写shell扩展

  • 嗯......我还在尝试理解c和c ++中的com ....

还有哪些其他选择,还有哪些其他语言?
他们有缺点吗?

windows com windows-shell

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

如何将有空间的目录路径传递给windows shell?

我正在使用IEcapt.exe来捕获网站快照.问题是,它无法处理有空间的路径目录.像这样:

c:\program files\
Run Code Online (Sandbox Code Playgroud)

我有什么方法可以通过这样的目录来使它工作吗?

windows windows-shell

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

更改调用进程的环境变量

这个似乎微不足道,但现在几天我的答案已经躲过了.

我有一个Windows批处理文件,它调用C#程序进行额外的验证,这是在批处理文件中无法完成的.验证完成后,我需要将状态和字符串返回给调用shell.

现在返回值很简单,我的C#控制台应用程序只是设置一个返回值(如果你愿意,退出代码).我认为这根绳子也是小菜一碟.我尝试使用以下命令定义一个新的shell变量:

Environment.SetEnvironmentVariable("ERR", "Some text");
Run Code Online (Sandbox Code Playgroud)

这个调用应该(并且确实)在当前进程中定义一个shell变量- 这是创建变量的C#进程.一旦C#应用程序终止并且创建C#应用程序的shell对变量一无所知,该值就会丢失.所以...一个没有特别用途的电话......完全......除非我从C3应用程序创建了一个子进程,否则它可能会继承我的变量.

SetEnvironmentVariable调用的EnvironmentVariableTarget.Machine和EnvironmentVariableTarget.User目标也不能解决问题,因为只有新创建的进程才能从注册表中获取这些新值.

所以我能想到的唯一可行解决方案是:

  • 写信给stdout
  • 写入文件
  • 将额外含义编码到返回值中

前两个有点难看,最后一个有其局限性和问题.

任何其他想法(如何在父进程中设置shell变量)?也许这样的shell变量修改是一个安全问题(想想PATH)......

感谢您的时间.

c# windows-shell

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

Shell命名空间扩展无法在Windows 7中加载

我目前正在尝试创建一个自定义Shell名称空间扩展(用于呈现包含"子文件夹"和"文件"的虚拟文件夹,这实际上是来自远程服务的分层树结构中的数据表示).

扩展名是C#编写的,我知道 - 曾经是一个坏主意,但自从.NET 4引入了同一进程中不同版本的.NET运行时共存的可能性后,我认为这种限制不再一个问题.

到目前为止,我已经通过遵循网络上提供的大量示例和参考资料在Windows XP中运行良好,但是当我在Windows 7中尝试它时(我还没有在Vista中尝试过,所以我不知道是否它会工作),扩展没有加载.根据我的调试日志输出,它注册正常,但是当我打开一个Windows资源管理器窗口时,似乎没有发生对COM接口的常规调用(通常以IPersistFolder :: Initialize开头).实际上,甚至没有调用类构造函数.我不知道是否正在查询接口(成功与否),因为我不确定如何在.NET中检测到这些,所以我可以记录它.所以,基本上,我没有任何线索,因为它甚至在我有机会记录任何可能出错的有用信息之前就失败了.

有没有人碰巧知道问题可能是什么?在处理我应该注意的shell命名空间扩展时,Windows 7中是否存在与Windows XP相比需要考虑的特性?如果需要更多详细信息,请随时询问(我试着保持简短,因为我确定没有人会感谢我在这里复制和粘贴我的整个代码,而且我无法将其简化为相关部分因为我只是不喜欢我不知道这些是......

.net windows-shell windows-7

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

具有大量shell项时,SelectDirectory/ShBrowseForFolder问题

我正在与Vcl.FileCtrl功能一个很奇怪的问题SelectDirectory (这是周围的瘦包装的SHBrowseForFolder的Win32 API).

我正在使用以下代码来允许用户浏览文件或文件夹:

  if SelectDirectory('Sélectionnez un élément à ajouter :', '', S, [sdNewFolder,
    sdShowFiles, sdNewUI]) then
Run Code Online (Sandbox Code Playgroud)

执行此代码时,会正确显示"浏览文件夹"对话框,显示用户桌面的内容:

SelectDirectory包含少于100个桌面文件

但是当桌面文件夹中的项目数量过大时(在我的计算机上,我可以通过大约100个桌面图标重现问题),同一个调用会产生完全不同的显示:

SelectDirectory包含超过100个桌面文件

在这种情况下,桌面项目不再显示.我只允许浏览我的主文件夹,因为我丢失了"我的电脑"图标,我无法选择此目录之外的文件/文件夹.

我正在寻找我在这里失踪的东西.根项目对于正确显示的子项目数量是否有限制?拥有大量桌面图标通常不是一个好习惯,但据我所知,不应该阻止此对话框正常运行.我不确定Delphi包装器中是否有什么问题,或者这是我在MSDN上没有看到的API的限制......

任何暗示赞赏!

delphi winapi windows-shell

5
推荐指数
2
解决办法
2044
查看次数

为什么/如何在Regedit中隐藏注册表项,但在PowerShell中可见?

我正在使用新的属性架构,并且在我注册或注销新版本时一直习惯检查注册表。检查此问题的主要地点之一是HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\PROPERTYSYSTEM\PROPERTYSCHEMA

有趣的是,我有时会失去对Regedit中此注册表位置的访问权限。我看到了这一点(注意缺少PropertySchema):在此处输入图片说明

我知道架构仍在注册,因为我可以使用prop.exe工具和propschema SDK示例应用程序来描述它们。这些属性在Windows资源管理器和“搜索”中可用。

另外,我可以使用PowerShell列出此配置单元的内容:

C:\Users\carlton> cd hklm:
HKLM:\>
C:\Users\carlton> cd hklm:
HKLM:\> cd SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\PROPERTYSYSTEM\PROPERTYSCHEMA
HKLM:\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\PROPERTYSYSTEM\PROPERTYSCHEMA> dir


    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\PROPERTYSYSTEM\PROPERTYSCHEMA


Name                           Property
----                           --------
0000                           (default)  : C:\Program Files\Internet Explorer\ie9props.propdesc
                               SchemaId   : {D9B5ABA1-5E8A-4902-B6A1-50B3C0311C2E}
                               URI        : ie9props.propdesc
                               CompactURI : 5376bae4b39f43768806afcb6b8ff5464bf9c989d1a819c6e6d99ba1e8ce2512
0001                           (default)  : C:\Program Files\Microsoft Office\Office14\Custom.propdesc
                               SchemaId   : {537AAAB1-1D85-48DC-A99E-16EB8C309FE5}
                               URI        : custom.propdesc
                               CompactURI : 2e3be58e5cbbc0da093956b46a3905f11cf0f5bbf11987a8619e25f7261ee8be
0002                           (default)  : C:\apps\MSOffice\Office14\VisioCustom.propdesc
                               SchemaId   : {18503526-0466-4942-AC6E-41C1D380EABA}
                               URI        : visiocustom.propdesc
...
Run Code Online (Sandbox Code Playgroud)

无论如何,我不了解这种情况如何发生以及是否应该为此担心。从同事的计算机上导出此密钥并重新导入它可以暂时提供帮助,因为它将在Regedit中显示已隐藏/丢失的密钥(即使它们不在我的同事的计算机上)。

我在运行Windows 7 SP1的Administrators组中。

windows registry powershell windows-shell

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

不使用MultipleInvokePromptMinimum,可以通过上下文菜单打开超过15个文件

我已经添加了右键单击选项,以使用我的c ++程序打开文件:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Open With MyProgram]
"Icon"="\"C:\\Program Files (x86)\\myProgram.exe\""

[HKEY_CLASSES_ROOT\*\shell\Open With MyProgram\command]
@="\"C:\\Program Files (x86)\\myProgram.exe\" \"%1\""
Run Code Online (Sandbox Code Playgroud)

这很好。当我选择15个以上的文件时,右键单击选项将消失。我已经阅读了有关MultipleInvokePromptMinimum的以下方法:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
"MultipleInvokePromptMinimum"=dword:00001388
Run Code Online (Sandbox Code Playgroud)

这样就可以完成工作,唯一的问题是我不想为15个以上的文件(我的自定义文件)启用其他“打开”或“打印”右键单击选项。

(例如,在不更改MultipleInvokePromptMinimum的情况下,为15个以上的文件启用了“使用Notepad ++编辑”右键单击选项)

什么是实现这一目标的最佳方法?提前致谢。

windows registry contextmenu windows-shell

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