https://mp.weixin.qq.com/s/wEzPwThrcfnDlx8C_8aLAQ
https://learn.microsoft.com/zh-cn/windows/uwp/launch-resume/launch-screen-snipping
ms-screensketch:edit?source=MyApp&isTemporary=false&sharedAccessToken=2C37ADDA-B054-40B5-8B38-11CED1E1A2D
ms-screenclip:
仔细研究你会发现,Win11 的截图其实已经是 UWP 应用了,就算你吧 Win10 的 SnippingTool.exe 复制到 Win11 也是报错,无法使用的,所以你也不可能在自己的软件打包带上它。
经过几番折腾,我在微软社区提问和提交反馈( Win + F 的时候我觉得这个软件是不是这样启动直接就先截了个屏 ),但是没有找到新版本截图的启动参数。最后直到我前几天发现 Microsoft Learn 的文章 启动屏幕截取 - UWP applications[5]。在 UWP 里使用这么简单嘛,使用 LaunchUriAsync 就可以了。
bool result = await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-screenclip:"));
有了 URI 的方式,一切就变简单了,你甚至可以在浏览器里调用截图,放一个超链接,或者直接在浏览器地址栏粘贴ms-screenclip:后回车打开截图。
之后我们只需要监听进程结束就可以了,这里需要说明的是,不是启动的进程,而是截图的进程,下面直接上在 WinForm 中使用的代码:
var psi = new ProcessStartInfo()
{
UseShellExecute = true,
FileName = "ms-screenclip:"
};
Process.Start(psi);
// 获取 ScreenClippingHost 这个截图进程的结束事件
var snippingToolProcess = Process.GetProcessesByName("ScreenClippingHost")[0];
snippingToolProcess.EnableRaisingEvents = true;
snippingToolProcess.Exited += SnippingToolProcess_Exited;
SnippingToolProcess_Exited 事件:
private void SnippingToolProcess_Exited(object? sender, EventArgs e)
{
this.BeginInvoke(new Action(() =>
{
var img = Clipboard.GetImage();
}));
}
References
[1] flameshot: https://github.com/flameshot-org/flameshot
[2] CSkin: http://www.cskin.net/
[3] HandyControl: https://handyorg.github.io/handycontrol/extend_controls/screenshot/
[4] ScreenCapturerSharp: https://www.nuget.org/packages/ScreenCapturerSharp
[5] 启动屏幕截取 - UWP applications: https://learn.microsoft.com/zh-cn/windows/uwp/launch-resume/launch-screen-snipping