windows-runtime 相关问题

Windows运行时(WinRT)是一种Microsoft平台体系结构,允许应用程序在沙盒环境中运行,从而暴露“Win​​dows现代风格”UI / UX。不要与用于ARM设备的Windows 8版本Windows RT相混淆;看到windows-rt。

WinUI3 C++ 数据绑定

在提到我关于 TreeView 的问题时,建议我使用数据绑定来填充 TreView 的项目。 我在 Desktop C++ VS 2022 项目中创建了一个新的黑色应用程序、打包的 WinUI3。 这...

回答 1 投票 0

如何在 C++/WinRT (WinUI3) 中将图像从内存读取到 ImageSource?

[1] 我想在 XAML 中显示 Image 控件的图像,但该图像来自字节数组。 我应该怎么办?图像格式可以是JPG、BMP或PNG之一。 [1] 我想在 XAML 中显示 Image 控件的图像,但该图像来自字节数组。 我该怎么办?图像格式可以是 JPG、BMP 或 PNG 之一。 <Image x:Name="img"/> void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data img().Source(???); // what should I do? } [2] 我尝试了InMemoryRandomAccessStream,但没有成功。 我知道在C#中使用MemoryStream很方便,但是如何在C++中实现它? 另一个问题是这个方法是否也适用于JPG和PNG格式的图像? void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; winrt::Windows::Storage::Streams::InMemoryRandomAccessStream stream; // How to read data from stream? bmp.SetSource(stream); img().Source(bmp); } [3] 现在功能已经实现了,但是还有两个问题 IAsyncAction MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; winrt::Windows::Storage::Streams::InMemoryRandomAccessStream stream; winrt::Windows::Storage::Streams::DataWriter dw(st.GetOutputStreamAt(0ULL)); dw.WriteBytes({ buf, size }); // This is very inefficient! co_await dw.StoreAsync(); dw.Close(); bmp.SetSource(stream); img().Source(bmp); stream.Close(); } 首先,我发现DataWriter::WriteBytes()确实是在复制数据。但我认为ImageSource只需要从我的buf中读取即可,不需要在读取之前将整个图像完全复制到流中。也许是类似MemoryView的东西,我这样想是不是错了? 其次,DataWriter和InMemoryRandomAccessStream的Close()应该在哪里调用? BitmapImage需要释放内存吗?这里有一个异步函数,我不知道应该写在哪里 [4] 根据IInspectable,我尝试了SHCreatMemStream并搜索了大量信息以提出另一个解决方案。目前的问题是,与方法[3]同样可行,但仍然会出现内存分配问题。 #include "Shlwapi.h" #include "shcore.h" #pragma comment(lib, "shlwapi.lib") void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; IStream* stream{ SHCreateMemStream(buf, size) }; // Copying takes a lot of time static const GUID guidIRandomAccessStream = { 0x905a0fe1, 0xbc53, 0x11df, { 0x8c, 0x49, 0x00, 0x1e, 0x4f, 0xc6, 0x86, 0xda } }; winrt::Windows::Storage::Streams::IRandomAccessStream pRas{ }; CreateRandomAccessStreamOverStream(stream, BSOS_OPTIONS::BSOS_DEFAULT, guidIRandomAccessStream, (void**)&pRas); bmp.SetSource(stream); img().Source(bmp); } 通过性能测试,发现CreateRandomAccessStreamOverStream的时间是一致的,但是SHCreateMemStream消耗的时间与图像大小成正比。可以得出,SHCreateMemStream中创建流的过程也涉及到内存的复制。 我对Windows编程中的Stream不是特别熟悉。创建流的过程一定会涉及到内存复制吗?从内存加载图像可以避免额外的开销吗?还有没有类似MemoryStreamView的结构来替代吗? 还有一个问题,我知道新的图像肯定需要内存存储。 BitmapImage设置Stream为Source会接管Stream占用的内存吗? Image控件设置BitmapImage作为Source会接管BitmapImage占用的内存吗? 如果是这样的话,我可以接受Stream分配新的内存,否则仍然是一个效率问题。 谢谢!!!!!!! 使用Stream已经彻底解决了这个问题。如前四期所述。 至于附加问题: ★1 使用 CreatStreamOnHGlobal 而不是 SHCreatMemStream。 因为SHCreatMemStream在调用过程中会对传入的内存块参数进行另一次内存复制。 CreatStreamOnHGlobal 创建流后不执行内存复制。您可以先通过GlobalAlloc分配内存,写入所需的图像数据,然后调用CreatStreamOnHGlobal,无需任何时间开销。另外,可以将CreatStreamOnHGlobal的第二个参数设置为true,自动释放GlobalAlloc分配的内存。 通过进程内存监控,我发现对于同一个程序,使用CreatStreamOnHGlobal的速度是SHCreatMemStream的两倍,并且不会导致内存泄漏。 ★2 创建的Stream需要调用Release方法减少一个引用。 IRandomAccessStream作为局部变量,会自动析构,无需主动释放。 并且BitmapImage还管理一部分引用,这些引用在离开作用域后被释放。 通过测试COM对象上Release方法的返回值,发现整个程序结束后引用计数又回到了0

