Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить название монитора? 
:(
    Опции темы
Kinjalka
Дата 6.8.2011, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Здравствуйте.

Пытаюсь получить нормальное название монитора(типа SyncMaster..., а не .\\DEVICE 1), делаю так:
Код

type
  _DisplayDeviceEx = packed record
    cb: DWord;
    DeviceName: array[0..31] of AnsiChar;
    DeviceString: array[0..127] of AnsiChar;
    StateFlags: DWord;
    DeviceID: array[0..127] of AnsiChar;
    DeviceKey: array[0..127] of AnsiChar;
  end;

  PDisplayDeviceEx = ^TDisplayDeviceEx;
  TDisplayDeviceEx = _DisplayDeviceEx;
end;

implementation

uses Windows;

function myEnumDisplayDevices(lpDevice: PAnsiChar; iDevNum: DWord;
                              var lpDisplayDevice: TDisplayDeviceEx; dwFlags: DWord): BOOL; stdcall; external user32 name 'EnumDisplayDevicesA';

function Test;
var
  Info: TDisplayDevice;
  InfoEx: TDisplayDeviceEx;
  I: Integer;
begin
    for i := 0 to Screen.MonitorCount-1 do
    begin
      Info.cb := SizeOf(Info);
      if EnumDisplayDevices(Nil, i, Info, 0) then
      begin
        Log('devname: ' + Info.DeviceName);
        InfoEx.cb := SizeOf(INfoEx);
        if myEnumDisplayDevices(Info.DeviceName, 0, InfoEx, 0) then
        begin
          log('nfo: ' + infoEx.DeviceName);
          log('nfo2: ' + infoex.DeviceString);
          log('nfo3: ' + infoex.DeviceID);
          log('nfo4: ' + infoex.DeviceKey);
          //cbDefaultDisp.Items.Add(IntToStr(i+1) + ': ' + Info.DeviceName + ' / ' + Info.DeviceString)
        end;
      end
      else
      begin
        break;
      end;
    end;
end;


Выводит:
[21:22:25.766] devname: \\.\DISPLAY1
[21:22:25.766] nfo: \\.\DISPLAY1\Monitor0
[21:22:25.766] nfo2: Универсальный монитор PnP
[21:22:25.766] nfo3: MONITOR\SAM0594\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002
[21:22:25.766] nfo4: \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002
[21:22:25.766] devname: \\.\DISPLAY2

Плюс почему-то для Display2 ничего не выводит.

Вопрос: как можно получить нормальное название монитора? 
Например как тут: http://s2.ipicture.ru/Gallery/Viewfull/5282333.html

Это сообщение отредактировал(а) Kinjalka - 6.8.2011, 20:28
PM MAIL WWW ICQ Skype   Вверх
CodeMonkey
Дата 7.8.2011, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Я бы для начала посмотрел WMI, а затем (если не помогло) - Setup API:

Цитата
dwFlags 
Set this flag to EDD_GET_DEVICE_INTERFACE_NAME (0x00000001) to retrieve the device interface name for GUID_DEVINTERFACE_MONITOR, which is registered by the operating system on a per monitor basis. The value is placed in the DeviceID member of the DISPLAY_DEVICE structure returned in lpDisplayDevice. The resulting device interface name can be used with SetupAPI functions and serves as a link between GDI monitor devices and SetupAPI monitor devices.


Цитата(Kinjalka @  6.8.2011,  21:25 Найти цитируемый пост)
Плюс почему-то для Display2 ничего не выводит.


Где проверка на ошибки?

P.S. Насчёт WMI - попробуйте:

Код
//-----------------------------------------------------------------------------------------------------
//     This code was generated by the Wmi Delphi Code Creator http://theroadtodelphi.wordpress.com
//     Version: 1.1.2.141 
//
//
//
//     LIABILITY DISCLAIMER
//     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
//     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
//     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
//
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
  
// Capabilities and management of the desktop monitor (CRT) logical device.

procedure  GetCIM_DesktopMonitorInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM CIM_DesktopMonitor','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Availability                   %s',[FWbemObject.Availability]));// Uint16
    Writeln(Format('Bandwidth                      %s',[FWbemObject.Bandwidth]));// Uint32
    Writeln(Format('Caption                        %s',[FWbemObject.Caption]));// String
    Writeln(Format('ConfigManagerErrorCode         %s',[FWbemObject.ConfigManagerErrorCode]));// Uint32
    Writeln(Format('ConfigManagerUserConfig        %s',[FWbemObject.ConfigManagerUserConfig]));// Boolean
    Writeln(Format('CreationClassName              %s',[FWbemObject.CreationClassName]));// String
    Writeln(Format('Description                    %s',[FWbemObject.Description]));// String
    Writeln(Format('DeviceID                       %s',[FWbemObject.DeviceID]));// String
    Writeln(Format('DisplayType                    %s',[FWbemObject.DisplayType]));// Uint16
    Writeln(Format('ErrorCleared                   %s',[FWbemObject.ErrorCleared]));// Boolean
    Writeln(Format('ErrorDescription               %s',[FWbemObject.ErrorDescription]));// String
    Writeln(Format('InstallDate                    %s',[FWbemObject.InstallDate]));// Datetime
    Writeln(Format('IsLocked                       %s',[FWbemObject.IsLocked]));// Boolean
    Writeln(Format('LastErrorCode                  %s',[FWbemObject.LastErrorCode]));// Uint32
    Writeln(Format('Name                           %s',[FWbemObject.Name]));// String
    Writeln(Format('PNPDeviceID                    %s',[FWbemObject.PNPDeviceID]));// String
    Writeln(Format('PowerManagementCapabilities    %s',[FWbemObject.PowerManagementCapabilities]));// Uint16
    Writeln(Format('PowerManagementSupported       %s',[FWbemObject.PowerManagementSupported]));// Boolean
    Writeln(Format('ScreenHeight                   %s',[FWbemObject.ScreenHeight]));// Uint32
    Writeln(Format('ScreenWidth                    %s',[FWbemObject.ScreenWidth]));// Uint32
    Writeln(Format('Status                         %s',[FWbemObject.Status]));// String
    Writeln(Format('StatusInfo                     %s',[FWbemObject.StatusInfo]));// Uint16
    Writeln(Format('SystemCreationClassName        %s',[FWbemObject.SystemCreationClassName]));// String
    Writeln(Format('SystemName                     %s',[FWbemObject.SystemName]));// String
        
    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetCIM_DesktopMonitorInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.


Это сообщение отредактировал(а) CodeMonkey - 7.8.2011, 14:45


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.