我有一个C ++程序,它在程序开始时枚举所有输入设备(使用直接输入)。如果程序启动,然后我插入另一个控制器,则在重新启动程序之前将无法识别该控制器。任何人都知道我可以使用的事件会导致我的程序在插入新设备后枚举所有设备吗?
答案 0 :(得分:2)
This article讨论了如何检测游戏手柄的变化。首先,您可以处理WM_DEVICECHANGE
消息并检查wParam
或DBT_DEVICEARRIVAL
的{{1}}。但是,为了以DBT_DEVICEREMOVECOMPLETE
s接收这些内容,您需要先调用RegisterDeviceNotification
。
文章的示例如下:
WPARAM
唯一需要注意的是,支持的最低操作系统是XP,因此在包含Windows标头之前,您需要输入相应的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
即可区分正在插入或拔出的设备。如果你不在乎,这可以节省一些代码。
答案 1 :(得分:0)
开始工作了。当删除或添加任何设备时,只需处理所有“IDirectInputDevice8”并重新创建它们。这样可以避免错误并保持简单。
Hook 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);