回答 1 投票 0

将图像源转换为字符串

我有这个代码: if (MyImage.Source == "ms-appx:///Assets/myimage.png") { //做一点事 } 但我收到这个错误: 无法将类型“string”隐式转换为“Windows.UI.Xaml.Media.ImageSource...

回答 2 投票 0

来自 Powershell 的消息对话框

我在 Windows 8 下使用计划任务来触发一个简单的 .cmd 文件,其中包含一系列步骤,其中一些步骤会触发外部 Powershell 脚本。 我想使用 MessageDialog() fe...

回答 3 投票 0

如何将 Platform::String 转换为 char*?

如何转换 Platform::String 的内容以供需要基于 char* 的字符串的函数使用?我假设 WinRT 为此提供了辅助函数,但我就是找不到它们。 谢谢!

回答 6 投票 0

未检测到已安装的组件。元素已经是另一个元素的子元素

在 App.xaml 中,我添加了带有按钮的应用程序资源: 在 MainPage.xaml.cs 中,我尝试... 在 App.xaml 中,我添加了带有按钮的应用程序资源: <Application.Resources> <Button x:Key="MyButton"/> </Application.Resources> 在MainPage.xaml.cs中,我尝试以编程方式在我的网格中添加此按钮。 Button btn = (Button)Application.Current.Resources["MyButton"]; myGrid.Children.Add(btn); 但是它给出了这样的错误: No installed components were detected. Element is already the child of another element. 在 MainPage.xaml 中: <Grid x:Name="myGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> </Grid> 我不知道我做错了什么。 谢谢。 如果您使用在应用程序资源中定义的控件的多个实例,通常会引发此异常。如果是这种情况,你应该这样做: <Button x:Key="MyButton" x:Shared="false"/> 编辑:WInRT 似乎不支持 x:shared 属性。 有一个使用 ControlTemplates 的解决方法:http://www.gdomc.com/0428/binding-the-content-property-of-a-contentcontrol-in-winrt/ 您无法添加已经是另一个元素的子元素的元素。就像你的孩子不可能是另一个男人的孩子一样。 我对此很陌生,但我做了类似的事情并且犯了同样的错误。 这对我不起作用: btn = new Button { Text = $"{i}", HeightRequest = 50, WidthRequest = 50 }; flexLayout1.Children.Add(btn) 但这有效: flexLayout1.Children.Add(new Button { Text = $"{i}", HeightRequest = 50, WidthRequest = 50 });

回答 3 投票 0

如何在winui 3程序中使用系统的剪贴板

我有剪切、复制和粘贴按钮。我确实需要它们做与各自的键盘快捷键完全相同的事情。 有没有什么函数可以粘贴到事件句柄中...

回答 1 投票 0

如何使用带有 WinUI3 控件和异步代码的 C#/WinRT 组件,以及如何从使用 Windows 应用程序 SDK 的 C++/WinRT 应用程序使用它?

我正在尝试升级现有的 C# UWP UserControl,我必须由 WinUI3 C++ 和 WinUI3 C# 使用。 太棒了,我正在使用共享代码项目为 UWP 和 WinUI3 编译它,一切都很棒

回答 1 投票 0

在键盘事件中使用 CancellationToken 调用 Task.Delay 时出现 TaskCanceledException

我试图延迟处理从 WinRT 中的键盘事件调用的方法(示例中的 SubmitQuery()),直到一段时间内(本例中为 500 毫秒)没有进一步的事件。 我

回答 6 投票 0

WebView2 运行时中未读取 WinRT 组件

我正在开发一个用于游戏发布的 WebView2 容器应用程序,但有一些问题阻碍了开发过程。然而,该组件没有被正确读取,所以它

回答 1 投票 0

获取 StorageFile 指定字节范围的 IRandomAccessStream

我正在尝试在 UWP 应用程序中使用 C++/WinRT 获取 StorageFile 中指定字节范围的 IRandomAccessStream。这是为了使用 WebView2 响应部分 GET 请求:

回答 1 投票 0

UWP 和最新版本的 .Net(6、8)

Microsoft 技术之一是 UWP - 通用 Windows 平台。看起来它仍在维护中,但它不是基于最新版本的.Net。有人知道为什么吗?有什么问题

回答 1 投票 0

切换到其他线程时源不可用

我正在 Visual Studio 2022 中使用 winapi、winrt 和 wil 编写 C++。 我正在使用 Winapi 多线程工具,特别是::CreateThread。 当我调试或构建程序时,一切都很好。 什...

回答 1 投票 0

无需安装即可启动uwp应用程序

有没有办法在不安装的情况下启动通用Windows平台(UWP)应用程序? 我想从解压的 appx 文件夹启动 uwp 应用程序,但不知道如何启动。 据我所知,只有一种方法...

回答 1 投票 0

RichEditBox (UWP) 在设置 Rtf 文本时忽略字体和前景

我正在使用 RichEditBox,但在保存和恢复 Rtf 文本时遇到一些问题。 这是我导出的 Rtf 文本示例,您可以看到有不同的前景色和...

回答 2 投票 0

如何清除WinRT中的TimeZoneInfo缓存?

在.NET中,TimeZoneInfo使用的一些值会被缓存,例如TimeZoneInfo.Local、DateTime.ToLocalTime等当前使用的时区。在传统的.NET框架应用程序中,此缓存可以被清除...

回答 1 投票 0

如何在 UWP 中获取已连接的蓝牙设备的 RSSI?

我想获取已由我的程序连接的BluetoothLEDevice 的RSSI 值。因此,BluetoothLEAdvertisementWatcher 不起作用,因为设备在连接后不再进行广告...

回答 2 投票 0

从 C 使用 WinRT?

观看 //BUILD 内容,我看到 WinRT API 可以由 C 代码使用: 我对 Win32 开发人员可以使用新的 C API 感到非常兴奋。 在哪里可以找到有关 C WinRT 的信息...

回答 2 投票 0

RPC_E_CANTCALLOUT_ININPUTSYNCCALL 和 FileOpenPicker::PickSingleFileAsync

我有以下情况:FileOpenPicker::PickSingleFileAsync 触发 Window.Activated 事件,该事件有一个调用 LowLagMediaRecording::StartAsync 或 LowLagMediaRecording::FinishA...

回答 1 投票 0

将 System.Drawing.Bitmap 保存到 WinRT 存储文件

我遇到一个奇怪的问题,在测试我的应用程序时,我可以使用 WinRT API 将 System.Drawing.Bitmap 保存到 StorageFile,但是当安装应用程序时,它不起作用。 这是

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.