插入操纵杆后使用DirectInput接收信号

时间:2013-05-13 17:54:45

标签: c++ directinput

我有一个C ++程序,它在程序开始时枚举所有输入设备(使用直接输入)。如果程序启动,然后我插入另一个控制器,则在重新启动程序之前将无法识别该控制器。任何人都知道我可以使用的事件会导致我的程序在插入新设备后枚举所有设备吗?

2 个答案:

答案 0 :(得分:2)

This article讨论了如何检测游戏手柄的变化。首先,您可以处理WM_DEVICECHANGE消息并检查wParamDBT_DEVICEARRIVAL的{​​{1}}。但是,为了以DBT_DEVICEREMOVECOMPLETE s接收这些内容,您需要先调用RegisterDeviceNotification

文章的示例如下:

WPARAM

唯一需要注意的是,支持的最低操作系统是XP,因此在包含Windows标头之前,您需要输入相应的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 }

根据您的目的,您甚至可能不必先调用此功能。相反,您只需检查#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);