c# - 从 user32.dll EnumDisplayDevices 取回坏字符串

标签 c# windows winapi

我正在尝试从 user32 获取我的监视器的名称。到目前为止,我所得到的都是汉字。我不确定为什么,我们将不胜感激。

    public static SafeNativeMethods.DISPLAY_DEVICE GetDevices()
    {
        SafeNativeMethods.DISPLAY_DEVICE d = new SafeNativeMethods.DISPLAY_DEVICE();
        d.Initialize();
        if (SafeNativeMethods.EnumDisplayDevices(null, 1, ref d, 0))
            return d;
        else
            throw new InvalidOperationException(GetLastError());
    }

public static class SafeNativeMethods
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct DISPLAY_DEVICE
    {
        [MarshalAs(UnmanagedType.U4)]
        public int cb;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string DeviceName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceString;
        [MarshalAs(UnmanagedType.U4)]
        public int StateFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceID;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceKey;
        public void Initialize()
        {
            this.DeviceName = new string(new char[32]);
            this.DeviceString = new string(new char[128]);
            this.DeviceID = new string(new char[128]);
            this.DeviceKey = new string(new char[128]);
            this.cb = (ushort)Marshal.SizeOf(this);
        }
    }



        [DllImport("User32.dll", SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
        public static extern Boolean EnumDisplayDevices(
            [param: MarshalAs(UnmanagedType.LPTStr)]
            String lpDevice,
            [param: MarshalAs(UnmanagedType.U4)]
            Int32 iDevNum,
            [In, Out]
            ref DISPLAY_DEVICE lpDisplayDevice,
            [param: MarshalAs(UnmanagedType.U4)]
            Int32 iHaveNoIdea
        );
}

此代码返回设备名称䱉䰮䥄䁓䅌㉙ 任何人都可以解释为什么以及如何从中获得正常名称吗?

最佳答案

“汉字”usually means you tried to interpret a ASCII string as Unicode (UTF-16)。

尝试将 CharSet 属性添加到您的 EnumDisplayDevices 声明中。

关于c# - 从 user32.dll EnumDisplayDevices 取回坏字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55779016/

相关文章:

windows - TortoiseSVN 删除实际存在的文件的状态

c# - .Net 中的多显示器任务栏

c++ - 从隐藏变为可见时,如何阻止窗口短暂地重新出现在其最后可见的位置?

c++ - 如何在 win32 或 MFC 中按名称获取字符串资源?

c# - 将 Linq 结果直接序列化为 JSON

linux - Linux系统上的恢复(初始系统: Windows) (files deleted on: Windows) (Current System: Linux)

c# - 从另一种方法或异步访问文本框

c++ - Windows 老式面向对象的类引用

c# - 从哈希表中获取随机键值

c# - 增加c#中字符串的大小