簡體   English   中英

是否可以獲得 XInput 設備的名稱、產品 ID、供應商 ID 或其他類型的唯一標識符?

[英]Is it possible to get an XInput device's name, product ID, vendor ID or some other kind of unique identifier for it?

通常,XInput 控制器僅使用與控制器的玩家編號相對應的索引來標識。 有沒有辦法通過特定索引(例如供應商 ID、產品 ID 或設備名稱)獲取有關控制器的更多信息?

更好的是一個標識符與該控制器唯一且一致地對應,以便它可以與所有其他 XInput 設備區分開來,而不管其索引如何,包括另一個具有相同模型(即相同產品和供應商 ID)的控制器,類似於使用 DirectInput 可用的實例 GUID。

這可以使用 XInput 或其他 Microsoft API 來完成嗎? 如果需要,我也願意使用未記錄的功能。

通常,簡單地使用與控制器的播放器編號相對應的索引來識別XInput控制器。 有沒有一種方法可以獲取有關具有特定索引的控制器的更多信息,例如其供應商ID,產品ID或設備名稱?

更好的是唯一唯一地與該控制器保持一致的標識符,以便可以將其與所有其他XInput設備區分開來,而不管其索引如何,包括另一個具有相同型號(即相同產品和供應商ID)的控制器,類似於使用DirectInput可以使用實例GUID。

可以使用XInput或其他Microsoft API完成此操作嗎? 如果需要,我也願意使用未記錄的功能。

XInput1_4.dll 中有一些未公開的函數。 您可以像這樣獲取供應商 ID 和產品 ID:

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <Xinput.h>
#include <stdio.h>

struct XINPUT_CAPABILITIES_EX
{
    XINPUT_CAPABILITIES Capabilities;
    WORD vendorId;
    WORD productId;
    WORD revisionId;
    DWORD a4; //unknown
};

typedef DWORD(_stdcall* _XInputGetCapabilitiesEx)(DWORD a1, DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES_EX* pCapabilities);
_XInputGetCapabilitiesEx XInputGetCapabilitiesEx;

void main()
{
    HMODULE moduleHandle = LoadLibrary(TEXT("XInput1_4.dll"));
    XInputGetCapabilitiesEx = (_XInputGetCapabilitiesEx)GetProcAddress(moduleHandle, (char*)108);

    for (int i = 0; i < 4; ++i)
    {
        printf("Gamepad %d ", i);

        XINPUT_CAPABILITIES_EX capsEx;
        if (XInputGetCapabilitiesEx(1, i, 0, &capsEx) == ERROR_SUCCESS)
        {
            printf("connected, vid = 0x%04X pid = 0x%04X\n", (int)capsEx.vendorId, (int)capsEx.productId);
        }
        else
        {
            printf("not connected\n");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM