使用DirectInput在插入游戏手柄后接收信号

7

我有一个使用Direct Input枚举所有输入设备的C++程序。如果程序已经启动,然后我插入另一个控制器,这个控制器直到重新启动程序后才会被识别。有人知道我可以使用哪个事件来在新设备插入后让我的程序重新枚举所有设备吗?

2个回答

4

本文讨论如何检测游戏手柄的变化。首先,您可以处理WM_DEVICECHANGE消息,并检查wParam是否为DBT_DEVICEARRIVALDBT_DEVICEREMOVECOMPLETE。不过,似乎要将它们作为WPARAM接收,您需要先调用RegisterDeviceNotification

该文章的示例代码如下:

DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
ZeroMemory(&notificationFilter, sizeof(notificationFilter));
 
notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
notificationFilter.dbcc_size = sizeof(notificationFilter);
 
HDEVNOTIFY hDevNotify;
hDevNotify = RegisterDeviceNotification(m_hWnd, &notificationFilter,
   DEVICE_NOTIFY_WINDOW_HANDLE |
   DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
 
if(hDevNotify == NULL) {
   // do some error handling
}

这里要注意的唯一一件事情是,此功能的最低支持操作系统为XP,因此在包括Windows头文件之前,您需要放入相应的#define
根据您想要做什么,您甚至可能不必首先调用此函数。相反,您可以只检查DBT_DEVNODES_CHANGED以不区分设备是否已插入或已拔出。如果您不关心,这样可以节省一些代码。

1

搞定了。当任何设备被移除或添加时,只需处理所有的“IDirectInputDevice8”并重新创建它们即可。这可以避免错误并保持简单。

钩取WinProc方法以监视添加/删除事件。

bool refreshInputDevices = false;
LRESULT SubWndProc(int code, WPARAM wParam, LPARAM lParam)
{
    // invalid code skip
    if (code < 0) return CallNextHookEx(NULL, code, wParam, lParam);

    // check if device was added/removed
    PCWPSTRUCT pMsg = PCWPSTRUCT(lParam);
    if (pMsg->message == WM_DEVICECHANGE)
    {
        switch (pMsg->wParam)
        {
        case DBT_DEVNODES_CHANGED:
            refreshInputDevices = true;
            break;

        case DBT_DEVICEARRIVAL:
            refreshInputDevices = true;
            break;

        case DBT_DEVICEREMOVECOMPLETE:
            refreshInputDevices = true;
            break;
        }
    }

        // continue as normal
        return CallNextHookEx(NULL, code, wParam, lParam);
    }

这是如何挂钩输入线程的方法。
// hook WinProc to watch for device changes
HMODULE module = GetModuleHandleW(NULL);
DWORD threadID = GetCurrentThreadId();
HHOOK hook = SetWindowsHookExW(WH_CALLWNDPROC, (HOOKPROC)&SubWndProc, module, threadID);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接