Конференция "WinAPI" » Как получить глубину цвета вторичных мониторов?
 
  • Дмитрий Белькевич (18.05.10 14:20) [0]
    Код, как я понял, возвращает глубину цвета первичного (primary) монитора:


    DC := GetDC(0);
    Result := GetDeviceCaps(DC, BITSPIXEL) * GetDeviceCaps(DC, PLANES);



    как добраться до вторичных мониторов?
  • Плохиш © (18.05.10 19:39) [1]
    Screen.Monitors не подойдёт?
  • Дмитрий Белькевич (18.05.10 22:31) [2]

    > Screen.Monitors не подойдёт?


    Если бы он еще глубину цвета возвращал...
  • Плохиш © (18.05.10 22:37) [3]

    > Дмитрий Белькевич   (18.05.10 22:31) [2]

    Оно handle возвращает.
  • Плохиш © (18.05.10 22:37) [4]
    Die Eigenschaft Handle gibt das Fenster-Handle des Bildschirms an.

    Delphi-Syntax:

    property Handle: HMONITOR;

    C++ Syntax:

    __property HMONITOR Handle = {read=FHandle, nodefault};

    Beschreibung

    Mit Handle können Sie ein Fenster-Handle für den Bildschirm abrufen. Dieses Handle kann anschließend in Aufrufen der Windows-API (z.B. GetMonitorInfo) verwendet werden.
  • Игорь Шевченко © (18.05.10 23:24) [5]

    > как добраться до вторичных мониторов?


    EnumDisplayMonitors
  • Игорь Шевченко © (18.05.10 23:24) [6]
    оно передает callback-функции HDC монитора
  • Дмитрий Белькевич (19.05.10 02:22) [7]
    пробую так:


    function GetBPP(Monitor: TMonitor): cardinal;
    const
     ENUM_CURRENT_SETTINGS = cardinal(-1);
    var
     MonitorInfo: TMonitorInfoEx;
     DeviceMode:  TDeviceMode;
    begin
     ZeroMemory(@MonitorInfo, SizeOf(TMonitorInfoEx));
     MonitorInfo.cbSize := SizeOf(TMonitorInfoEx);
     if not GetMonitorInfo(Monitor.Handle, @MonitorInfo) then
      ShowMessage(SysErrorMessage(GetLastError));
     if not EnumDisplaySettings(MonitorInfo.szDevice, ENUM_CURRENT_SETTINGS, DeviceMode) then
      ShowMessage(SysErrorMessage(GetLastError));
     Result := DeviceMode.dmBitsPerPel;
    end;



    пишет 'Параметр задан неверно' на GetMonitorInfo.

    Делфи - 2010, если что.
  • Германн © (19.05.10 03:09) [8]

    > пишет 'Параметр задан неверно' на GetMonitorInfo.
    >

    А подумать?
  • Дмитрий Белькевич (19.05.10 09:59) [9]
    Ну я думаю, что размер не совпадает, какой тут еще параметр может быть задан?

    Из хэлпа:

    You must set the cbSize member of the structure to sizeof(MONITORINFO) or sizeof(MONITORINFOEX) before calling the GetMonitorInfo function. Doing so lets the function determine the type of structure you are passing to it.

    Вроде всё верно передаю... И больше ничего не нужно.
  • Плохиш © (19.05.10 11:25) [10]
    BDS2006 полёт нормальный.

    Проверь может в bds2010 заменили ссылку GetMonitorInfo с GetMonitorInfoA на GetMonitorInfoW, а TMonitorInfoEx оставили старую TMonitorInfoExA.
  • Leonid Troyanovsky © (19.05.10 12:50) [11]

    > Дмитрий Белькевич   (19.05.10 09:59) [9]

    > Ну я думаю, что размер не совпадает, какой тут еще параметр
    > может быть задан?

    Проверь, д.б.:

    type
    tagMONITORINFOEXW = record
       cbSize: DWORD;
       rcMonitor: TRect;
       rcWork: TRect;
       dwFlags: DWORD;
       szDevice: array[0..CCHDEVICENAME - 1] of WideChar;
     end;


    Раньше у этих двоечников было array[0..CCHDEVICENAME],
    может к тому и вернулись.

    --
    Regards, LVT.
  • Дмитрий Белькевич (19.05.10 14:33) [12]
    Нашел:


           @GetMonitorInfo := InitAnApi(mmGetMonitorInfo, @GetMonitorInfo, 'GetMonitorInfoA');



    Таки [10], нужно GetMonitorInfoW вызывать. Всем спасибо.
  • lostbananan © (29.12.12 08:55) [13]
    Код такой:
    procedure TForm1.Button1Click(Sender: TObject);

     function CreateFullscreenWindow(const AWnd: HWND): HWND;
     var
       hmon: HMONITOR;
       mi: TMonitorInfo;
     begin
       hmon := MonitorFromWindow(AWnd, MONITOR_DEFAULTTONEAREST);
       FillChar(mi, SizeOf(mi), 0);
       mi.cbSize := SizeOf(mi);
       if not GetMonitorInfo(hmon, @mi) then
         Exit(0);
       Result := CreateWindow('static', 'Òóò ìîæåò ïðîèñõîäèòü ÷òî-òî èíòåðåñíîå', WS_POPUP or WS_VISIBLE, mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, AWnd, 0, HInstance, nil);
     end;
    begin
     CreateFullscreenWindow(Handle);
    end;
    выдает ошибки:
     [Error] main.pas(31): Undeclared identifier: 'HMONITOR'
     [Error] main.pas(32): Undeclared identifier: 'TMonitorInfo'
     [Error] main.pas(34): Undeclared identifier: 'MonitorFromWindow'
     [Error] main.pas(34): Undeclared identifier: 'MONITOR_DEFAULTTONEAREST'
     [Error] main.pas(36): Missing operator or semicolon
     [Error] main.pas(37): Undeclared identifier: 'GetMonitorInfo'
     [Error] main.pas(38): Missing operator or semicolon
     [Error] main.pas(39): Not enough actual parameters
     [Error] main.pas(39): Statement expected, but expression of type 'Integer' found
     [Fatal Error] lohotron.dpr(5): Could not compile used unit 'main.pas'
    Что не так?
  • Anatoly Podgoretsky © (29.12.12 15:31) [14]
    А где твой uses?
  • lostbananan © (30.12.12 08:28) [15]
    Спасибо , но выдает:
    [Error] main.pas(38): Missing operator or semicolon
    на if not GetMonitorInfo(hmon, @mi) then
    Exit(0);
 
Конференция "WinAPI" » Как получить глубину цвета вторичных мониторов?
Есть новые Нет новых   [134430   +2][b:0][p:0.001]