【问题标题】:Open some Windows dialogs directly直接打开一些 Windows 对话框
【发布时间】:2025-11-22 21:00:01
【问题描述】:

我希望能够通过我的软件直接访问多个 Windows 对话框。基本上是一些我不时使用的对话框的快捷方式,否则很难访问。

一个例子是“合并或删除网络位置”对话框 (screenshot)。

使用 Process Explorer 我发现了有关该对话框的以下信息:

C:\Windows\System32\netprof.dll
C:\Windows\system32\DllHost.exe /Processid:{44C39C96-0167-478F-B68D-783294A2545D}

不幸的是,我不知道如何处理它。 对于其他对话框/位置,有这样的方法:

Trash:
%windir%\explorer.exe /n,::{645FF040-5081-101B-9F08-00AA002F954E}
Keyboard:
%systemroot%\system32\control.exe /name Microsoft.RegionalAndLanguageOptions /page /p:"keyboard"

但我想不出一个通用的方法来做到这一点。

在这种情况下,编程语言无关紧要。欢迎您以任何语言或通过命令提示符发布解决方案。请以提到的对话框为例,但我希望找到一个通用的解决方案。谢谢。

【问题讨论】:

  • 有用的相关项目在这里serverfault.com/questions/3780/…
  • 没有通用的解决方案,标准 Windows 组件使用的无数对话框可以通过多种不同的方式启动。有些可能没有实用的方法在使用它们的组件之外启动。您提到的特定对话框看起来像是在 COM 服务器中运行。您可以相对轻松地启动服务器,但这可能不会导致显示对话框。没有一般的方法可以要求 COM 服务器显示特定的对话框,并且这个特定的 COM 服务器可能无法提供任何方法来告诉它显示您想要的对话框。
  • “没有一般的方法可以让 COM 服务器显示特定的对话框” - 为什么不呢?如果另一个 Windows 对话框中的链接可以启动它,为什么我的程序不能这样做?该特定对话框不依赖于先前对话框中的任何参数。它是独立的。一定有办法找出它最初是如何启动并复制该操作的!?
  • 没有 API。它们是内部的,旨在由操作系统调用,而不是由您的程序调用。这基本上相当于我问如何让我的应用程序从 your 应用程序打开对话框!

标签: windows command-line command-prompt shortcut


【解决方案1】:

并非每个对话框都可以按照您的建议以编程方式访问。有些对话框是启动它们的应用程序自定义的,因此您将无法轻松访问它们。

我找不到您主要感兴趣的“合并或删除网络位置”对话框的引用。

可以访问的,基本上有两种。

  1. 可以从常规 Windows 命令行调用的对话框。 As mentioned by kenny 在 cmets 中,这个 serverfault question 捕获了很多已知的命令。

  2. 另一种方法是通过 powershell 启动对话框。 Powershell 可以访问和启动 .NET 框架对话框。 This TechNet Scripting Guys文章提供了一个通过powershell启动打开文件对话框的例子。

这篇文章很值得一读,但这是施展魔法的 sn-p。

Function Get-FileName($initialDirectory)
{  
     [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |  Out-Null

 $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
 $OpenFileDialog.initialDirectory = $initialDirectory
 $OpenFileDialog.filter = "All files (*.*)| *.*"
 $OpenFileDialog.ShowDialog() | Out-Null
 $OpenFileDialog.filename
} #end function Get-FileName

# *** Entry Point to Script ***

Get-FileName -initialDirectory "c:\fso"

如果您想要打开文件对话框之外的其他内容,您可以将以下行更改为您需要的对话框。 $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog

【讨论】:

  • 虽然您的答案显示了一种以编程方式打开对话框的方法,但它仅限于 System.Windows.Forms.* 中的对话框,这在我的情况下不太有用。我非常确信有一种方法可以打开我知道 dll 及其 GUID 的特定形式。到目前为止,所有答复都表明这是不可能的。但是,如果我作为开发人员学到了一件事,那就是在编码中没有“不可能”,有些事情只是稍微复杂一点,甚至可能“骇人听闻”,但绝不是不可能的。