Возвращение плохих строк из user32.dll EnumDisplayDevices - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь получить имена моих мониторов от 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 Ответ

3 голосов
/ 21 апреля 2019

"китайские иероглифы" обычно означают, что вы пытались интерпретировать строку ASCII как Unicode (UTF-16).

Попробуйте добавить свойство CharSet к объявлению EnumDisplayDevices.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...