有没有办法确定Windows计算机是否连接了触控板和鼠标?

时间:2014-04-10 17:49:18

标签: c++ windows mouse

我正在寻找一种方法来确定运行我的游戏的计算机是否有触控板和鼠标连接到它。一个典型的例子是连接有外接鼠标的笔记本电脑。

是否有Windows API会返回连接到系统的鼠标/指针设备的数量?

我需要支持Windows 7 +。

修改

我保留接受的答案,因为它有效并回答了我的问题但我决定在发现ManyMouse后不再使用它。它做我想要的,并允许我在Mac,Windows和(希望,仍然需要测试)Linux上使用相同的API。

1 个答案:

答案 0 :(得分: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;
}