https://mp.weixin.qq.com/s/wEzPwThrcfnDlx8C_8aLAQ

https://learn.microsoft.com/zh-cn/windows/uwp/launch-resume/launch-screen-snipping

ms-screensketch:edit


ms-screensketch:edit?source=MyApp&isTemporary=false&sharedAccessToken=2C37ADDA-B054-40B5-8B38-11CED1E1A2D

ms-screenclip

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

文档更新时间: 2022-11-06 15:42   作者:admin