我有一个使用Direct Input枚举所有输入设备的C++程序。如果程序已经启动,然后我插入另一个控制器,这个控制器直到重新启动程序后才会被识别。有人知道我可以使用哪个事件来在新设备插入后让我的程序重新枚举所有设备吗?
我有一个使用Direct Input枚举所有输入设备的C++程序。如果程序已经启动,然后我插入另一个控制器,这个控制器直到重新启动程序后才会被识别。有人知道我可以使用哪个事件来在新设备插入后让我的程序重新枚举所有设备吗?
本文讨论如何检测游戏手柄的变化。首先,您可以处理WM_DEVICECHANGE
消息,并检查wParam
是否为DBT_DEVICEARRIVAL
或DBT_DEVICEREMOVECOMPLETE
。不过,似乎要将它们作为WPARAM
接收,您需要先调用RegisterDeviceNotification
。
该文章的示例代码如下:
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
notificationFilter.dbcc_size = sizeof(notificationFilter);
HDEVNOTIFY hDevNotify;
hDevNotify = RegisterDeviceNotification(m_hWnd, ¬ificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE |
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
if(hDevNotify == NULL) {
// do some error handling
}
#define
。DBT_DEVNODES_CHANGED
以不区分设备是否已插入或已拔出。如果您不关心,这样可以节省一些代码。搞定了。当任何设备被移除或添加时,只需处理所有的“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);