张赐荣——一位视障程序员。
赐荣小站: www.prc.cx

張賜榮

张赐荣的技术博客

博客园 首页 新随笔 联系 订阅 管理

浅谈在.Net Framework桌面应用中调用 WinRT API

【作者:张赐荣】

在开发 Windows 程序时,我们经常会遇到需要调用系统功能的场景,比如文件操作、录音、摄像头管理等。在传统的桌面应用开发中,使用 .Net Framework 封装的 Win32 API** 或者直接调用底层复杂的 com 接口来完成这些功能,但随着现代 Windows 的发展,微软推出了 WinRT API。今天我们就来简单谈一谈 WinRT API 以及如何在 WinForms 桌面应用中调用它。


什么是 WinRT API?

WinRT API 是微软为 Windows 系统推出的一套现代化应用接口,目的是为开发者提供一个统一的方式来访问系统功能。WinRT 的一个显著特点是,它不仅支持传统的桌面应用,还能够跨平台在 Windows 的多种设备(比如 PC、平板、手机)上使用。

WinRT API 是基于 COM 的现代化扩展,它通过简化的语法和跨语言支持,将传统 COM 技术应用于 Windows 运行时环境,使开发者能够更轻松地调用底层系统功能,同时保留了 COM 的组件化和二进制兼容特性,提供了更加现代的编程模型,尤其是异步调用。这让应用在调用系统功能时不会因为等待而卡住界面,提升了用户体验。

为什么 WinForms 不能直接调用 WinRT API?

WinForms 是基于 .NET FrameworkWin32 API 的桌面应用开发框架,它诞生于 Windows 传统桌面时代,而 WinRT API 则是为现代化应用设计的。由于 WinForms 使用的是基于 Win32 的技术栈,它并不能直接调用 WinRT API

为了解决这个问题,我们需要借助一个工具包 Microsoft.Windows.SDK.Contracts,通过这个工具,WinForms 就可以像“翻译”一样,理解并调用 WinRT 提供的 API。

什么是 Microsoft.Windows.SDK.Contracts?

Microsoft.Windows.SDK.Contracts 是一个 NuGet 包,它包含了 WinRT API 的契约定义。简单来说,它是一个“桥梁”,帮助 .NET Framework(例如 WinForms)理解和调用 WinRT API

在引用 Microsoft.Windows.SDK.Contracts 之后,WinForms 就可以调用 WinRT 中的各种系统功能,比如音频、视频处理、文件操作等。这大大扩展了传统桌面应用的功能,让它们能够使用 Windows 最新的系统特性。

如何在 NuGet 控制台中为项目添加 Microsoft.Windows.SDK.Contracts?

WinForms 项目中添加 Microsoft.Windows.SDK.Contracts,可以通过 NuGet 控制台来完成。以下是具体步骤:

  1. 启动 Visual Studio,打开 WinForms 项目。

  2. 点击顶部菜单的 “工具”,选择 “NuGet 包管理器”,然后选择 “程序包管理器控制台”

  3. 在打开的控制台中,输入下面的命令:

    Install-Package Microsoft.Windows.SDK.Contracts
    
  4. 按回车,等待 NuGet 自动为项目安装该包。

安装完成后,项目就可以使用 WinRT API 了。接下来我们通过一个简单的例子来看看如何在 WinForms 项目中调用 WinRT API

实现一个简单的录音机程序

编写一个小程序,演示一下如何在 WinForms 中使用 WinRT API 实现录音功能。

核心代码

下面是一个简单录音机的代码:

using System;
using System.IO;
using System.Windows.Forms;
using Windows.Media.Capture;
using Windows.Media.MediaProperties;
using Windows.Storage;

namespace WinForms
{
	public partial class MainForm : Form
	{
		private MediaCapture MediaCapture = new Windows.Media.Capture.MediaCapture();

		private async void MainForm_Shown(object sender, EventArgs e)
		{
			this.StopRecordBtn.Enabled = false;
			await this.MediaCapture.InitializeAsync(new Windows.Media.Capture.MediaCaptureInitializationSettings() { StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Audio });
		}

		private async void StartRecordBtn_Click(object sender, EventArgs e)
		{
			this.StartRecordBtn.Enabled = false;
			this.StopRecordBtn.Enabled = true;
			this.StopRecordBtn.Focus();
			string audioFilePath = Application.StartupPath + @"\record.m4a";
			File.WriteAllBytes(audioFilePath, new byte[0]);  // 创建一个空的 m4a 文件
			StorageFile audioFile = await StorageFile.GetFileFromPathAsync(audioFilePath);
			await this.MediaCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateM4a(AudioEncodingQuality.Low), audioFile);
		}

		private async void StopRecordBtn_Click(object sender, EventArgs e)
		{
			this.StopRecordBtn.Enabled = false;
			await this.MediaCapture.StopRecordAsync();
			this.StartRecordBtn.Enabled = true;
			this.StartRecordBtn.Focus();
		}
	}
}

代码的工作原理

  1. 初始化录音功能:我们通过 MediaCapture.InitializeAsync 来初始化麦克风,告诉系统准备开始录音。这里我们设置了 StreamingCaptureModeAudio,意味着我们只捕获音频。
  2. 开始录音:点击“开始录音”按钮时,程序会调用 StartRecordToStorageFileAsync,并将录音保存到一个 .m4a 文件中。代码先创建一个空的文件,然后通过 WinRT API 将录音数据保存到这个文件中。
  3. 停止录音:点击“停止录音”按钮时,调用 StopRecordAsync 停止录音,录音结果会被写入到文件中。

WinRT API 与 .NET 的 API 有什么不同?

借助上面的例子,大家应该看到了 WinRT API 和传统 .NET API 有一些不同:

  1. 在 WinRT 中,很多操作都是异步的(如 InitializeAsyncStartRecordToStorageFileAsync)。这让应用在调用这些耗时操作时不会卡住界面,而是可以继续响应用户操作。这也是现代应用中一个非常重要的特点。

  2. WinRT 提供了更加高级的文件操作接口,比如 StorageFile,相比传统的文件流操作,它的使用更加方便直观,尤其是当我们需要处理异步文件操作时。

总结

通过这篇文章,我们简单给大家介绍了 WinRT API,以及如何在 WinForms 桌面应用中调用。为了让 WinForms 能够使用 WinRT API,我们需要借助 Microsoft.Windows.SDK.Contracts 这个工具包。

希望本文的抛砖引玉能让你对 WinRT API 有一个初步的了解,并激发你进一步探索 Windows 现代开发技术的兴趣。

posted on 2024-09-22 16:19  张赐荣  阅读(26)  评论(0编辑  收藏  举报

感谢访问张赐荣的技术分享博客!
博客地址:https://cnblogs.com/netlog/
知乎主页:https://www.zhihu.com/people/tzujung-chang
个人网站:https://prc.cx/