複数台のマウスが接続されている場合は、どれからの入力なのかを判断するサンプルです。(適当)改造すればキーボードも行けるはず。Windows XP 以上で動作するらしいですよ。
複数台のマウスが接続されている場合は、どれからの入力なのかを判断するサンプルです。(適当)改造すればキーボードも行けるはず。Windows XP 以上で動作するらしいですよ。
// Windows XP 以上で動作するらしいです //#include "modReplace.hsp" #include "mod_regexp.as" #include "kernel32.as" #uselib "user32" #func RegisterRawInputDevices "RegisterRawInputDevices" var, int, int #func GetRawInputData "GetRawInputData" int, int, int, var, int #func GetRawInputDeviceInfoA "GetRawInputDeviceInfoA" int, int, int, var #uselib "setupapi" #func SetupDiCreateDeviceInfoList "SetupDiCreateDeviceInfoList" int, int #func SetupDiOpenDeviceInfoA "SetupDiOpenDeviceInfoA" int, str, int, int, int #func SetupDiGetDeviceRegistryPropertyA "SetupDiGetDeviceRegistryPropertyA" int, int, int, int, int, int, var #func SetupDiDestroyDeviceInfoList "SetupDiDestroyDeviceInfoList" int #func SetupDiGetClassDevsA "SetupDiGetClassDevsA" int, str, int, int #func SetupDiGetDeviceInterfaceDetail "SetupDiGetDeviceInterfaceDetail" int, int, int, int, int, int #func SetupDiEnumDeviceInterfaces "SetupDiEnumDeviceInterfaces" int, int, int, int, int #func SetupDiEnumDeviceInfo "SetupDiEnumDeviceInfo" int, int, int #define RIDEV_INPUTSINK 0x00000100 #define RIDEV_NOLEGACY 0x00000030 #define WM_INPUT 0x00FF #define RID_HEADER 0x10000005 #define RID_INPUT 0x10000003 #define RIM_INPUT 0 #define RIM_INPUTSINK 1 #define RIDI_DEVICENAME 0x20000007 #define RIDI_DEVICEINFO 0x2000000B #define RIDI_PREPARSEDDATA 0x20000005 #define SPDRP_DEVICEDESC 0x00000000 #define DIGCF_ALLCLASSES 0x00000004 oncmd gosub *on_wm_input, WM_INPUT onexit gosub *exit dim RAWINPUTDEVICE, 3 RAWINPUTDEVICE.0 = 0x01 & 0xFFFF RAWINPUTDEVICE.0 |= 0x02 << 16 // 0x02 はマウス、 0x06 にするとキーボードになるはず・・・? RAWINPUTDEVICE.1 = 0//RIDEV_INPUTSINK// | RIDEV_NOLEGACY RAWINPUTDEVICE.2 = hwnd RegisterRawInputDevices RAWINPUTDEVICE, 1, 12 if stat == 0 : dialog "失敗" : end stop *on_wm_input if wparam == RIM_INPUT { // サイズを取得する dwSize = 0 GetRawInputData lparam, RID_INPUT, 0, dwSize, 16 if dwSize == 0 : return // 失敗 // 実際に取得 dim RAWINPUT, (dwSize/4) + 1 GetRawInputData lparam, RID_INPUT, varptr(RAWINPUT), dwSize, 16 if stat == 0 || stat == -1 : return // 失敗 // ハンドルを取得 hDevice = RAWINPUT.2 // デバイス名でも取得してみる? // サイズ取得 cbSize = 0 GetRawInputDeviceInfoA hDevice, RIDI_DEVICENAME, 0, cbSize if cbSize == 0 : return // 失敗 // 実際に取得 sdim devName, cbSize + 1 GetRawInputDeviceInfoA hDevice, RIDI_DEVICENAME, varptr(devName), cbSize // デバイスIDとやらに変換してやる(自前で) split devName, "#{", tmp split tmp.0, "\\\\?\\", tmp1 tmp2 = tmp1.1 tmp2 = replace(tmp2, "#", "\\") // オープンする SetupDiGetClassDevsA 0, tmp2, 0, DIGCF_ALLCLASSES hDevInfo = stat if hDevInfo == 0 : return // 失敗 dim SP_DEVINFO_DATA, 7 SP_DEVINFO_DATA.0 = 4*7 // 列挙する(1つのみ) SetupDiEnumDeviceInfo hDevInfo, 0, varptr(SP_DEVINFO_DATA) if stat == 0 : SetupDiDestroyDeviceInfoList hDevInfo : return // 失敗 // デバイスの説明を読み取る // サイズ取得 dwSize = 0 SetupDiGetDeviceRegistryPropertyA hDevInfo, varptr(SP_DEVINFO_DATA), SPDRP_DEVICEDESC, 0, 0, 0, dwSize if dwSize == 0 : SetupDiDestroyDeviceInfoList hDevInfo : return // 失敗 // 実際に取得 sdim buf, dwSize + 1 SetupDiGetDeviceRegistryPropertyA hDevInfo, varptr(SP_DEVINFO_DATA), SPDRP_DEVICEDESC, 0, varptr(buf), dwSize, dwSize if stat == 0 : SetupDiDestroyDeviceInfoList hDevInfo : return // 失敗 // 開放 SetupDiDestroyDeviceInfoList hDevInfo title ""+buf } return *exit end end return