打电话
技术点
Windows.Phone.UI.Input 这是一个用于处理 Windows Phone 上的用户输入事件 的命名空间。它主要包含与硬件按钮
Windows.ApplicationModel.Calls 这是一个用于处理 电话相关功能 的命名空间,主要用于 UWP 应用中与电话呼叫相关的操作。
-
常用类:
PhoneCallManager:用于访问电话呼叫存储和管理呼叫。PhoneCallStore:用于获取电话线路信息。PhoneLine:表示一个电话线路,可以用来拨打电话。PhoneLineWatcher:用于监听电话线路的变化。
-
用途示例:
- 获取默认电话线路并拨打电话。
- 监听电话线路状态变化。
- 管理多个电话线路(如双卡设备)。
应用
// 异步方法,用于在当前电话线路上拨打指定号码
public async void DialOnCurrentLineAsync(string PhoneNumber, string DisplayName)
{
try
{
// 获取默认电话线路的任务
Task<PhoneLine> getDefaultLineTask = GetDefaultPhoneLineAsync();
// 等待任务完成并获取当前电话线路
currentPhoneLine = await getDefaultLineTask;
// 如果电话线路不为空且电话号码不为空,则拨打电话
if ((currentPhoneLine != null) && (PhoneNumber.Trim().Length > 0))
{
// 使用当前线路拨打电话,传入电话号码和显示名称
currentPhoneLine.Dial(PhoneNumber, DisplayName);
}
}
catch (Exception ex)
{
// 捕获异常(可以在此处添加日志或错误处理逻辑)
}
}
// 异步方法,用于获取默认的电话线路
private async Task<PhoneLine> GetDefaultPhoneLineAsync()
{
// 请求电话呼叫存储(PhoneCallStore)对象
PhoneCallStore phoneCallStore = await PhoneCallManager.RequestStoreAsync();
// 获取默认线路的唯一标识符(GUID)
Guid lineId = await phoneCallStore.GetDefaultLineAsync();
// 根据标识符获取电话线路对象并返回
return await PhoneLine.FromIdAsync(lineId);
}
发短信
技术点
Windows.ApplicationModel.Chat 这是一个用于处理 聊天和短信功能 的命名空间,主要用于 UWP 应用中与短信(SMS)和聊天消息相关的操作。
-
常用类:
ChatMessage:表示一条聊天或短信消息。ChatMessageManager:用于发送短信、获取短信历史记录等。ChatConversation:表示一个聊天会话。ChatMessageTransport:表示消息传输方式(如短信、彩信等)。
-
用途示例:
- 创建并发送短信。
- 获取设备上的短信记录。
- 管理聊天会话和消息传输。
Windows.Devices.Sms 这是一个更底层的命名空间,用于直接访问设备的 短信(SMS)功能,适用于需要更细粒度控制的场景。
-
常用类:
SmsDevice2:表示设备的短信功能接口。SmsMessageReceivedEventArgs:用于处理接收到的短信事件。SmsTextMessage2:表示一条文本短信。SmsSendMessageResult:表示发送短信的结果。
-
用途示例:
- 发送和接收短信。
- 监听短信接收事件。
- 获取短信发送状态和错误信息。
应用
// 获取默认的短信设备(通常是手机的短信模块)
device = SmsDevice2.GetDefault();
// 创建一个新的短信消息对象
SmsTextMessage2 msg = new SmsTextMessage2();
// 设置短信的接收方电话号码
msg.To = "phone number";
// 设置短信的内容
msg.Body = "message body";
// 异步发送短信,并获取发送结果
SmsSendMessageResult result = await device.SendMessageAndGetResultAsync(msg);
// 判断短信是否发送成功
if (result.IsSuccessful)
{
// 获取短信的参考编号列表(可能用于跟踪或日志)
IReadOnlyList<Int32> messageReferenceNumbers = result.MessageReferenceNumbers;
// 遍历参考编号并拼接到字符串中
for (int i = 0; i < messageReferenceNumbers.Count; i++)
{
msgStr += "\n\t\tMessageReferenceNumber[" + i.ToString() + "]: " + messageReferenceNumbers[i].ToString();
}
}
else
{
// 如果发送失败,记录错误码
msgStr += "ModemErrorCode: " + result.ModemErrorCode.ToString();
// 是否是临时错误(可能可以重试)
msgStr += "\nIsErrorTransient: " + result.IsErrorTransient.ToString();
// 如果是网络错误,获取更详细的错误信息
if (result.ModemErrorCode == SmsModemErrorCode.MessagingNetworkError)
{
// 网络原因码
msgStr += "\n\tNetworkCauseCode: " + result.NetworkCauseCode.ToString();
// 如果当前网络是 CDMA(码分多址),获取传输失败原因
if (result.CellularClass == CellularClass.Cdma)
{
msgStr += "\n\tTransportFailureCause: " + result.TransportFailureCause.ToString();
}
}
}
GPS定位
技术点
Windows.Devices.Geolocation 这是一个用于访问设备 地理位置信息(GPS、Wi-Fi、蜂窝网络等) 的命名空间,主要用于 UWP 应用中获取用户的当前位置或跟踪位置变化。
✅ 主要功能:
- 获取设备的当前位置(经度、纬度、高度等)。
- 监听位置变化事件。
- 获取地理位置的精度、来源(如 GPS 或网络)等信息。
📦 常用类:
Geolocator:核心类,用于请求位置、设置精度、监听位置变化。Geoposition:表示一个地理位置,包括坐标、时间戳等。Geocoordinate:包含经度、纬度、高度、速度、方向等信息。PositionChangedEventArgs:位置变化事件的参数。StatusChangedEventArgs:位置服务状态变化事件的参数。
应用
// 声明一个 Geolocator 对象,用于定位
Geolocator geolocator = null;
// 用于保存位置信息的字符串
string position;
// 异步请求访问地理位置的权限
var accessStatus = await Geolocator.RequestAccessAsync();
// 根据权限状态进行处理
switch (accessStatus)
{
// 如果用户允许访问位置
case GeolocationAccessStatus.Allowed:
// 创建 Geolocator 实例,并设置位置报告间隔为 2000 毫秒(2 秒)
geolocator = new Geolocator { ReportInterval = 2000 };
// 注册位置变化事件处理器
geolocator.PositionChanged += OnPositionChanged;
// 注册定位状态变化事件处理器
geolocator.StatusChanged += OnStatusChanged;
// 异步获取当前位置
Geoposition pos = await geolocator.GetGeopositionAsync();
// 提取经度和纬度,并格式化为字符串
position = $"当前位置经度{pos.Coordinate.Point.Position.Latitude},纬度{pos.Coordinate.Point.Position.Longitude}";
break;
// 如果用户拒绝或未指定权限
case GeolocationAccessStatus.Denied:
case GeolocationAccessStatus.Unspecified:
default:
// 设置提示信息,表示无法获取位置权限
position = "未获取到访问位置的权限";
break;
}
// 如果 geolocator 已创建,释放资源
if (geolocator != null)
{
// 取消注册位置变化事件
geolocator.PositionChanged -= OnPositionChanged;
// 取消注册状态变化事件
geolocator.StatusChanged -= OnStatusChanged;
// 释放 geolocator 对象
geolocator = null;
}
本地录音
技术点
🎵 Windows.Media.Audio 这是一个用于处理 高级音频图形和音频流处理 的命名空间,主要用于 UWP 应用中实现复杂的音频处理功能。
✅ 主要功能:
- 构建音频图(Audio Graph)以实现低延迟音频处理。
- 支持音频混合、录制、播放和实时处理。
- 可用于音频特效、音频分析、音频路由等高级场景。
📦 常用类:
AudioGraph:表示音频图的核心结构。AudioDeviceInputNode/AudioFileInputNode:音频输入节点。AudioDeviceOutputNode/AudioFrameOutputNode:音频输出节点。AudioFrame:用于处理音频数据帧。
📌 使用场景:
- 实时音频录制与播放。
- 音频特效处理(如回声、混响)。
- 音频可视化或分析。
应用
🎧 音频图创建与设备选择
// 创建 AudioGraphSettings 对象,指定音频渲染类别为 Media(媒体播放)
AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
// 设置量子大小选择模式为系统默认
settings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.SystemDefault;
// 获取所有音频输出设备(扬声器、耳机等)
var outputDevices = await DeviceInformation.FindAllAsync(MediaDevice.GetAudioRenderSelector());
// 如果找到了至少一个输出设备
if (outputDevices.Count > 0)
{
// 显示设备名称(例如扬声器)
this.deviceName.Text = outputDevices[0].Name;
// 设置音频图的主输出设备
settings.PrimaryRenderDevice = outputDevices[0];
}
🔊 创建音频图与输入/输出节点
// 创建 AudioGraph 对象
CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);
graph = result.Graph;
// 创建音频输入节点(例如麦克风)
CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other);
deviceInputNode = deviceInputNodeResult.DeviceInputNode;
// 创建音频输出节点(例如扬声器)
CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await graph.CreateDeviceOutputNodeAsync();
deviceOutputNode = deviceOutputNodeResult.DeviceOutputNode;
🎙️ 开始录音:选择文件并设置格式
// 创建文件保存选择器
FileSavePicker saveFilePicker = new FileSavePicker();
saveFilePicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
// 添加支持的音频格式
saveFilePicker.FileTypeChoices.Add("Pulse Code Modulation", new List<string>() { ".wav" });
saveFilePicker.FileTypeChoices.Add("Windows Media Audio", new List<string>() { ".wma" });
saveFilePicker.FileTypeChoices.Add("MPEG Audio Layer-3", new List<string>() { ".mp3" });
// 设置默认文件名
saveFilePicker.SuggestedFileName = "本地录音测试文件";
// 异步选择保存文件
StorageFile file = await saveFilePicker.PickSaveFileAsync();
// 如果用户取消选择,返回 false
if (file == null)
{
return false;
}
// 获取文件路径
audioPath = $"{file.Path}";
📁 设置编码格式并创建文件输出节点
MediaEncodingProfile fileProfile = null;
// 根据文件扩展名设置编码格式
switch (file.FileType.ToString().ToLowerInvariant())
{
case ".wma":
fileProfile = MediaEncodingProfile.CreateWma(AudioEncodingQuality.High);
break;
case ".mp3":
fileProfile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High);
break;
case ".wav":
fileProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.High);
break;
default:
throw new ArgumentException(); // 不支持的格式
}
// 创建文件输出节点,用于将音频写入文件
CreateAudioFileOutputNodeResult fileOutputNodeResult = await graph.CreateFileOutputNodeAsync(file, fileProfile);
// 如果创建失败,处理错误
if (fileOutputNodeResult.Status != AudioFileNodeCreationStatus.Success)
{
// 处理失败逻辑
}
fileOutputNode = fileOutputNodeResult.FileOutputNode;
🔁 连接节点并开始录音
// 将输入节点连接到文件输出节点和设备输出节点(同时录制和播放)
deviceInputNode.AddOutgoingConnection(fileOutputNode);
deviceInputNode.AddOutgoingConnection(deviceOutputNode);
// 启动音频图,开始录音
graph.Start();
⏹️ 停止录音并保存文件
// 停止音频图
graph.Stop();
// 完成文件写入并获取结果
截屏
技术点
🖥️ Windows.Graphics.Capture 这是一个用于 屏幕捕获(屏幕录制、截图) 的命名空间,主要用于 UWP 和 Win32 应用中捕获窗口或显示器的图像内容。
✅ 主要功能:
- 捕获整个屏幕或指定窗口的图像。
- 实时获取图像帧,用于录制或处理。
- 支持高性能图像采集,适合视频录制或流媒体应用。
📦 常用类:
GraphicsCaptureItem:表示一个可捕获的窗口或显示器。GraphicsCapturePicker:提供 UI 让用户选择要捕获的窗口。GraphicsCaptureSession:管理捕获会话。GraphicsCaptureFramePool:用于管理捕获的图像帧。
📌 使用场景:
- 屏幕录制工具。
- 实时视频流采集。
- 截图功能或图像分析。
🎨 Microsoft.Graphics.Canvas(来自 Win2D)这是一个用于 高性能 2D 图形绘制 的命名空间,属于 Win2D 图形库,专为 UWP 应用设计。
✅ 主要功能:
- 绘制图形、文本、图像等。
- 支持硬件加速的图像处理。
- 与 Direct2D 集成,性能优异。
📦 常用类:
CanvasDevice:表示绘图设备。CanvasRenderTarget:用于离屏渲染。CanvasBitmap:表示位图图像。CanvasDrawingSession:用于绘制图形内容。CanvasAnimatedControl:用于创建动画效果。
📌 使用场景:
- 自定义 UI 绘制。
- 图像处理与滤镜。
- 游戏或图形编辑器。
- 与
Windows.Graphics.Capture联合使用,实现捕获后图像处理。
应用
🖼️ 初始化 Canvas 设备
// 创建一个 CanvasDevice 对象,用于图像处理和绘制
var _imgDevice = new CanvasDevice();
📸 创建图像帧池和捕获会话
// 创建 Direct3D11CaptureFramePool,用于管理捕获的图像帧
var _imgFramePool = Direct3D11CaptureFramePool.Create(
_imgDevice, // 使用 CanvasDevice 作为 D3D 设备
DirectXPixelFormat.B8G8R8A8UIntNormalized, // 设置像素格式
2, // 设置帧缓冲数量
captureItem.Size); // 捕获区域的大小(窗口或屏幕)
// 创建捕获会话,绑定到指定的窗口或屏幕
var _session = _imgFramePool.CreateCaptureSession(captureItem);
// 启动捕获会话
_session.StartCapture();
🕒 等待并获取捕获帧
// 尝试获取下一帧图像
Direct3D11CaptureFrame capFrame = _imgFramePool.TryGetNextFrame();
var conter = 0;
// 如果没有获取到帧,则继续尝试(阻塞式等待)
while (capFrame == null)
{
capFrame = _imgFramePool.TryGetNextFrame();
}
🖌️ 将捕获帧转换为 CanvasBitmap
// 使用 Win2D 将 Direct3D 表面转换为 CanvasBitmap
CanvasBitmap canvasBitmap = CanvasBitmap.CreateFromDirect3D11Surface(
_imgDevice,
capFrame.Surface);
// 保存为图像对象
var _imgFrame = canvasBitmap;
💾 保存图像到文件
// 获取系统图片库文件夹
StorageFolder pictureFolder = KnownFolders.PicturesLibrary;
// 创建保存文件,命名为“操作系统工具-截图-时间戳.png”
var picFile = await pictureFolder.CreateFileAsync(
$"操作系统工具-截图-{DateTime.Now.ToString("yyyyMMdd-HHmm-ss")}.png",
CreationCollisionOption.ReplaceExisting);
// 打开文件流并保存图像为 PNG 格式
using (var fileStream = await picFile.OpenAsync(FileAccessMode.ReadWrite))
{
await _imgFrame?.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f);
}
录屏
技术点
同上 Windows.Graphics.Capture, Microsoft.Graphics.Canvas
应用
🎮 创建 Direct3D 设备与纹理资源
// 创建 Direct3D11 设备(用于图像捕获)
_videoDevice = Direct3D11Helpers.CreateDevice();
// 使用 SharpDX 封装的 D3D 设备(用于图像处理)
_sharpDxD3dDevice = Direct3D11Helpers.CreateSharpDXDevice(_videoDevice);
// 初始化一个空白纹理,用于将捕获帧复制到此纹理中
_composeTexture = Direct3D11Helpers.InitializeComposeTexture(_sharpDxD3dDevice, _captureItem.Size);
// 创建渲染目标视图,用于将图像渲染到纹理上
_composeRenderTargetView = new SharpDX.Direct3D11.RenderTargetView(_sharpDxD3dDevice, _composeTexture);
📐 设置视频编码参数
// 获取捕获区域的宽高
var width = (uint)_captureItem.Size.Width;
var height = (uint)_captureItem.Size.Height;
// 某些编码器要求宽高为偶数,进行处理
width = (width % 2 == 0) ? width : width + 1;
height = (height % 2 == 0) ? height : height + 1;
// 获取默认的 MP4 编码配置(用于参考比特率)
var temp = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);
var bitrate = temp.Video.Bitrate;
uint framerate = 40; // 设置帧率为 40fps
// 自定义编码配置
_encodingProfile = new MediaEncodingProfile();
_encodingProfile.Container.Subtype = "MPEG4";
_encodingProfile.Video.Subtype = "H264";
_encodingProfile.Video.Width = width;
_encodingProfile.Video.Height = height;
_encodingProfile.Video.Bitrate = bitrate;
_encodingProfile.Video.FrameRate.Numerator = framerate;
_encodingProfile.Video.FrameRate.Denominator = 1;
_encodingProfile.Video.PixelAspectRatio.Numerator = 1;
_encodingProfile.Video.PixelAspectRatio.Denominator = 1;
🎥 创建视频流描述与媒体源
// 创建未压缩的视频属性(用于 MediaStreamSource)
var videoProperties = VideoEncodingProperties.CreateUncompressed(MediaEncodingSubtypes.Bgra8, width, height);
var _videoDescriptor = new VideoStreamDescriptor(videoProperties);
// 创建媒体流源对象
_mediaStreamSource = new MediaStreamSource(_videoDescriptor);
_mediaStreamSource.BufferTime = TimeSpan.FromSeconds(0); // 设置缓冲时间为 0(实时)
_mediaStreamSource.Starting += OnMediaStreamSourceStarting; // 处理开始事件
_mediaStreamSource.SampleRequested += OnMediaStreamSourceSampleRequested; // 请求帧事件
🔄 初始化转码器与输出文件
// 创建媒体转码器,启用硬件加速
_transcoder = new MediaTranscoder();
_transcoder.HardwareAccelerationEnabled = true;
// 创建输出文件(保存到视频库)
var folder = KnownFolders.VideosLibrary;
var file = await folder.CreateFileAsync($"操作系统工具-录屏-{DateTime.Now.ToString("yyyyMMdd-HHmm-ss")}.mp4");
// 打开文件流用于写入视频数据
using (var videoStream = await file.OpenAsync(FileAccessMode.ReadWrite))
🧵 线程保护与事件初始化
// 启用多线程保护(SharpDX)
_multithread = _sharpDxD3dDevice.QueryInterface<SharpDX.Direct3D11.Multithread>();
_multithread.SetMultithreadProtected(true);
// 初始化帧事件与关闭事件
_frameEvent = new ManualResetEvent(false);
_closedEvent = new ManualResetEvent(false);
_events = new[] { _closedEvent, _frameEvent };
📡 创建帧池与捕获会话
// 注册关闭事件处理器
_captureItem.Closed += OnClosed;
// 创建帧池(FreeThreaded 模式,适合多线程)
_framePool = Direct3D11CaptureFramePool.CreateFreeThreaded(
_videoDevice,
DirectXPixelFormat.B8G8R8A8UIntNormalized,
1, // 每次只处理一帧
_captureItem.Size);
// 注册帧到达事件处理器
_framePool.FrameArrived += OnFrameArrived;
// 创建捕获会话并启动
_session = _framePool.CreateCaptureSession(_captureItem);
// 可选:移除窗口边框
// _session.IsBorderRequired = false;
// 启动屏幕捕获
_session.StartCapture();
拍照
技术点
🎥 Windows.Media.Capture 这是一个用于 捕获音频、视频和照片 的命名空间,主要用于 UWP 应用中访问和控制设备的摄像头和麦克风。
✅ 主要功能:
- 控制摄像头进行视频录制或拍照。
- 控制麦克风进行音频录制。
- 支持实时预览、媒体编码、闪光灯控制等。
- 可与
MediaCapture类配合使用,实现完整的媒体采集流程。
📦 常用类:
MediaCapture:核心类,用于初始化和控制媒体采集设备。MediaCaptureInitializationSettings:用于配置初始化参数,如设备类型、媒体流类型等。MediaEncodingProfile:用于设置录制文件的格式(如 MP4、MP3、WAV)。CameraCaptureUI:提供系统内置的拍照/录像界面。MediaCaptureVideoProfile:用于获取摄像头支持的视频配置。
📌 使用场景:
- 拍照或录像功能(如相机应用)。
- 录音功能(如语音备忘录)。
- 实时视频预览(如视频通话或直播)。
- 与
Windows.Graphics.Capture联合使用,实现屏幕与摄像头混合录制。
应用
🎥 初始化 MediaCapture 并请求权限
// 创建 MediaCapture 对象,用于控制摄像头和麦克风
_mediaCapture = new MediaCapture();
// 弹窗提示用户授权访问麦克风和摄像头
await _mediaCapture.InitializeAsync();
// 注册设备失败事件处理器
_mediaCapture.Failed += MediaCapture_Failed;
💡 保持屏幕常亮
// 防止屏幕在录制或拍照过程中自动关闭
DisplayRequest _displayRequest = new DisplayRequest();
_displayRequest.RequestActive();
📸 准备并拍摄照片(低延迟模式)
// 准备低延迟拍照(使用未压缩格式)
var lowLagCapture = await _mediaCapture.PrepareLowLagPhotoCaptureAsync(
ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
// 拍摄照片
var capturedPhoto = await lowLagCapture.CaptureAsync();
// 获取拍摄结果中的 SoftwareBitmap(图像数据)
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;
// 结束低延迟拍照会话
await lowLagCapture.FinishAsync();
📐 设置屏幕方向与预览
// 设置屏幕方向为横屏
DisplayInformation.AutoRotationPreferences = DisplayOrientations.Landscape;
// 将 MediaCapture 绑定到 UI 元素进行预览
captureElement.Source = _mediaCapture;
// 启动摄像头预览
await _mediaCapture.StartPreviewAsync();
🖱️ 启用拍照按钮
// 启用拍照和录像按钮
BtnCapturePhoto.IsEnabled = true;
BtnCaptureVideo.IsEnabled = true;
// 禁用拍照按钮(可能是为了防止重复点击)
BtnCapturePhoto.IsEnabled = false;
💾 保存照片到图片库
// 获取系统图片库
var myPictures = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
// 创建保存文件,命名为“操作系统工具-拍照-时间戳.jpg”
StorageFile file = await myPictures.SaveFolder.CreateFileAsync(
$"操作系统工具-拍照-{DateTime.Now.ToString("yyyyMMdd-HHmm-ss")}.jpg",
CreationCollisionOption.GenerateUniqueName);
🧭 拍照并设置图像属性
using (var captureStream = new InMemoryRandomAccessStream())
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
// 拍照并保存到内存流
await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), captureStream);
// 解码图像
var decoder = await BitmapDecoder.CreateAsync(captureStream);
// 创建编码器用于保存到文件
var encoder = await BitmapEncoder.CreateForTranscodingAsync(fileStream, decoder);
// 设置图像属性(方向)
var properties = new BitmapPropertySet {
{ "System.Photo.Orientation", new BitmapTypedValue(PhotoOrientation.Normal, PropertyType.UInt16) }
};
await encoder.BitmapProperties.SetPropertiesAsync(properties);
// 写入文件
await encoder.FlushAsync();
}
🖼️ 显示拍摄的图像
// 隐藏预览元素
this.captureElement.Visibility = Visibility.Collapsed;
// 显示图像控件
imageCapture.Visibility = Visibility.Visible;
imageCapture.Stretch = Stretch.UniformToFill;
// 加载拍摄的图像到 UI
using (var fileSystem = (await file.OpenAsync(FileAccessMode.Read)))
{
var bitImage = new BitmapImage();
bitImage.SetSource(fileSystem);
imageCapture.Source = bitImage;
}
摄像
技术点
同上Windows.Media.Capture
应用
🎥 初始化 MediaCapture 并请求摄像头/麦克风权限
// 创建 MediaCapture 对象,用于控制摄像头和麦克风
_mediaCapture = new MediaCapture();
// 弹窗提示用户授权访问麦克风和摄像头
await _mediaCapture.InitializeAsync();
// 注册设备失败事件处理器
_mediaCapture.Failed += MediaCapture_Failed;
💡 保持屏幕常亮
// 防止屏幕在录制过程中自动关闭
DisplayRequest _displayRequest = new DisplayRequest();
_displayRequest.RequestActive();
📸 准备拍照(低延迟模式)并获取图像数据
// 准备低延迟拍照(使用未压缩格式)
var lowLagCapture = await _mediaCapture.PrepareLowLagPhotoCaptureAsync(
ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
// 拍摄照片
var capturedPhoto = await lowLagCapture.CaptureAsync();
// 获取拍摄结果中的 SoftwareBitmap(图像数据)
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;
// 结束低延迟拍照会话
await lowLagCapture.FinishAsync();
📐 设置屏幕方向与预览
// 设置屏幕方向为横屏
DisplayInformation.AutoRotationPreferences = DisplayOrientations.Landscape;
// 将 MediaCapture 绑定到 UI 元素进行预览
captureElement.Source = _mediaCapture;
// 启动摄像头预览
await _mediaCapture.StartPreviewAsync();
🖱️ 控制按钮状态与 UI 显示
// 启用拍照和录像按钮
BtnCapturePhoto.IsEnabled = true;
BtnCaptureVideo.IsEnabled = true;
// 禁用录像按钮(可能是为了防止重复点击)
BtnCaptureVideo.IsEnabled = false;
// 禁用关闭按钮,防止用户中途关闭窗口
BtnClosed.IsEnabled = false;
// 隐藏图像控件,显示进度条
imageCapture.Visibility = Visibility.Collapsed;
progressBar.Visibility = Visibility.Visible;
progressBar.Value = _clicks;
// 如果点击次数达到最大值,重置
if (_clicks >= progressBar.Maximum)
{
_clicks = 0;
}
// 显示摄像头预览控件
captureElement.Visibility = Visibility.Visible;
📢 提示用户正在录像
// 弹窗提示用户正在录像,提醒如何停止
_ = new MessageDialog("摄像中,若要停止,请等待'停止摄像'按钮可以操作之后点击结束录制\"").ShowAsync();
💾 准备并开始录像
try
{
// 获取系统视频库
var myVideos = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
// 创建保存文件,命名为“操作系统工具-摄像-时间戳.mp4”
StorageFile file = await myVideos.SaveFolder.CreateFileAsync(
$"操作系统工具-摄像-{DateTime.Now.ToString("yyyyMMdd-HHmm-ss")}.mp4",
CreationCollisionOption.GenerateUniqueName);
// 准备低延迟录像到文件(使用 MP4 编码)
_mediaRecording = await _mediaCapture.PrepareLowLagRecordToStorageFileAsync(
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), file);
// 启动录像
await _mediaRecording.StartAsync();
// 更新 UI 提示
tblMsg.Text = "开始摄像...";
BtnStopVideo.IsEnabled = true;
}
catch (Exception ex)
{
// 异常处理:提示用户重试
_ = new MessageDialog("发生错误请重试一次!").ShowAsync();
}
联系人
技术点
📇 Windows.ApplicationModel.Contacts 这是一个用于 访问和管理联系人信息 的命名空间,主要用于 UWP 应用中与用户的联系人数据进行交互。
✅ 主要功能:
- 获取设备上的联系人列表。
- 创建、编辑或显示联系人信息。
- 与联系人相关的任务(如发送邮件、拨打电话、发送短信等)。
- 提供联系人选择器 UI,方便用户选择联系人。
📦 常用类:
Contact:表示一个联系人,包括姓名、电话、邮箱、地址等信息。ContactStore:用于访问和管理联系人存储。ContactPicker:提供系统 UI 让用户选择联系人。ContactEmail,ContactPhone,ContactAddress:表示联系人的具体信息项。
📌 使用场景:
- 在应用中显示联系人信息。
- 发送消息或邮件给联系人。
- 让用户从联系人列表中选择一个联系人。
- 与其他应用共享联系人数据。
应用
📇 读取联系人信息并格式化输出
// 创建一个 StringBuilder 用于收集联系人信息
var contactCollection = new StringBuilder();
// 请求联系人存储权限(AppContactsReadWrite 表示应用可读写自己的联系人)
var store = await ContactManager.RequestStoreAsync(ContactStoreAccessType.AppContactsReadWrite);
// 如果成功获取联系人存储
if (null != store)
{
// 获取联系人读取器
ContactReader reader = store.GetContactReader();
// 异步读取一批联系人
ContactBatch batch = await reader.ReadBatchAsync();
// 如果没有联系人
if (batch.Contacts.Count == 0)
{
contactCollection.Append("您还没有保存任何联系人信息!");
}
else
{
// 遍历联系人列表
foreach (var c in batch.Contacts)
{
// 如果联系人姓名不为空
if (!string.IsNullOrEmpty(c.Name))
{
// 拼接联系人姓名(名 + 姓)
contactCollection.AppendFormat($"姓名: {c.FirstName}{c.LastName}");
contactCollection.AppendLine();
// 拼接联系人电话
contactCollection.AppendFormat("电话: ");
IList<ContactPhone> Phones = c.Phones;
foreach (var p in Phones)
{
contactCollection.AppendFormat($"{p.Number};");
}
contactCollection.AppendLine();
}
}
}
}
日历访问
技术点
📅 Windows.ApplicationModel.Appointments 这是一个用于 管理日历和日程安排(Appointments) 的命名空间,主要用于 UWP 应用中与用户的日历数据进行交互。
✅ 主要功能:
- 创建、编辑和删除日程事件。
- 与系统日历集成,支持提醒、地点、参与者等信息。
- 提供日程选择器 UI,方便用户选择或查看日程。
- 支持访问设备上的多个日历源(如 Outlook、Exchange)。
📦 常用类:
Appointment:表示一个日程事件,包括标题、时间、地点、参与者等。AppointmentStore:用于访问和管理设备上的日历数据。AppointmentManager:用于显示系统日程 UI(如添加或编辑日程)。AppointmentCalendar:表示一个日历容器,可以包含多个日程。FindAppointmentsOptions:用于搜索日程时的筛选条件。
📌 使用场景:
- 在应用中添加或查看用户的日程安排。
- 提醒用户即将到来的会议或活动。
- 与联系人或位置服务集成,实现智能日程推荐。
- 提供日历视图或日程列表功能。
应用
📅 读取日程记录并统计数量
// 请求访问所有日历的读写权限
var appointmentStore = await AppointmentManager.RequestStoreAsync(AppointmentStoreAccessType.AllCalendarsReadWrite);
// 获取当前时间
var now = DateTime.Now;
// 计算一个月后的时间
var nextMonth = now.AddMonths(1);
// 计算时间范围(当前到下个月)
var difference = nextMonth - now;
// 在指定时间范围内查找日程记录
var appointments = await appointmentStore.FindAppointmentsAsync(now, difference);
// 构建提示信息,显示日程数量
var appMsg = $"当前共有{appointments.Count}个日程记录";
访问音乐库
技术点
📁 Windows.Storage 这是一个用于 访问和管理文件、文件夹和库 的命名空间,主要用于 UWP 应用中处理本地存储、云存储(如 OneDrive)以及系统库(如图片、视频、文档等)。
✅ 主要功能:
- 创建、读取、写入和删除文件与文件夹。
- 访问系统库(如图片库、视频库、文档库等)。
- 支持异步文件操作,适合现代应用的性能需求。
- 与
StorageFile,StorageFolder等类配合使用,实现文件系统交互。
📦 常用类:
StorageFile:表示一个文件,支持读取、写入、复制、移动等操作。StorageFolder:表示一个文件夹,支持创建子文件夹、列出文件等。KnownFolders:访问系统预定义的文件夹(如PicturesLibrary,VideosLibrary)。FileIO/PathIO:用于读写文件内容。StorageLibrary:用于访问用户库(如图片库、视频库)及其保存位置。
📌 使用场景:
- 保存用户拍摄的照片或录制的视频。
- 读取配置文件或日志文件。
- 让用户选择文件进行打开或保存。
- 与云端同步文件(如 OneDrive)。
应用
📁 请求访问系统库文件夹
// 请求访问“音乐库”文件夹(需要在 appxmanifest 中声明权限)
var accessMusic = await KnownFolders.RequestAccessAsync(KnownFolderId.MusicLibrary);
// 请求访问“图片库”文件夹
var accessPic = await KnownFolders.RequestAccessAsync(KnownFolderId.PicturesLibrary);
// 请求访问“视频库”文件夹
var accessVideo = await KnownFolders.RequestAccessAsync(KnownFolderId.VideosLibrary);
🔍 设置文件查询选项
// 创建查询选项,指定查询类型和文件类型过滤器
var queryOptions = new QueryOptions(CommonFileQuery.DefaultQuery, fileTypeFilter);
// 设置查询深度为 Deep,表示递归查询子文件夹中的文件
queryOptions.FolderDepth = FolderDepth.Deep;
📄 执行文件查询并获取结果
// 在指定文件夹中创建带查询选项的文件查询对象
var query = folder.CreateFileQueryWithOptions(queryOptions);
// 异步获取文件列表
IReadOnlyList<StorageFile> fileList = await query.GetFilesAsync();
指纹
技术点
🔐 Windows.Security.Credentials.UI 这是一个用于 处理用户身份验证界面 的命名空间,主要用于 UWP 应用中调用系统提供的安全凭据验证界面,例如 Windows Hello、生物识别、PIN 等。
✅ 主要功能:
- 显示系统身份验证对话框(如 Windows Hello)。
- 验证用户身份以保护敏感操作或数据。
- 支持生物识别(指纹、人脸)、PIN、密码等方式。
- 与系统安全机制集成,提升应用安全性。
📦 常用类:
UserConsentVerifier:用于检查设备是否支持 Windows Hello,并请求用户验证。CredentialPicker:显示凭据输入对话框(用户名/密码)。CredentialPickerOptions:配置凭据对话框的外观和行为。CredentialPickerResults:获取用户输入的凭据结果。
📌 使用场景:
- 在访问敏感数据前进行身份验证。
- 替代传统登录方式,使用 Windows Hello 提升用户体验。
- 在企业或安全应用中集成系统级认证。
应用
🔐 检查 Windows Hello(如指纹识别)是否可用
// 异步检查当前设备是否支持 Windows Hello(如指纹、人脸识别、PIN)
var ucvAvailability = await UserConsentVerifier.CheckAvailabilityAsync();
// 标记是否可用
var available = false;
// 用于保存提示信息
string resMsg = "";
// 根据返回的可用性状态进行处理
switch (ucvAvailability)
{
case UserConsentVerifierAvailability.Available:
// 指纹设备正常可用
available = true;
break;
case UserConsentVerifierAvailability.DeviceBusy:
// 指纹设备可用,但当前被其他应用占用
available = true;
break;
case UserConsentVerifierAvailability.DeviceNotPresent:
// 当前设备没有指纹识别硬件
resMsg = "当前系统版本不支持此功能!";
break;
case UserConsentVerifierAvailability.DisabledByPolicy:
// 指纹识别功能被管理员策略禁用
resMsg = "指纹识别模块被管理员禁用!";
break;
case UserConsentVerifierAvailability.NotConfiguredForUser:
// 当前用户未配置指纹信息
resMsg = "指纹信息缺失,请先添加指纹信息后再尝试!";
break;
default:
// 其他未知情况
resMsg = "当前系统版本不支持此功能!";
break;
}
蓝牙
技术点
📡 Windows.Devices.Enumeration 这是一个用于 枚举和管理设备信息 的命名空间,主要用于 UWP 应用中查找、识别和连接各种硬件设备。
✅ 主要功能:
- 枚举系统中的设备(如摄像头、麦克风、蓝牙设备、音频设备等)。
- 获取设备的属性、状态和连接信息。
- 监听设备的添加、移除或状态变化。
- 提供设备选择器 UI,供用户选择设备。
📦 常用类:
DeviceInformation:表示设备的详细信息,如名称、ID、状态等。DeviceWatcher:用于实时监听设备的变化(添加、移除、更新)。DevicePicker:用于显示设备选择界面。DeviceClass:定义设备类型(如音频、视频、蓝牙等)。DeviceInformationCollection:设备信息的集合。
📌 使用场景:
- 枚举并连接蓝牙设备。
- 获取摄像头或麦克风列表。
- 监听设备插拔事件。
- 构建设备选择界面供用户选择输入/输出设备。
应用
📡 查找支持 Obex Object Push 的蓝牙设备
// 异步查找所有支持 Obex Object Push 服务的蓝牙设备
var blservices = await DeviceInformation.FindAllAsync(
RfcommDeviceService.GetDeviceSelector(RfcommServiceId.ObexObjectPush));
🔗 连接第一个发现的蓝牙服务设备
// 如果发现了至少一个设备
if (blservices.Count > 0)
{
// 获取第一个设备的 Rfcomm 服务对象
var blservice = await RfcommDeviceService.FromIdAsync(blservices[0].Id);
// 请求访问该设备(通常会弹出系统蓝牙配对或连接提示)
var z = blservice.RequestAccessAsync();
}
3951

被折叠的 条评论
为什么被折叠?



