BOOL DisconnectNIA(void) { UINT ui; UINT ret; UINT i; write_logfile("Disconnecting NIA"); ret=GetRegisteredRawInputDevices(NULL,&ui,sizeof(RAWINPUTDEVICE)); // get size if (ret<=sizeof(Rid)) // if okay, get structures GetRegisteredRawInputDevices(Rid, &ui, sizeof(RAWINPUTDEVICE)); if(ret!=(UINT)-1){ for (i=0; i<ui; i++) { Rid[i].dwFlags = RIDEV_REMOVE; // this should disable the HID device Rid[i].hwndTarget = NULL ; // RawInputDeviceList[i].hDevice = NULL; if (RegisterRawInputDevices(Rid, 1, sizeof(RAWINPUTDEVICE)) == FALSE) report_error("Could not close NIA"); } } ret=GetRegisteredRawInputDevices(Rid, &ui, sizeof(RAWINPUTDEVICE)); if (ret !=0) write_logfile("Could not disconnect NIA"); return TRUE; }
// // getMouseRawInputDevice // // Helper function that searches for a registered mouse raw input device. If // found, the device parameter is filled with the information for the device // and the function returns true. // bool getMouseRawInputDevice(RAWINPUTDEVICE& device) { device.usUsagePage = 0; device.usUsage = 0; device.dwFlags = 0; device.hwndTarget = 0; // get the number of raw input devices UINT num_devices; GetRegisteredRawInputDevices(NULL, &num_devices, sizeof(RAWINPUTDEVICE)); // create a buffer to hold the raw input device info RAWINPUTDEVICE* devices = new RAWINPUTDEVICE[num_devices]; // look at existing registered raw input devices GetRegisteredRawInputDevices(devices, &num_devices, sizeof(RAWINPUTDEVICE)); for (UINT i = 0; i < num_devices; i++) { // is there already a mouse device registered? if (devices[i].usUsagePage == HID_USAGE_PAGE_GENERIC && devices[i].usUsage == HID_USAGE_GENERIC_MOUSE) { device.usUsagePage = devices[i].usUsagePage; device.usUsage = devices[i].usUsage; device.dwFlags = devices[i].dwFlags; device.hwndTarget = devices[i].hwndTarget; break; } } delete [] devices; return device.usUsagePage == HID_USAGE_PAGE_GENERIC && device.usUsage == HID_USAGE_GENERIC_MOUSE; }
std::vector<RAWINPUTDEVICE> rawinput_registered_devices(){ UINT _num_devices; UINT _result; if(0 != GetRegisteredRawInputDevices(0, &_num_devices, sizeof(RAWINPUTDEVICE))){ std::cerr << "rawinput_registered_devices: 0 != GetRegisteredRawInputDevices(0, &num_devices, sizeof(RAWINPUTDEVICE))" << std::endl; return std::vector<RAWINPUTDEVICE>(); } std::vector<RAWINPUTDEVICE> devices(_num_devices); _result = GetRegisteredRawInputDevices(&devices[0], &_num_devices, sizeof(RAWINPUTDEVICE)); if(-1 == _result){ std::cerr << "rawinput_registered_devices: -1 == _result" << std::endl; return std::vector<RAWINPUTDEVICE>(); } devices.resize(_result); return devices; }
BOOL ConnectNIA(HWND hDlg) { UINT ui; UINT ret; ret=GetRawInputDeviceList(NULL,&ui,0); UINT i; int sav_pause; write_logfile("Connecting NIA"); sav_pause=TTY.read_pause; TTY.read_pause=1; ret=GetRegisteredRawInputDevices(NULL,&ui,sizeof(RAWINPUTDEVICE)); // get size if (ret<=sizeof(Rid)) // if okay, get structures GetRegisteredRawInputDevices(Rid, &ui, sizeof(RAWINPUTDEVICE)); if (ui>0) { write_logfile("NIA already connected!"); TTY.read_pause=sav_pause; return (TRUE); } m_hNIA[0]=NULL; m_hNIA[1]=NULL; ui=20; ret=GetRawInputDeviceList(&RawInputDeviceList[0],&ui,sizeof(RAWINPUTDEVICELIST)); if(ret!=(UINT)-1) { RID_DEVICE_INFO dev_info ; TCHAR strName[300]; m_nCountNIA = 0; for(i=0;i<ret;i++) { if(i>=20) break; dev_info.cbSize=sizeof(RID_DEVICE_INFO); ui=sizeof(RID_DEVICE_INFO); GetRawInputDeviceInfo(RawInputDeviceList[i].hDevice,RIDI_DEVICEINFO,&dev_info,&ui); ui=300; GetRawInputDeviceInfo(RawInputDeviceList[i].hDevice,RIDI_DEVICENAME,strName,&ui); if(dev_info.hid.dwVendorId==0x1234 /*&& dev_info.hid.dwProductId==0*/) { if(m_nCountNIA>=2) break; // nur an dieser Stelle vorbereitet! m_hNIA[m_nCountNIA]=RawInputDeviceList[i].hDevice; Rid[m_nCountNIA].usUsagePage = 0xFF00; Rid[m_nCountNIA].usUsage = 0xFF01; Rid[m_nCountNIA].dwFlags = RIDEV_INPUTSINK; // this enables the caller to receive the input even when the caller is not in the foreground. Note that hwndTarget must be specified. Rid[m_nCountNIA].hwndTarget = ghWndMain ; // directs Data to main Thread !! m_nCountNIA++; // ToDo: für 2 NIA Devices 2! Channels in Amplifier??? (not tested yet!) } } } else { TTY.read_pause=sav_pause; return (FALSE) ; } if(m_nCountNIA>0) { if (RegisterRawInputDevices(Rid, m_nCountNIA, sizeof(RAWINPUTDEVICE)) == FALSE) { write_logfile("Could not register NIA"); report_error("Could not register NIA"); TTY.read_pause=sav_pause; return FALSE; } else { if (hDlg!=NULL) { SetDlgItemText( hDlg, IDC_PORTCOMBO, "none") ; TTY.read_pause=sav_pause; return TRUE; } } } TTY.read_pause=sav_pause; return FALSE; }