📜  Windows10开发-应用程序通信(1)

📅  最后修改于: 2023-12-03 15:05:57.841000             🧑  作者: Mango

Windows 10 开发 - 应用程序通信

在 Windows 10 中,许多应用程序需要相互通信,以实现协作和集成功能。本文将介绍 Windows 10 应用程序通信的方法和实现。

1. Windows 进程通信

在 Windows 中,进程间通信(IPC)是实现应用程序通信的基础。Windows 提供了多种 IPC 机制,如管道、邮槽、共享内存等等。在 Windows 10 中,使用较多的 IPC 机制是命名管道和 Windows 进程间通信(Windows IPC)。

1.1. 命名管道

命名管道是一种 IPC 机制,用于在本地计算机上的不同进程之间进行通信。它基于文件系统,使用一个命名的管道来进行通信。命名管道可以在客户端 - 服务器模式下使用,其中一个进程提供服务,另一个进程作为客户端使用该服务。

以下代码演示了如何在 C# 中使用命名管道进行通信:

using System;
using System.IO.Pipes;

class Program
{
    static void Main()
    {
        using (var server = new NamedPipeServerStream("test-pipe"))
        {
            server.WaitForConnection();
            Console.WriteLine("Client connected");

            byte[] buffer = new byte[1024];
            int numBytes = server.Read(buffer, 0, buffer.Length);
            Console.WriteLine($"Received {numBytes} bytes: {System.Text.Encoding.UTF8.GetString(buffer)}");
        }
    }
}

using System;
using System.IO.Pipes;

class Program
{
    static void Main()
    {
        using (var client = new NamedPipeClientStream(".", "test-pipe"))
        {
            client.Connect();
            Console.WriteLine("Connected to server");

            byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello, server!");
            client.Write(buffer, 0, buffer.Length);
            Console.WriteLine("Message sent to server");
        }
    }
}
1.2. Windows IPC

Windows IPC 是一种 Microsoft Windows 提供的 IPC 机制,用于在不同的进程和不同的计算机之间进行通信。Windows IPC 提供了多种机制,如邮槽、共享内存、标准输入输出(STDIO)等等。

以下代码演示了如何在 C# 中使用 Windows IPC 进行通信:

using System;
using System.IO.MemoryMappedFiles;

class Program
{
    static void Main()
    {
        using (var memoryMappedFile = MemoryMappedFile.CreateNew("test-map", 1024))
        {
            using (var accessor = memoryMappedFile.CreateViewAccessor())
            {
                byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
                accessor.WriteArray(0, buffer, 0, buffer.Length);
                Console.WriteLine("Message written to memory-mapped file");
            }
        }
    }
}
using System;
using System.IO.MemoryMappedFiles;

class Program
{
    static void Main()
    {
        using (var memoryMappedFile = MemoryMappedFile.OpenExisting("test-map"))
        {
            using (var accessor = memoryMappedFile.CreateViewAccessor())
            {
                byte[] buffer = new byte[1024];
                accessor.ReadArray(0, buffer, 0, buffer.Length);
                Console.WriteLine($"Received {buffer.Length} bytes: {System.Text.Encoding.UTF8.GetString(buffer)}");
            }
        }
    }
}
2. 应用程序通信

除了 Windows 的 IPC 机制外,Windows 10 应用程序还提供了各种应用程序间通信(App-to-App Communication)的机制,如自定义协议、应用程序联系人(Appointments and Contacts)、应用程序分享(ShareTarget)等等。

2.1. 自定义协议

自定义协议是一种应用程序间通信的机制,可以在应用程序之间传递数据。通过注册自定义协议,应用程序可以打开其他应用程序,并传递参数或数据。

以下代码演示了如何在 C# 中注册和使用自定义协议:

var uriBuilder = new UriBuilder("myapp:");
uriBuilder.Query = "message=hello";

var uri = uriBuilder.Uri;
var options = new LauncherOptions
{
    ContentType = "text/plain",
    TargetApplicationPackageFamilyName = "myapp_family_name"
};

bool success = await Launcher.LaunchUriAsync(uri, options);

在使用自定义协议时,需要确保目标应用程序已注册该协议。可以在应用程序清单文件(Package.appxmanifest)中执行此操作。

2.2. 应用程序联系人

应用程序联系人(Appointments and Contacts)是一种应用程序间通信的机制,用于共享联系人和约会等数据。通过注册应用程序联系人,应用程序可以在其他应用程序中显示其联系人数据。

以下代码演示了如何在 C# 中使用应用程序联系人:

var contact = new Windows.ApplicationModel.Contacts.Contact();
contact.Name = new Windows.ApplicationModel.Contacts.ContactName()
{
    FirstName = "John",
    LastName = "Doe"
};
await contact.SaveAsync();

var provider = new Windows.ApplicationModel.Contacts.Provider.ContactPicker();
provider.CommitButtonText = "Select";
provider.SelectionMode = Windows.ApplicationModel.Contacts.Provider.ContactSelectionMode.Fields;
provider.DesiredFieldsWithContactFieldType.Add(Windows.ApplicationModel.Contacts.ContactFieldType.Name);

var contact = await provider.PickSingleContactAsync();
if (contact != null)
{
    var name = contact.Name;
    var firstName = name.GivenName;
    var lastName = name.FamilyName;

    Console.WriteLine($"Selected contact: {firstName} {lastName}");
}
2.3. 应用程序分享

应用程序分享(ShareTarget)是一种应用程序间通信的机制,用于从一个应用程序向另一个应用程序共享数据。用户可以选择要分享的数据,并选择目标应用程序。

以下代码演示了如何在 C# 中使用应用程序分享:

var dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += OnDataRequested;

void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    args.Request.Data.SetText("Hello, world!");
}

在应用程序中注册应用程序分享之后,当用户选择分享时,将调用 DataRequested 事件处理程序。在 DataRequested 事件处理程序中,应用程序可以添加要分享的数据。