Как я могу заставить обнаружение дисплея в Windows? - PullRequest
11 голосов
/ 05 октября 2010

Я часто загружаю свой компьютер с Windows 7 с подключенным KVM-переключателем, ориентированным на другой компьютер. Когда я переключаюсь на загруженный ПК, разрешение экрана не соответствует действительности (и второй подключенный монитор не обнаруживается).

Я могу исправить это, щелкнув правой кнопкой мыши на рабочем столе, выбрав Screen Resolution и нажав Detect. Это позволяет Windows обнаруживать подключенные дисплеи и настраивать наиболее оптимальное разрешение.

Я хотел бы написать небольшую утилиту, чтобы сделать это автоматически. Какой вызов Win32 API или объект C # мне следует использовать?

Ответы [ 4 ]

1 голос
/ 30 декабря 2010

Почему бы просто не использовать Do It Again и написать макрос, который сбрасывает разрешение для вас, записывая действия мыши и клавиатуры?

1 голос
/ 06 октября 2010

Это поможет вам на полпути:

Выполнить: control.exe desk.cpl, Настройки, @ Настройки

Это откроет панель разрешения экрана напрямую.

Я мог бы также предложить такой инструмент для создания сценариев, как http://en.wikipedia.org/wiki/Windows_Script_Host И написать утилиту, которая откроет панель и нажмет кнопку.

За исключением того, что возможно, что панель управления напрямую вызываетWindows .dll, которую вы можете загружать и вызывать в коде напрямую, но это потребует некоторой проверки для обнаружения.(вы можете начать с запуска .cpl в отладчике и посмотреть, что произойдет, когда вы нажмете кнопку обнаружения).

1 голос
/ 08 октября 2010

Вы можете попробовать:

  1. Вы можете использовать Spy ++ для поиска открытых окон и просмотра их свойств и сообщений.
  2. Использовать процесс для запуска "rundll32.exe shell32.dll, Control_RunDLL desk.cpl "или поэкспериментируйте с непосредственным вызовом, чтобы увидеть, можете ли вы получить дескриптор окна, проверьте приведенные ниже ссылки на идеи.
  3. Используйте код " нажмите кнопку отправки, чтобывнешнее приложение " и измените его для поиска окна с заголовком" Разрешение экрана "и отправьте BN_CLICK в дочернее окно с заголовком" Обнаружить ".
  4. Поскольку компьютер уже включен, вы можете захотетьвключите его автоматически при входе в систему, для этого используйте планировщик задач.
0 голосов
/ 05 октября 2010

Не уверен, что это будет работать для вас, но вы можете попробовать что-то вроде этого. По крайней мере, вы можете начать.

[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 714)]
public struct DISPLAY_DEVICE
{
    [FieldOffset(0)]
    public int cb;
    [FieldOffset(4)]
    public char DeviceName;
    [FieldOffset(68)]
    public char DeviceString;
    [FieldOffset(324)]
    public int StateFlags;
    [FieldOffset(328)]
    public char DeviceID;
    [FieldOffset(584)]
    public char DeviceKey;
}

[DllImport("User32.dll", SetLastError = true)]
static extern Boolean EnumDisplayDevices(
        string lpDevice,
        uint iDevNum,
        ref DISPLAY_DEVICE lpDisplayDevice,
        uint dwFlags
);

public void DetectDevices()
{
    var flag = true;
    for (uint i = 0; flag && i < 100; i++)
    {
        var device = new DISPLAY_DEVICE();
        device.cb = Marshal.SizeOf(device);
        flag = EnumDisplayDevices(null, i, ref device, 1);
    }
}
...