我可以通过在注册表中将键添加到HKEY_CLASSES_ROOT\Folder\shell,在Windows资源管理器上下文菜单中创建一个菜单项.
如何创建刚刚创建的菜单项的子菜单项?
我有一个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代码(这里没有显示),那么相当复杂,我仍然需要用目标名称创建这个临时文件.如果有人知道......呃,快捷方式,欢迎!也许通过移植 …
有谁知道如何纠正这种行为?
当前,当我们的安装程序安装我们的应用程序时,它将获取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”。)
我知道如何在python中编写shell extesions.
缺点是
我知道如何使用.Net(C#)编写shell扩展
.缺点是
我看过用(免费)pascal写的shell扩展.
显然,可以使用c或c ++编写shell扩展
还有哪些其他选择,还有哪些其他语言?
他们有缺点吗?
我正在使用IEcapt.exe来捕获网站快照.问题是,它无法处理有空间的路径目录.像这样:
c:\program files\
Run Code Online (Sandbox Code Playgroud)
我有什么方法可以通过这样的目录来使它工作吗?
这个似乎微不足道,但现在几天我的答案已经躲过了.
我有一个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目标也不能解决问题,因为只有新创建的进程才能从注册表中获取这些新值.
所以我能想到的唯一可行解决方案是:
前两个有点难看,最后一个有其局限性和问题.
任何其他想法(如何在父进程中设置shell变量)?也许这样的shell变量修改是一个安全问题(想想PATH)......
感谢您的时间.
我目前正在尝试创建一个自定义Shell名称空间扩展(用于呈现包含"子文件夹"和"文件"的虚拟文件夹,这实际上是来自远程服务的分层树结构中的数据表示).
扩展名是C#编写的,我知道 - 曾经是一个坏主意,但自从.NET 4引入了同一进程中不同版本的.NET运行时共存的可能性后,我认为这种限制不再一个问题.
到目前为止,我已经通过遵循网络上提供的大量示例和参考资料在Windows XP中运行良好,但是当我在Windows 7中尝试它时(我还没有在Vista中尝试过,所以我不知道是否它会工作),扩展没有加载.根据我的调试日志输出,它注册正常,但是当我打开一个Windows资源管理器窗口时,似乎没有发生对COM接口的常规调用(通常以IPersistFolder :: Initialize开头).实际上,甚至没有调用类构造函数.我不知道是否正在查询接口(成功与否),因为我不确定如何在.NET中检测到这些,所以我可以记录它.所以,基本上,我没有任何线索,因为它甚至在我有机会记录任何可能出错的有用信息之前就失败了.
有没有人碰巧知道问题可能是什么?在处理我应该注意的shell命名空间扩展时,Windows 7中是否存在与Windows XP相比需要考虑的特性?如果需要更多详细信息,请随时询问(我试着保持简短,因为我确定没有人会感谢我在这里复制和粘贴我的整个代码,而且我无法将其简化为相关部分因为我只是不喜欢我不知道这些是......
我正在与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)
执行此代码时,会正确显示"浏览文件夹"对话框,显示用户桌面的内容:

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

在这种情况下,桌面项目不再显示.我只允许浏览我的主文件夹,因为我丢失了"我的电脑"图标,我无法选择此目录之外的文件/文件夹.
我正在寻找我在这里失踪的东西.根项目对于正确显示的子项目数量是否有限制?拥有大量桌面图标通常不是一个好习惯,但据我所知,不应该阻止此对话框正常运行.我不确定Delphi包装器中是否有什么问题,或者这是我在MSDN上没有看到的API的限制......
任何暗示赞赏!
我正在使用新的属性架构,并且在我注册或注销新版本时一直习惯检查注册表。检查此问题的主要地点之一是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组中。
我已经添加了右键单击选项,以使用我的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-shell ×10
windows ×5
.net ×2
c# ×2
registry ×2
c++ ×1
com ×1
contextmenu ×1
delphi ×1
powershell ×1
winapi ×1
windows-7 ×1