Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как узнать наличие устройств


Автор: c00per 12.1.2009, 23:34

Я знаю вопрос легкий, но я все перерыл и немогу найти:

Необходимо узнать в Delphi 7 подключена ли мышь, клава и монитор к компу?

ЗЫ: если сто сорри за оффтоп
ЗЫЫ: можно и на асме

Автор: hkdkest 13.1.2009, 12:25
http://codingrus.ru/readarticle.php?article_id=652

Автор: c00per 13.1.2009, 18:52
hkdkest

Эта фишка  не проканывает... Здесь на момент загрузки комп определяет наличие устройств и записывает их в реестр, а эти API функции берут данные из него

Автор: RinOSpro 2.2.2009, 15:32
Можно через SetupAPI.

Код

const
  SetupApiModuleName = 'SetupApi.dll';

  DIGCF_DEFAULT         = $00000001; // only valid with DIGCF_DEVICEINTERFACE
  DIGCF_PRESENT         = $00000002;
  DIGCF_ALLCLASSES      = $00000004;
  DIGCF_PROFILE         = $00000008;
  DIGCF_DEVICEINTERFACE = $00000010;

  SPDRP_DEVICEDESC                  = $00000000; // DeviceDesc (R/W)
  SPDRP_HARDWAREID                  = $00000001; // HardwareID (R/W)
  SPDRP_COMPATIBLEIDS               = $00000002; // CompatibleIDs (R/W)
  SPDRP_UNUSED0                     = $00000003; // unused
  SPDRP_SERVICE                     = $00000004; // Service (R/W)
  SPDRP_UNUSED1                     = $00000005; // unused
  SPDRP_UNUSED2                     = $00000006; // unused
  SPDRP_CLASS                       = $00000007; // Class (R--tied to ClassGUID)
  SPDRP_CLASSGUID                   = $00000008; // ClassGUID (R/W)
  SPDRP_DRIVER                      = $00000009; // Driver (R/W)
  SPDRP_CONFIGFLAGS                 = $0000000A; // ConfigFlags (R/W)
  SPDRP_MFG                         = $0000000B; // Mfg (R/W)
  SPDRP_FRIENDLYNAME                = $0000000C; // FriendlyName (R/W)
  SPDRP_LOCATION_INFORMATION        = $0000000D; // LocationInformation (R/W)
  SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = $0000000E; // PhysicalDeviceObjectName (R)
  SPDRP_CAPABILITIES                = $0000000F; // Capabilities (R)
  SPDRP_UI_NUMBER                   = $00000010; // UiNumber (R)
  SPDRP_UPPERFILTERS                = $00000011; // UpperFilters (R/W)
  SPDRP_LOWERFILTERS                = $00000012; // LowerFilters (R/W)
  SPDRP_BUSTYPEGUID                 = $00000013; // BusTypeGUID (R)
  SPDRP_LEGACYBUSTYPE               = $00000014; // LegacyBusType (R)
  SPDRP_BUSNUMBER                   = $00000015; // BusNumber (R)
  SPDRP_ENUMERATOR_NAME             = $00000016; // Enumerator Name (R)
  SPDRP_SECURITY                    = $00000017; // Security (R/W, binary form)
  SPDRP_SECURITY_SDS                = $00000018; // Security (W, SDS form)
  SPDRP_DEVTYPE                     = $00000019; // Device Type (R/W)
  SPDRP_EXCLUSIVE                   = $0000001A; // Device is exclusive-access (R/W)
  SPDRP_CHARACTERISTICS             = $0000001B; // Device Characteristics (R/W)
  SPDRP_ADDRESS                     = $0000001C; // Device Address (R)
  SPDRP_UI_NUMBER_DESC_FORMAT       = $0000001E; // UiNumberDescFormat (R/W)
  SPDRP_MAXIMUM_PROPERTY            = $0000001F; // Upper bound on ordinals

type
  HDEVINFO = Pointer;
  SP_DEVINFO_DATA = packed record
    cbSize: DWORD;
    ClassGuid: TGUID;
    DevInst: DWORD; // DEVINST handle
    Reserved: WORD;
  end;


function SetupDiClassGuidsFromNameEx(const ClassName: PAnsiChar; ClassGuidList: PGUID;
  ClassGuidListSize: DWORD; var RequiredSize: DWORD; const MachineName: PAnsiChar;
  Reserved: Pointer): LongBool; stdcall;

function SetupDiGetClassDevs(ClassGuid: PGUID; const Enumerator: PChar;
  hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall;

function SetupDiEnumDeviceInfo(DeviceInfoSet: HDEVINFO;
  MemberIndex: DWORD; var DeviceInfoData: SP_DEVINFO_DATA): LongBool; stdcall;

function SetupDiGetDeviceRegistryProperty(DeviceInfoSet: HDEVINFO;
  var DeviceInfoData: SP_DEVINFO_DATA; Property_: DWORD;
  PropertyRegDataType: PDWORD; PropertyBuffer: PBYTE; PropertyBufferSize: DWORD;
  RequiredSize: PDWORD): LongBool; stdcall;

function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): LongBool; stdcall;

implementation

function SetupDiClassGuidsFromNameEx; external SetupApiModuleName name 'SetupDiClassGuidsFromNameExA';
function SetupDiGetClassDevs; external SetupApiModuleName name 'SetupDiGetClassDevsA';
function SetupDiEnumDeviceInfo; external SetupApiModuleName name 'SetupDiEnumDeviceInfo';
function SetupDiGetDeviceRegistryProperty; external SetupApiModuleName name 'SetupDiGetDeviceRegistryPropertyA';
function SetupDiDestroyDeviceInfoList; external SetupApiModuleName name 'SetupDiDestroyDeviceInfoList';

function FindDeviceByName(ADevName: string; APropertyFlags,
  AFlags: Cardinal; AStringList: TStrings): Boolean;
var
  DevInfoData: SP_DEVINFO_DATA;
  hDevInfo1:  Pointer;
  I, DataT, Buffersize: DWORD;
  Buffer: PAnsiChar;
  LGUID: TGUID;
begin
  Result := False;

  SetupDiClassGuidsFromNameEx(PChar(ADevName), @LGUID, 1, Buffersize, '', nil);

  hDevInfo1 := SetupDiGetClassDevs(@LGUID, nil, HWND(nil), AFlags);

  try
    DevInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);
    I := 0;
    Buffersize := 500;
    GetMem(Buffer, Buffersize);
    try
      while SetupDiEnumDeviceInfo(hDevInfo1, I, DevInfoData) do
      begin
        SetupDiGetDeviceRegistryProperty(hDevInfo1, DevInfoData,
          APropertyFlags, @DataT, PByte(Buffer), Buffersize, nil);

        AStringList.Add(Buffer);

        Inc(I);
      end;
    finally
      FreeMem(Buffer);
    end;
  finally
    SetupDiDestroyDeviceInfoList(hDevInfo1);
  end;
end;



Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindDeviceByName('display', SPDRP_DEVICEDESC, DIGCF_PRESENT, Memo1.Lines);

    {первый параметр имя устройства в твоем случае mouse, keyboard, display}
    {второй параметр, какие устройства выводить, если к примеру написать DIGCF_PRESENT or DIGCF_ALLCLASSES то получишь все девайсы, а не только тот что запросил}
    {Третий параметр, что из описания данного устройства получить сейчас выводится название.}

end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)