UWP 敏感行为 API及应用

打电话

技术点

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值