如何让C#应用(WinForm/UWP)兼容Microsoft Edge共享命令并接收链接
嘿,这个需求完全不用非得转UWP就能实现!我分两种场景给你讲清楚具体怎么做:
一、保留Windows Forms应用:实现Edge共享接收功能
不用把现有WinForms项目改成UWP,只要借助WinRT API和系统的共享框架就能搞定,步骤如下:
- 添加WinRT API引用:因为WinForms默认不包含WinRT组件,你可以通过NuGet安装
Microsoft.Windows.SDK.Contracts包,或者在项目引用里手动添加Windows相关的WinRT组件(仅支持Win10及以上系统)。 - 修改应用清单,注册共享目标:在
app.manifest文件里添加共享目标的扩展声明,告诉系统你的应用能接收Uri类型的共享内容(也就是Edge的页面链接)。示例代码如下:
注意:如果你的应用没打包成MSIX,可能需要手动注册注册表,但更推荐用MSIX打包(Visual Studio里有专门的打包项目模板),这样系统能自动识别共享目标。<Application xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- 其他原有内容 --> <Extensions> <uap:Extension Category="windows.shareTarget"> <uap:ShareTarget> <uap:SupportedFileTypes /> <uap:DataFormat>Uri</uap:DataFormat> </uap:ShareTarget> </uap:Extension> </Extensions> </Application> - 处理共享激活事件:在
Program.cs里监听应用的激活事件,判断是否是来自Edge的共享请求,然后提取页面链接。示例代码:
记得在主窗体里添加对应的构造函数,接收Uri字符串并处理。using Windows.ApplicationModel.Activation; using Windows.ApplicationModel.DataTransfer; using System.Threading.Tasks; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 检查是否是共享激活触发的启动 var activationArgs = AppInstance.GetCurrent().GetActivatedEventArgs(); if (activationArgs.Kind == ActivationKind.ShareTarget) { var shareArgs = activationArgs as ShareTargetActivatedEventArgs; var shareOperation = shareArgs.ShareOperation; // 异步获取共享的Uri链接 Task.Run(async () => { if (shareOperation.Data.Contains(StandardDataFormats.Uri)) { var uri = await shareOperation.Data.GetUriAsync(); // 将链接传递给主窗体显示或处理 Application.Run(new MainForm(uri.AbsoluteUri)); } // 告诉系统共享操作已完成 shareOperation.ReportCompleted(); }).Wait(); } else { // 正常启动应用 Application.Run(new MainForm()); } }
二、转为Windows Universal App(UWP):原生实现共享功能
如果愿意重构为UWP应用,那实现起来更原生,系统支持也更完善,核心用UWP的共享目标合约:
- 声明共享目标扩展:在
Package.appxmanifest里添加ShareTarget扩展,指定支持Uri格式的共享内容。 - 处理共享激活逻辑:在
App.xaml.cs中重写OnShareTargetActivated方法,跳转到专门的共享处理页面;然后在该页面中提取并处理Edge发来的页面链接。
示例代码:
在App.xaml.cs中:
using Windows.ApplicationModel.Activation; using Windows.ApplicationModel.DataTransfer; using Windows.UI.Xaml.Controls; protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args) { var shareOperation = args.ShareOperation; // 跳转到共享处理页面 var rootFrame = new Frame(); rootFrame.Navigate(typeof(ShareTargetPage), shareOperation); Window.Current.Content = rootFrame; Window.Current.Activate(); }
在ShareTargetPage.xaml.cs中:
using Windows.ApplicationModel.DataTransfer; using Windows.UI.Xaml.Navigation; protected override async void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); var shareOperation = e.Parameter as ShareOperation; if (shareOperation != null && shareOperation.Data.Contains(StandardDataFormats.Uri)) { var uri = await shareOperation.Data.GetUriAsync(); // 在这里处理链接,比如显示在页面上或保存到本地 UriDisplayTextBlock.Text = uri.AbsoluteUri; // 通知系统共享完成 shareOperation.ReportCompleted(); } }
两种方案对比
- WinForms方案:适合已有项目的改造,不需要重构,但需要处理WinRT集成和MSIX打包的细节,兼容性针对Win10及以上系统。
- UWP方案:原生支持共享框架,开发更顺畅,但需要将现有WinForms代码迁移到UWP环境,适合新项目或者愿意重构的场景。
内容的提问来源于stack exchange,提问作者Danilo.NET




