如何从PowerShell或CMD调用Windows 10共享对话框

13

在Windows 10中,如果您右键单击图像,您将发现一个名为“共享”的选项。

点击它会打开一个对话框,在这里您可以通过电子邮件、OneNote等方式分享图片。

有没有人知道我怎么可以从CMD或PowerShell中调用它?因为我想把这个功能添加到我的应用程序中。

我已经到了这一步,但是遇到了无效的窗口句柄错误:

$Target = "C:\Users\igweo\OneDrive\Pictures\wallpapers\luca-zanon-26595-unsplash.jpg"

$KeyPath1  = "HKCU:\SOFTWARE\Classes"
$KeyPath2  = "*"
$KeyPath3  = "shell"
$KeyPath4  = "{:}"
$ValueName = "ExplorerCommandHandler"
$ValueData = (Get-ItemProperty("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\" +
  "Explorer\CommandStore\shell\Windows.ModernShare")).ExplorerCommandHandler


$Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)
$Key3 = $Key2.CreateSubKey($KeyPath3, $true)
$Key4 = $Key3.CreateSubKey($KeyPath4, $true)
$Key4.SetValue($ValueName, $ValueData)

$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)
$Item.InvokeVerb("{:}")

$Key3.DeleteSubKey($KeyPath4)
if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) {
    $Key2.DeleteSubKey($KeyPath3)
}

此外,使用RUNDLL也不起作用:

RUNDLL32.EXE NTSHRUI.DLL,ShowShareFolderUI C:\Users\igweo\OneDrive\Pictures\wallpapers\luca-zanon-26595-unsplash.jpg

1
你想展示对话框还是执行其中的一个项目? - Anders
1
$explorer = new-object -comobject shell.application 用于控制外壳程序,然后 $Explorer.NameSpace ("D:\folder\").ParseName("TestImage.jpg").Verbs() 将显示它,动作名称为“Share”,但尝试调用 DoIt() 来调用它会导致异常:Exception calling "DoIt" with "0" argument(s): "Invalid window handle. (Exception from HRESULT: 0x80070578)"。注意,“如何调用此对话框?”这个问题并不等同于“如何将共享添加到我的 UWP 应用程序?”。 - TessellatingHeckler
嗨,我想在我的应用程序中单击按钮时显示所选图像的对话框。我正在使用PowerShell运行此操作。例如,我可以使用以下命令来运行打印:Start-Process -FilePath "C:\Users\igweo\500580_sole.jpg" -Verb Print | Out-Null; 但是运行以下命令会产生错误:Start-Process -FilePath "C:\Users\igweo\500580_sole.jpg" -Verb Share | Out-Null; 错误显示为:Start-Process:由于没有应用程序与该操作关联的指定文件,因此无法运行此命令。 - daibatzu
@Noodles,老实说我不太清楚如何使用这个,你能给我举个例子吗? - daibatzu
1
出于安全原因,我认为您无法从资源管理器外部的应用程序中调用此UI以在资源管理器上下文中运行。但是,这个“现代共享”UI可以直接使用DataTransferManager UWP API。而且,这个API也可以在桌面应用程序中使用(使用UWP桌面桥技术)。这里有一个WPF演示应用程序:https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/ShareSource 不确定如何从PowerShell中使用它(除了构建自定义的.exe或.dll并从PowerShell中调用它)。 - Simon Mourier
显示剩余3条评论
1个回答

2
感谢@Simon Mourier指引我找到答案。 解决方案可以在https://github.com/daibatzu/electron-sharing找到。
使用Visual Studio可以构建一个exe文件,我已经在readme.txt中包含了说明。
生成的exe是WindowsFormsApp2.exe。 然后可以通过以下方式共享文件:
WindowsFormsApp2.exe "C:\Projects\Javascript\photos\celeste.png" "C:\Projects\Javascript\photos\Silvercoins.jpg"
您可以通过打开cmd提示符并将文件名作为参数传递来测试此功能,导航到包含WindowsFormsApp2.exe的文件夹。
单击共享对话框外部将关闭WindowsFormsApp2.exe。 不幸的是,您需要使用Visual Studio更改此应用程序的图标。
我在发布中包含了一个版本,以防您不知道Visual Studio或C#。您需要7-zip(免费下载)才能解压缩它。
再次感谢Simon。 这比我想象的要花费更长时间。
编辑
由于Github出现问题,因此zip文件在此处:https://drive.google.com/file/d/1jyBqO6jmGo5dSxw32LXa5lej1J3ElD34/view?usp=sharing

1
请注意,您只需引用NuGet包“Microsoft.Windows.SDK.Contracts”,它将为您完成所有的UWP桥接工作。 - Simon Mourier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接