为了账号安全,请及时绑定邮箱和手机立即绑定

从 user32.dll EnumDisplayDevices 取回坏字符串

从 user32.dll EnumDisplayDevices 取回坏字符串

C#
烙印99 2022-12-24 10:23:22
我正在尝试从 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        );}此代码返回设备名称屜尮䥄偓䅌㉙任何人都可以解释为什么以及如何从中获取正常名称吗?
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

“中文字符”通常意味着您试图将 ASCII 字符串解释为 Unicode (UTF-16)。

尝试在您的声明中添加一个CharSet属性。EnumDisplayDevices


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号