You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:42:37