如何使用CsWin32创建PWSTR实例以调用GetWindowText函数?
使用CsWin32调用GetWindowText时处理PWSTR参数的方法
刚上手CsWin32,要调用GetWindowText函数,已经完成映射,知道第一个窗口句柄和最后一个缓冲区长度参数的用法,但搞不清中间的PWSTR lpString怎么实例化。给出的PWSTR部分源码如下:
internal unsafe readonly partial struct PWSTR : IEquatable<PWSTR> { // ... internal PWSTR(char* value) => this.Value = value; // ... }
想实例化但不知道在C#里怎么生成char*类型的参数?这里给你几种可行的方案:
方案一:栈分配char缓冲区(需unsafe环境)
直接在栈上分配一块固定大小的char数组,拿到它的指针来创建PWSTR,适合小容量的缓冲区:
unsafe { // 分配能容纳256个字符的缓冲区,可根据需求调整大小 char* buffer = stackalloc char[256]; PWSTR lpString = new PWSTR(buffer); // 调用GetWindowText,最后一个参数传缓冲区容量 int textLength = GetWindowText(hwnd, lpString, 256); // 从缓冲区提取字符串 string windowTitle = new string(buffer, 0, textLength); }
方案二:固定托管char数组(需unsafe环境)
如果需要更大的缓冲区,可以用托管char数组,通过fixed关键字固定内存拿到指针:
// 初始化托管char数组 char[] buffer = new char[512]; unsafe { // 固定数组内存,防止GC移动 fixed (char* ptr = buffer) { PWSTR lpString = new PWSTR(ptr); int textLength = GetWindowText(hwnd, lpString, buffer.Length); string windowTitle = new string(buffer, 0, textLength); } }
方案三:用StringBuilder(无需unsafe,推荐)
CsWin32为很多Win32函数提供了更友好的重载,GetWindowText支持直接传入StringBuilder,无需手动处理指针和unsafe代码:
// 初始化StringBuilder,设置足够的容量 StringBuilder sb = new StringBuilder(256); // 直接调用重载方法,自动处理内存映射 GetWindowText(hwnd, sb, sb.Capacity); string windowTitle = sb.ToString();
补充说明
PWSTR本质是指向UTF-16宽字符的指针,所以只要能提供一块可写入的char类型内存的指针,就能实例化它。但优先推荐用StringBuilder的方案,更符合C#的内存管理习惯,也避免了unsafe代码的复杂性。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

