我有一个 C++ 程序,它在程序开始时枚举所有输入设备(使用直接输入)。如果程序启动,然后我插入另一个控制器,这个控制器将无法识别,直到程序重新启动。任何人都知道我可以使用的事件会导致我的程序在插入新设备后枚举所有设备?
问问题
1900 次
2 回答
4
本文讨论如何检测游戏手柄的变化。首先,您可以处理WM_DEVICECHANGE
消息并wParam
检查DBT_DEVICEARRIVAL
or DBT_DEVICEREMOVECOMPLETE
。不过,似乎为了接收这些WPARAM
s,您需要先调用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
唯一需要注意的另一件事是,支持的最低操作系统是 XP,因此您需要在包含 Windows 标头之前放入适当的操作系统。
根据您想要执行的操作,您甚至可能不必先调用此函数。相反,您可以检查DBT_DEVNODES_CHANGED
以不区分插入或拔出的设备。如果您不在乎,那可以节省一些代码。
于 2013-05-13T18:14:28.847 回答
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);
于 2021-07-02T09:24:19.097 回答