Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


nik1967, список имён видеокарт через winapi-функцию EnumDisplayDevices() :

читать дальше »
Код: Выделить весь код
#define A = (Defined UNICODE) ? "W" : "A"


const
    DISPLAY_DEVICE_MODESPRUNED = $8000000;


type
    _DISPLAY_DEVICE = record
        cb: DWORD;
        #ifdef UNICODE
            DeviceName: array[0..31] of AnsiChar;
            DeviceString: array[0..127] of AnsiChar;
        #else
            DeviceName: array[0..31] of Char;
            DeviceString: array[0..127] of Char;
        #endif
        StateFlags: DWORD;
    end;
    
    Pointer = Integer;
  
  
function EnumDisplayDevices(Unused: Pointer; iDevNum: DWORD; var lpDisplayDevice: _DISPLAY_DEVICE; dwFlags: DWORD): BOOL; external 'EnumDisplayDevices{#A}@user32.dll stdcall';


procedure Inc(var Int: Integer);
begin
    Int := Int + 1;
end;


function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;


function InArray(const uArray: array of String; const SearchStr: String): Boolean;
var
    i, Len: Integer;
begin
    Len := GetArrayLength(uArray);
    if Len = 0 then Exit;
    for i := 0 to Len-1 do
    begin
        Result := uArray[i] = SearchStr;
        if Result then Break;
    end;
end;


function GetVideoDevices(): array of String;  
var
    dd: _DISPLAY_DEVICE;
    iDevNum: Integer;
    Len: Integer;
    Buff: String;
begin
    dd.cb := SizeOf(dd);
    while EnumDisplayDevices(0, iDevNum, dd, 0) do
    begin
        if dd.StateFlags = DISPLAY_DEVICE_MODESPRUNED then
        begin
            Buff := CharArrayToString(dd.DeviceString);
            if not InArray(Result, Buff) then
            begin
                Len := GetArrayLength(Result);
                SetArrayLength(Result, Len+1);
                Result[Len] := Buff;
            end;
        end;
        Inc(iDevNum);
    end;
end;


procedure InitializeWizard();
var
    sArray: array of String;
    i: Integer;
begin
    sArray := GetVideoDevices();
    for i := 0 to GetArrayLength(sArray)-1 do MsgBox(sArray[i], mbInformation, MB_OK);
end;


PS: с флагами запутался. http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Почему то имя одной и той же видеокарты возвращает 2 раза. Решаю этот вопрос проверкой на отсутствие имени в выходном массиве строк
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:43, 18-07-2013 | #800