【HSP3】複数台のマウスが接続されている場合は、どれからの入力なのかを判断するサンプル(てきとー)

複数台のマウスが接続されている場合は、どれからの入力なのかを判断するサンプルです。(適当)改造すればキーボードも行けるはず。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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX