You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让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的页面链接)。示例代码如下:
    <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>
    
    注意:如果你的应用没打包成MSIX,可能需要手动注册注册表,但更推荐用MSIX打包(Visual Studio里有专门的打包项目模板),这样系统能自动识别共享目标。
  • 处理共享激活事件:在Program.cs里监听应用的激活事件,判断是否是来自Edge的共享请求,然后提取页面链接。示例代码:
    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());
        }
    }
    
    记得在主窗体里添加对应的构造函数,接收Uri字符串并处理。
二、转为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

火山引擎 最新活动