首页 > 编程语言 >浅谈在.Net Framework Winforms程序中调用 WinRT API

浅谈在.Net Framework Winforms程序中调用 WinRT API

时间:2024-09-22 16:12:47浏览次数:9  
标签:调用 浅谈 Windows 录音 WinForms Framework API WinRT

浅谈在.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 现代开发技术的兴趣。

标签:调用,浅谈,Windows,录音,WinForms,Framework,API,WinRT
From: https://www.cnblogs.com/netlog/p/18425465

相关文章

  • 浅谈金融科技十大发展趋势
    当前,新一轮科技革命和产业变革深入发展,正在加快生产力和生产关系变革。金融科技作为技术驱动的金融创新,在银行发展全局中的地位和作用将愈发凸显。银行业要努力探寻金融科技发展的根本规律和发展趋势,不断掌握新技术、新技能,创新应用新方法、新工具,充分发挥科技创新的战略先导地......
  • Nuxt Kit API :路径解析工具
    title:NuxtKitAPI:路径解析工具date:2024/9/22updated:2024/9/22author:cmdragonexcerpt:摘要:本文介绍了NuxtKit中用于解析路径的API工具,包括resolvePath、resolveAlias、findPath和createResolver。这些工具助力开发者处理模块路径、别名、文件扩展名,提升模块和插......
  • 学习使用 API 构建旅行应用程序
    加入APILayer和Filestack参加关于创建旅行应用程序的富有洞察力的网络研讨会于2024年9月19日美国标准时间上午11点使用强大的API。Filestack客户成功经理RodrigoGullen和APILayer大使PrathamKumar将展示如何使用API构建旅行应用程序。免费网络研讨会将......
  • js逆向实战之Bitcoin浏览器交易x-apikey参数加密逻辑
    声明:本篇文章仅用于知识分享实战网址:https://www.oklink.com/zh-hans/btc/tx-list分析过程访问网址,会触发一条数据包。看它的响应内容。就是我们想要获取的内容,找到数据了。可以先尝试直接去访问该url,看能否获取数据。importrequestsurl="https://www.oklink.com/a......
  • LangChain4j支持的API类型
    本文描述了底层的大语言模型(LLM)API。高级的LLMAPI参见AI服务。1LLMAPI的类型1.1LanguageModel非常简单—,接受一个String作为输入,并返回一个String作为输出。该API现正逐渐被聊天API(第二种API类型)取代。1.2ChatLanguageModel这种API接受一或多个ChatMessage作为输入,并返......
  • LangChain4j支持的API类型
    本文描述了底层的大语言模型(LLM)API。高级的LLMAPI参见AI服务。1LLMAPI的类型1.1LanguageModel非常简单—,接受一个String作为输入,并返回一个String作为输出。该API现正逐渐被聊天API(第二种API类型)取代。1.2ChatLanguageModel这种API接受一或多个ChatMessage作为输入,并返......
  • 了解如何在 <lines (Modulojs) 中创建 API 支持的 Zelda BOTW 怪物画廊 Web 组件
    模数教程回来了!大家好!暑假结束后,我带着modulo教程回来了。我正在制作更多教程-请继续关注。也就是说,如果您对我的下一个主题有任何特别的想法,请务必在评论中告诉我!我的上一篇教程是关于api驱动的pokémondanceparty组件的超级快速且有趣的“仅html,无js”教程,不到30......
  • 为什么 Streams API 改变了 Web 开发者的游戏规则
    我们首先解释一下数据是如何通过网络发送的。它不是作为单个连续流发送的;相反,它被分成更小的块。在接收端,消费者或应用程序负责在收到所有数据后以正确的顺序和格式重新组装这些块。对于图像、视频和其他相对较大的数据类型,此过程会自动发生。因此streamsapi提供的是一种无需等......
  • 了解 API:应用程序如何通信:
    api(应用程序编程接口)是一组规则和定义,允许一个软件应用程序与另一个软件应用程序进行通信。它充当中介,通过定义不同的软件系统可以发出的请求类型、如何发出这些请求、数据格式以及系统应如何响应,使不同的软件系统能够相互交互。api中的关键概念端点:这些是api公开的特定......
  • 【python】Panda 之Dataframe 基础api讲解代码 建议在Jupyter Notebook 中运行
    建议在JupyterNotebook中运行jupyternotebook环境搭建文章目录1.dataframe常用属性2.dataframe的常用方法3.dataframe对象的布尔值操作4.datafrane对象的计算5.更改series和dataframe对象5.2修改行名和列名5.3添加删除插入列6.导入和导出数据6.1导......