複数台のマウスが接続されている場合は、どれからの入力なのかを判断するサンプルです。(適当)改造すればキーボードも行けるはず。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 0x00000004oncmd gosub *on_wm_input, WM_INPUTonexit gosub *exitdim RAWINPUTDEVICE, 3RAWINPUTDEVICE.0 = 0x01 & 0xFFFFRAWINPUTDEVICE.0 |= 0x02 << 16 // 0x02 はマウス、 0x06 にするとキーボードになるはず・・・?RAWINPUTDEVICE.1 = 0//RIDEV_INPUTSINK// | RIDEV_NOLEGACYRAWINPUTDEVICE.2 = hwndRegisterRawInputDevices RAWINPUTDEVICE, 1, 12if stat == 0 : dialog "失敗" : endstop*on_wm_inputif wparam == RIM_INPUT {// サイズを取得するdwSize = 0GetRawInputData lparam, RID_INPUT, 0, dwSize, 16if dwSize == 0 : return // 失敗// 実際に取得dim RAWINPUT, (dwSize/4) + 1GetRawInputData lparam, RID_INPUT, varptr(RAWINPUT), dwSize, 16if stat == 0 || stat == -1 : return // 失敗// ハンドルを取得hDevice = RAWINPUT.2// デバイス名でも取得してみる?// サイズ取得cbSize = 0GetRawInputDeviceInfoA hDevice, RIDI_DEVICENAME, 0, cbSizeif cbSize == 0 : return // 失敗// 実際に取得sdim devName, cbSize + 1GetRawInputDeviceInfoA hDevice, RIDI_DEVICENAME, varptr(devName), cbSize// デバイスIDとやらに変換してやる(自前で)split devName, "#{", tmpsplit tmp.0, "\\\\?\\", tmp1tmp2 = tmp1.1tmp2 = replace(tmp2, "#", "\\")// オープンするSetupDiGetClassDevsA 0, tmp2, 0, DIGCF_ALLCLASSEShDevInfo = statif hDevInfo == 0 : return // 失敗dim SP_DEVINFO_DATA, 7SP_DEVINFO_DATA.0 = 4*7// 列挙する(1つのみ)SetupDiEnumDeviceInfo hDevInfo, 0, varptr(SP_DEVINFO_DATA)if stat == 0 : SetupDiDestroyDeviceInfoList hDevInfo : return // 失敗// デバイスの説明を読み取る// サイズ取得dwSize = 0SetupDiGetDeviceRegistryPropertyA hDevInfo, varptr(SP_DEVINFO_DATA), SPDRP_DEVICEDESC, 0, 0, 0, dwSizeif dwSize == 0 : SetupDiDestroyDeviceInfoList hDevInfo : return // 失敗// 実際に取得sdim buf, dwSize + 1SetupDiGetDeviceRegistryPropertyA hDevInfo, varptr(SP_DEVINFO_DATA), SPDRP_DEVICEDESC, 0, varptr(buf), dwSize, dwSizeif stat == 0 : SetupDiDestroyDeviceInfoList hDevInfo : return // 失敗// 開放SetupDiDestroyDeviceInfoList hDevInfotitle ""+buf}return*exitendendreturn