Определить тип подключенной клавиатуры.

Тема в разделе "WASM.WIN32", создана пользователем katrus, 31 мар 2010.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Как можно програмно определить тип подключенной клавиатуры? Т.е. опредлить, что подключена ps/2, usb, или обе.
     
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    может из списка рабочих на машине pnp-драйверов или реестра (CurrentControlSet)
     
  3. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Ret прав, вот у меня обычная PS/2:
    STANDARD 101/102-KEY OR MICROSOFT NATURAL PS/2 KEYBOARD::{4D36E96B-E325-11CE-BFC1-08002BE10318}\0000;
     
  4. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Отключаю USB клавиатуру и все равно под HKLM\System\CCS\Control\Classes\4D36E96B-E325-11CE-BFC1-08002BE10318\ вижу и ps/2 и usb.
     
  5. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    katrus
    Код (Text):
    1. Отключаю USB клавиатуру и все равно под HKLM\System\CCS\Control\Classes\4D36E96B-E325-11CE-BFC1-08002BE10318\ вижу и ps/2 и usb.
    Естественно - эти драйвера установлены в системе.
    Используйте SetupDiGetClassDevs с флагом DIGCF_PRESENT(загруженные драйверы) + SetupDiEnumDeviceInfo + SetupDiGetDeviceRegistryProperty
     
  6. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    gorodon
    Большое спасибо! Как раз то, что нужно. Вдруг кому потребуется - код показывающий все подключенныей клавиатуры:

    Код (Text):
    1. #include <Windows.h>
    2. #include <SetupAPI.h>
    3. #include <stdio.h>
    4.  
    5. #pragma comment(lib, "setupapi.lib")
    6.  
    7. void main()
    8. {  
    9.     const GUID GUID_DEVCLASS_KEYBOARD = { 0x4D36E96B, 0xE325, 0x11CE, { 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 }};
    10.     HDEVINFO devs = SetupDiGetClassDevs(&GUID_DEVCLASS_KEYBOARD, 0, 0, DIGCF_PRESENT);
    11.     for (int i = 0; ; i ++)
    12.     {
    13.         SP_DEVINFO_DATA dev_info = {0};
    14.         dev_info.cbSize = sizeof(dev_info);
    15.         if (! SetupDiEnumDeviceInfo(devs, i, &dev_info))
    16.             break;
    17.         GUID bus_guid = {0};
    18.         DWORD bus_guid_size = sizeof(bus_guid);
    19.         BOOL is_bus = SetupDiGetDeviceRegistryProperty(
    20.             devs, &dev_info, SPDRP_BUSTYPEGUID, NULL, (PBYTE)&bus_guid, bus_guid_size, &bus_guid_size);        
    21.         printf("#%d %s\n", i, is_bus ? "usb" : "ps2");
    22.     }
    23. }