Вопрос, поднятый пользователем, связан с необходимостью преобразования свойства Handle объекта TMonitor в строку, которая может быть использована в функции EnumDisplaySettings в параметре lpszDeviceName. Это необходимо для получения списка настроек устройства по заданному идентификатору монитора.
Описание проблемы
В Delphi 7.0 пользователю требуется преобразовать HMONITOR, полученный из массива Monitors компонента TScreen, в строку, которая используется в функции EnumDisplaySettings. Это необходимо для достижения конечной цели - получения списка настроек устройства по значению HMONITOR, передавая разрешенное lpszDeviceName в вызовы EnumDisplaySettings.
Подробная информация
Свойство Handle объекта TMonitor имеет тип HMONITOR и обычно используется в функции GetMonitorInfo, которая возвращает информацию о геометрии, но не lpszDeviceName. Структура TMonitorInfoEx содержит поле szDevice, но на системе пользователя оно не заполняется.
Альтернативный ответ
Пользователь также рассматривает возможность использования szDeviceName для получения соответствующего HMONITOR. Для этого он предлагает функцию GetMonitorDeviceName, которая сравнивает HMONITOR с полученными значениями.
Обновление
Благодаря помощи Давида Хэффернана, пользователь тестировал его решение и предоставил пример функции GetMonitorName, которая получает имя монитора по заданному HMONITOR.
Подтвержденный ответ
Пользователь, вероятно, неправильно вызывал функцию GetMonitorInfo. Пример кода, предоставленный Давидом, работает на его машине и выводит строки устройств.
Однако, пользователь столкнулся с ошибкой "неверный параметр", что обычно указывает на неверное значение cbSize. Важно проверить значение cbSize под отладчиком и убедиться, что используется правильная версия TMonitorInfoEx.
Решение проблемы
После дополнительных проверок выяснилось, что пользователь использует Delphi 7, и размер TMonitorInfoEx под отладчиком составляет 76 байт, в то время как ожидается значение 72. Это указывает на то, что пользователь использует более старую версию Delphi в ANSI-режиме.
Исправленная версия структуры TMonitorInfoEx
Для решения проблемы необходимо использовать правильно определенную структуру TMonitorInfoEx. Вот исправленный вариант:
type
TMonitorInfoEx = record
cbSize: DWORD;
rcMonitor: TRect;
rcWork: TRect;
dwFlags: DWORD;
szDevice: array[0..CCHDEVICENAME - 1] of AnsiChar;
end;
Эту структуру следует добавить в начало кода перед объявлением переменных.
Пример использования GetMonitorInfo
{$APPTYPE CONSOLE}
uses
SysUtils, MultiMon, Windows, Forms;
type
TMonitorInfoEx = record
cbSize: DWORD;
rcMonitor: TRect;
rcWork: TRect;
dwFlags: DWORD;
szDevice: array[0..CCHDEVICENAME - 1] of AnsiChar;
end;
var
i: Integer;
MonitorInfo: TMonitorInfoEx;
begin
MonitorInfo.cbSize := SizeOf(MonitorInfo);
for i := 0 to Screen.MonitorCount-1 do
begin
if not GetMonitorInfo(Screen.Monitors[i].Handle, @MonitorInfo) then
RaiseLastOSError;
Writeln(MonitorInfo.szDevice);
end;
Readln;
end.
После внесения изменений в структуру TMonitorInfoEx и проверки корректности значения cbSize, функция GetMonitorInfo должна работать корректно и возвращать строки устройств.
Пользователю необходимо преобразовать дескриптор устройства (HMONITOR), полученный из компонента TMonitor в Delphi 7.0, в строку для использования в функции EnumDisplaySettings, чтобы получить настройки дисплея для конкретного монитора.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.