Rawinput 原始输入

#NoEnv
#SingleInstance Ignore
#ErrorStdOut
#KeyHistory 0
#Persistent
ListLines, Off
; SetBatchLines -1

Rawinput:= new Rawinput("inputback")
Rawinput.Start(),MacroOn:=true
return

f2::
	if !MacroOn {
		MacroOn:=!MacroOn
		Rawinput.Start()
	}else{
		MacroOn:=!MacroOn
		Rawinput.Stop()
		ToolTip
	}
return

inputback(Type,DeviceId,a,b,c,d){
	if (Type = 0){		;鼠标
		ToolTip % "鼠标: " DeviceId "`nX: " a "`nY: " b "`n按键状态: " c	"`n设备信息: " d
	}
	else if (Type = 1){	;键盘
		sc:=% "sc" Format("{:x}", a)
		ToolTip % "键盘: " DeviceId "`nSC码: " a "`nVK码: " b "`n按键: " GetKeyName(sc)	"`n按键状态: " c	"`n设备信息: " d
	}
}

Class Rawinput {
	__New(callback){
this.DeviceMovedFn := this.DeviceMoved.Bind(this)
this.Callback := callback
}

Start(){
	this.RegisterRawInputDevices(2,0x00000100)	;注册鼠标消息
	this.RegisterRawInputDevices(6,0x00000100)	;注册键盘消息
	OnMessage(0x00FF, this.DeviceMovedFn)
}

Stop(){
	OnMessage(0x00FF, this.DeviceMovedFn, 0)
	this.RegisterRawInputDevices(2,0x00000001)	;停止鼠标消息
	this.RegisterRawInputDevices(6,0x00000001)	;停止键盘消息
}

RegisterRawInputDevices(usage,Flags) {
	static DevSize := 8 + A_PtrSize
	VarSetCapacity(RAWINPUTDEVICE, DevSize)
	NumPut(1, RAWINPUTDEVICE, 0, "UShort")
	NumPut(usage, RAWINPUTDEVICE, 2, "UShort")	;注册指定设备
	NumPut(Flags, RAWINPUTDEVICE, 4, "Uint")
	NumPut(A_ScriptHwnd, RAWINPUTDEVICE, 8, "UPtr")		;脚本的隐藏主窗口
	DllCall("RegisterRawInputDevices", "Ptr", &RAWINPUTDEVICE, "UInt", 1, "UInt", DevSize )
}

Delete(){
	this.Stop()
	this.DeviceMovedFn := ""
}

DeviceMoved(wParam, lParam){
	Critical

	;获取数据长度
	DllCall("GetRawInputData", "UInt", lParam, "UInt", 0x10000003, "Ptr", 0, "UInt*", iSize, "UInt", 8 + (A_PtrSize * 2))
	VarSetCapacity(uRawInput, iSize)
	;获取原始输入数据
	DllCall("GetRawInputData", "UInt", lParam, "UInt", 0x10000003, "Ptr", &uRawInput, "UInt*", iSize, "UInt", 8 + (A_PtrSize * 2))

	Type := NumGet(uRawInput, 0, "UInt")		;设备类型
	DeviceId := NumGet(uRawInput, 8, "UPtr")	;设备id
	DllCall("GetRawInputDeviceInfo", "Ptr",DeviceId, "UInt",0x20000007, "Ptr",0, "UIntP",size)
	VarSetCapacity(info, size)
	;获取设备详细信息
	DllCall("GetRawInputDeviceInfo", "Ptr",DeviceId, "UInt",0x20000007, "Ptr",&info, "UIntP",size)

	if (Type = 0)		;鼠标
	{
		x := 0, y := 0	; 确保始终报告轴的数字
		x := NumGet(uRawInput, (20+A_PtrSize*2), "Int")
		y := NumGet(uRawInput, (24+A_PtrSize*2), "Int")
		Button := NumGet(uRawInput, (12+A_PtrSize*2), "Int")
		this.Callback.(Type,DeviceId, x, y,Button,StrGet(&info))
	}
	else if (Type = 1){		;键盘
		ScanCode := NumGet(uRawInput, (8+A_PtrSize*2), "UShort")
		VKey := NumGet(uRawInput, (14+A_PtrSize*2), "UShort")
		Message := NumGet(uRawInput, (16+A_PtrSize*2))
		this.Callback.(Type,DeviceId, ScanCode, VKey,Message,StrGet(&info))
	}
}
}

给TA捐赠
共{{data.count}}人
人已捐赠
其他

2021年9月5日电子设备的使用方法

2021-9-5 12:26:38

其他

AHK 实现文字翻译 —— 内含 DeepL Sogou Baidu Youdao 四家接口与现成工具。

2021-9-19 14:13:12

2 条回复 A文章作者 M管理员
  1. shine4752

    感谢分享

  2. john0o0

    好好学习,天天向上

个人中心
购物车
优惠劵
有新私信 私信列表
搜索