我正在寻找为特定 Windows 对象打开默认属性对话框的可能性,例如:
- services.msc 中特定服务的属性对话
- taskschd.msc 中特定计划任务的属性对话
- etc.
我不想与该对话交互或更改任何属性。我只想打开它们,让用户直接访问单个项目属性(而不是打开列表(通过调用 *.msc 可执行文件),用户必须在其中再次搜索对象)。
顺便说一句,我已经将对话功能部分复制到自己的表单和代码中以用于其他目的,但我想为用户提供打开默认功能并直接进行任何更改的选项。
现在,我找到了一些提示,但我陷入困境,因为总是缺少一些关键信息:
1.使用所谓的MMC(Microsoft管理控制台)的SnapIn
有这个相对较新的答案 https://stackoverflow.com/a/60697695/12622162它使用 VB 代码,但我不知道如何在 C# .NET Framework 中使用 MMC 自动化对象模型。
此外,没有简单明了的示例/说明如何通过使用来简单地调用现有的 .msc 进程/列表/窗口微软管理控制台 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mmc/reference/ms694632(v=vs.85)。相反,有几个令人恐惧的复杂教程如何在 C# 中实现 SnapIn。
这里需要明确的是:我想要做的是引用一个 dll,浏览一些列表(如果需要),然后调用属性对话框。
2.旧API的COM调用
有这个旧答案 https://social.msdn.microsoft.com/Forums/vstudio/en-US/0928fe2f-d4dc-474e-812b-28590ff8a190/open-the-properties-dialog-of-a-scheduled-task有人建议在过时的 ITaskScheduler 类上使用 invoke ,该类不能解决一般对话调用,但至少可以解决计划任务的问题。也许也可以对服务等使用类似的东西 - 但是,同样,没有明确的示例或解释如何实现这种方法。
这相对简单。
- 添加 COM 引用
Microsoft Management Console 2.0
.
- Add the
using MMC20
指示。
- 创建一个新的MMC20.应用 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mmc/application-object object
- Use the 应用程序.Load() https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mmc/application-load加载管理单元的方法(
services.msc
here)
- The 活动视图 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mmc/document-activeview of the 申请文件 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mmc/application-document包含项目列表:ListItems 属性 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mmc/view-listitems
- 按名称或索引选择节点并调用显示选择属性表() https://learn.microsoft.com/en-us/previous-versions/windows/desktop/mmc/view-displayselectionpropertysheet显示其属性窗格的方法
例如:
注:设置mmcApp.UserControl = 1;
让控制台保持打开状态,否则它将关闭。
using MMC20;
// [...]
MMC20.Application mmcApp = new MMC20.Application();
mmcApp.UserControl = 1;
mmcApp.Load("services.msc");
var doc = mmcApp.Document;
var view = doc.ActiveView;
var node = view.ListItems.OfType<Node>().FirstOrDefault(n => n.Name == "Base Filtering Engine");
if (node != null) {
view.Select(node);
view.DisplaySelectionPropertySheet();
}
要枚举 ListItems,请使用标准循环或扩展方法,如上所示:
var nodes = view.ListItems;
foreach (MMC20.Node node in nodes) {
Console.WriteLine(node.Name);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)