2014-04-10 26 views
1

我正在尋找一種方法來確定運行我的遊戲的計算機是否有觸控板和鼠標連接到它。一個典型的例子是連接了外部鼠標的筆記本電腦。有沒有辦法確定Windows計算機是否連接了觸控板和鼠標?

是否有Windows API會返回連接到系統的鼠標/指針設備的數量?

我需要支持Windows 7+。

編輯

我讓接受的答案,因爲它的工作原理,並回答我的問題,但我決定不發現ManyMouse後使用。它做我想要的,並允許我在Mac,Windows和(希望仍需要測試)Linux上使用相同的API。

+0

我敢肯定有一種方法,但爲什麼要這樣做呢?我沒有看到任何實際的原因。 – TerraOrbis

+0

@TerraOrbis因爲我想在用戶啓動遊戲時處理不同的輸入設置(例如,鍵盤+鼠標,鍵盤,遊戲手柄),而不需要用戶的任何配置。我可以使用[SYSTEM_POWER_STATUS](http://stackoverflow.com/a/4849574/608884)作出一個明智的猜測,如果用戶在筆記本電腦上(並有一個觸控板)。檢測用戶是否還有第二隻鼠標會讓我進一步猜測他們有一個kb +鼠標設置。很多猜測,但我認爲它會在大多數情況下運作,如果不是,那麼回退到一些默認值,並提供手動配置。 – NoobsArePeople2

回答

2

我碰巧有一段代碼,它列舉了連接到系統的鼠標。如果有不止一個,它可能是一個觸控板,另一個是外接鼠標,但我想它可能是一個觸控板和其中一個小棒。應該可以使用相同的API來獲取關於每個標稱鼠標的足夠信息以作出明智的猜測;例如,內置鼠標設備通常似乎通過PS/2連接,而外部鼠標幾乎總是USB。

不管怎麼說,希望這將幫助:

#include <windows.h> 

#include <Hidsdi.h> 
#include <SetupAPI.h> 
#include <devguid.h> 

#include <stdio.h> 

#pragma comment(lib, "hid.lib") 
#pragma comment(lib, "setupapi.lib") 

int main(int argc, char ** argv) 
{ 
    GUID hid_guid; 
    GUID mouse_guid = GUID_DEVCLASS_MOUSE; 
    HDEVINFO hdevinfo; 
    SP_DEVICE_INTERFACE_DATA devinterface; 
    SP_DEVINFO_DATA devinfo; 
    BYTE devdetailbuffer[4096]; 
    PSP_DEVICE_INTERFACE_DETAIL_DATA devdetail; 
    DWORD n; 

    HidD_GetHidGuid(&hid_guid); 

    hdevinfo = SetupDiGetClassDevs(&hid_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); 

    if (hdevinfo == INVALID_HANDLE_VALUE) 
    { 
     printf("SetupDiGetClassDevs: %u\n", GetLastError()); 
     return 1; 
    } 

    for (n = 0;; n++) 
    { 
     devinterface.cbSize = sizeof(devinterface); 
     if (!SetupDiEnumDeviceInterfaces(hdevinfo, NULL, &hid_guid, n, &devinterface)) 
     { 
      printf("SetupDiEnumDeviceInterfaces: %u\n", GetLastError()); 
      break; 
     } 
     devdetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)devdetailbuffer; 
     devdetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 
     devinfo.cbSize = sizeof(devinfo); 
     if (!SetupDiGetDeviceInterfaceDetail(hdevinfo, &devinterface, devdetail, sizeof(devdetailbuffer), NULL, &devinfo)) 
     { 
      printf("SetupDiGetDeviceInterfaceDetail: %u\n", GetLastError()); 
      break; 
     } 
     if (IsEqualGUID(&devinfo.ClassGuid, &mouse_guid)) 
     { 
      // This is a mouse 
      printf("DevicePath: %ws\n", devdetail->DevicePath); 
     } 
    } 
    return 0; 
} 
+0

只想說你的規則!必須做一些改變才能在MinGW下建立它,但總的來說它工作得很好。思考我的原始問題更多我並不擔心挑剔的觸控板與鼠標,因爲我關於筆記本電腦(隱式地使用觸控板),但沒有鼠標與筆記本電腦(再次,跟蹤板),但也有外部鼠標。你的代碼片段加上[this](http://stackoverflow.com/a/4849574/608884)應該讓我做出明智的猜測,它將很好地覆蓋大多數情況。再次感謝! – NoobsArePeople2

+0

@Harry Johnston我相信調用GetSystemMetrics(SM_MousePresent)是檢查鼠標是否連接的首選方法 – Artur

+0

@Artur:我不認爲這會告訴你鼠標的數量,只是至少有一個。另外文件說它通常不準確。 –

相關問題