【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