Tag: windows shell

如何删除气球工具提示上的“扳手”按钮?

我想隐藏气球工具提示上的扳手按钮 有谁知道怎么样? 是否可以禁用/删除从System.Windows.Forms.NotifyIcon调用的系统托盘中的气球工具提示上的关闭按钮旁边的扳手按钮 ? 请帮忙 提前致谢。

更改调用进程的环境变量

这个似乎微不足道,但现在几天我的答案已经没有了。 我有一个Windows批处理文件,它调用C#程序来执行无法在批处理文件中完成的额外validation。 validation完成后,我需要将状态和字符串返回给调用shell。 现在返回值很简单,我的C#控制台应用程序只是设置一个返回值(如果你愿意,退出代码)。 我认为这根绳子也是小菜一碟。 我尝试使用以下命令定义一个新的shell变量: Environment.SetEnvironmentVariable(“ERR”, “Some text”); 这个调用应该(并且确实)在当前进程中定义一个shell变量 – 这是创建变量的C#进程。 一旦C#应用程序终止,并且创建C#应用程序的shell对该变量一无所知,该值就会丢失。 所以…一个没有特别用途的电话……完全……除非我从C3应用程序创建了一个子进程,否则它可能会inheritance我的变量。 SetEnvironmentVariable调用的EnvironmentVariableTarget.Machine和EnvironmentVariableTarget.User目标也不能解决问题,因为只有新创建的进程才能从注册表中获取这些新值。 所以我能想到的唯一可行解决方案是: 写信给stdout 写入文件 将额外含义编码到返回值中 前两个有点难看,最后一个有其局限性和问题。 任何其他想法(如何在父进程中设置shell变量)? 也许这样的shell变量修改是一个安全问题(想想PATH)…… 感谢您的时间。

如何使用Windows shell获取文件扩展名的大图标?

我找到了关于获取文件甚至文件扩展名的系统映像的各种文章。 我有以下方法,用于获取小型16×16和大型32×32图像。 // DLL Import [DllImport(“shell32”)] private static extern IntPtr SHGetFileInfo( string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags); // Constants/Enums private const int FILE_ATTRIBUTE_NORMAL = 0x80; private enum SHGetFileInfoConstants : int { SHGFI_ICON = 0x100, // get icon SHGFI_DISPLAYNAME = 0x200, // get display name SHGFI_TYPENAME = 0x400, // get type […]

C#:如何使用SHOpenFolderAndSelectItems

有人可以举例说明如何使用来自C#的shell函数SHOpenFolderAndSelectItems吗? 我不太懂得如何使用这些函数而无法在pinvoke.net上找到它… = / 说我有三个文件叫 X:\Pictures\a.jpg X:\Pictures\s.jpg X:\Pictures\d.jpg 然后我想打开X:\Pictures文件夹,选择a.jpg , s.jpg和d.jpg 。

访问不存在的缩略图

我已经创建了一个应用程序,它会向您显示计算机中的文件列表。 每当您单击列表中的任何项目时,它旁边的小PictureBox都应显示相应文件的缩略图。 我在Windows 7上使用C#。 为了获得缩略图,我再次发现了一个在不同问题中发布的方法。 首先,我引用Windows API代码包。 然后,我使用以下代码: ShellFile shellFile = ShellFile.FromFilePath(fullPathToFile); myPictureBox.Image = shellFile.Thumbnail.LargeBitmap; 这并不总是有效。 有时,显示的缩略图仅仅是“默认应用程序”图标。 我发现只有在Windows之前为该文件生成缩略图并将其存储在缩略图缓存中时才显示真正的缩略图。 这意味着我必须手动打开文件夹,等待Windows为每个文件生成缩略图,然后我的应用程序将能够看到这些拇指。 我的程序如何在使用它们之前强制Windows 7生成真正的缩略图? 更新(由Li0liQ提供) 可以通过添加FormatOption强制缩略图检索: ShellFile shellFile = ShellFile.FromFilePath(fullPathToFile); shellFile.Thumbnail.FormatOption = ShellThumbnailFormatOption.ThumbnailOnly; myPictureBox.Image = shellFile.Thumbnail.LargeBitmap; 但是,我得到一个例外,如果缩略图还没有: 当前的ShellObject没有有效的缩略图处理程序,或者在提取此特定shell对象的缩略图时出现问题。 —> System.Runtime.InteropServices.COMException:未注册类(HRESULTexception:0x80040154(REGDB_E_CLASSNOTREG)) 请参阅如何在Windows资源管理器中刷新文件的缩略图? 潜在线索的问题和代码片段 。

如何为Windows创建自定义Shell上下文处理程序?

问题 语言:C#2.0或更高版本 当用户右键单击某些文件时(我的情况是* .eic),我想注册上下文处理程序来创建菜单。 从这些菜单中注册,注销(清理)和处理事件(点击)的过程是什么? 我有一个线索,它与Windows注册表有关,但考虑到.net中有多少东西,如果有方便的方法来做到这一点干净和简单,我不会感到惊讶。 代码片段,网站引用,评论都很好。 请把它们扔给我。 更新 显然,在托管语言中创建上下文菜单存在一些问题,正如一些用户所评论的那样。 是否有任何其他首选方法可以实现相同的行为,还是应该花时间研究这些变通方法? 我不介意这样做,我很高兴人们已经努力使这成为可能 – 但我仍然想知道是否有一个“适当/干净”的方式实现这一目标。

如何在C#中获取Windows资源管理器的选定文件?

我需要获取在Windows资源管理器中选择的当前文件集合。 我从这里找到了以下代码。 不过,我不在那里。 首先, GetForegroundWindow来自哪里? 另一方面,编译器在线上抱怨 var shell = new Shell32.Shell(); 话 “无法找到类型或命名空间名称’Shell32’(您是否缺少using指令或程序集引用?)”。 我已经添加了SHDocVw作为参考,但我仍然无法通过编译器。 有人可以帮我完成这个吗? IntPtr handle = GetForegroundWindow(); ArrayList selected = new ArrayList(); var shell = new Shell32.Shell(); foreach(SHDocVw.InternetExplorer window in shell.Windows()) { if (window.HWND == (int)handle) { Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); foreach(Shell32.FolderItem item in items) { selected.Add(item.Path); } } }

拖放动态创建的快捷方式

我有一个C#应用程序,它创建了用于启动具有特定参数和初始目录的其他程序的快捷方式。 我希望用户能够从Windows窗体拖动一个快捷方式,并将其放在任何相关的位置,如桌面,开始菜单等,但我真的不知道如何处理,有人可以指出我正确的方向? 我已经看过一些使用PInvoke和IShellLink的样本,或者像这里一样阅读SO上的答案,这已经有助于创建快捷方式并将它们保存在.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 […]

通过其pIDL识别Windows Shell特殊文件夹(即获取其CSIDL)(现在确定pIDL是否与C#相等)

我有一种情况,我想对一些Windows shell特殊文件夹(对应于CSIDL枚举中的值)执行特殊处理。(我的解决方案必须与WinXP兼容。)我遇到的问题是当我遇到IShellFolders时我沿着heirarchy工作,我找不到将IShellFolders与CSIDL相匹配的方法。 这是我目前的做法: 将所有CSIDL的静态一对一数据结构( csidlToFromFullPIdl )初始化为SHGetSpecialFolderLocation返回的pIDL。 foreach (CSIDL csidl in Enum.GetValues(typeof(CSIDL)) { IntPtr fullPIdl = IntPtr.Zero; int hResult = ShellApi.SHGetSpecialFolderLocation(IntPtr.Zero, csidl, ref fullPIdl); if (hResult != 0) Marshal.ThrowExceptionForHR(hResult); csidlToFromFullPIdl.Add(csidl, fullPIdl); } 使用Desktop IShellFolder启动heirarchy: int hResult = ShellApi.SHGetDesktopFolder(ref _shellFolder); hResult = ShellApi.SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.CSIDL_DESKTOP, ref _fullPIdl); 像这样检索孩子: hResult = _shellFolder.EnumObjects(IntPtr.Zero, SHCONTF.SHCONTF_FOLDERS, out pEnum); // Then repeatedly call: […]

如何在打开一个进程(记事本)后将焦点重新设置回forms?

我使用Process.Start()从程序中打开一个记事本,但新打开的记事本覆盖了屏幕。 但我确实希望我的应用程序保持其重点。 我同样(使用相同的Process.Start)打开MS Excel和Word,但要将焦点重新放回到我的表单,我需要写的是: this.Focus(); 但是用记事本怪起来:我打开记事本(以及所有其他这样的过程) Process process = new Process(); process.StartInfo.UseShellExecute = true; process.EnableRaisingEvents = true; process.StartInfo.FileName = @”abc.log”; process.Start(); 现在记事本成为焦点。 我试过这些: this.Activate() , this.Focus() ,不用说了 [DllImport(“user32.dll”, CharSet=CharSet.Auto, ExactSpelling=true)] public static extern IntPtr SetFocus(HandleRef hWnd); { IntPtr hWnd = myProcess.Handle; SetFocus(new HandleRef(null, hWnd)); } [DllImport(“User32”)] private static extern int SetForegroundWindow(IntPtr hwnd); [DllImportAttribute(“User32.DLL”)] private static […]