#Requires AutoHotkey v2 ; By Tebayaki Persistent ; 初始化 touchpad := TouchpadRawInput() ; 注册回调 touchpad.SubscribeTouchpadEvent(fn) ; 显示触摸板信息 if !DllCall("GetStdHandle", "uint", -11, "ptr") DllCall("AllocConsole") fn(contactID, x, y, tip, confidence) { FileAppend( "触点ID: " contactID "`t" "X: " x "`t" "Y: " y "`t" "触碰: " tip "`t" "置信: " confidence "`n", "*" ) } ; 把触摸板的不同部分当成修饰键使用 #HotIf touchpad.contacts[1].tip && touchpad.contacts[1].confidence && touchpad.contacts[1].x < 1500 && touchpad.contacts[1].y < 1000 a:: ToolTip "手指放在触摸板左上角" #HotIf ; TouchpadRawInput.ahk class TouchpadRawInput { static __ini := false contacts := [ { contactID: 0, x: 0, y: 0, tip: false, confidence: false }, { contactID: 1, x: 0, y: 0, tip: false, confidence: false }, { contactID: 2, x: 0, y: 0, tip: false, confidence: false }, { contactID: 3, x: 0, y: 0, tip: false, confidence: false }, { contactID: 4, x: 0, y: 0, tip: false, confidence: false }, ] SubscribeTouchpadEvent(callback) { if !callback is Func || (callback.MinParams < 5 && !callback.IsVariadic) || callback.MinParams > 5 throw Error("Invalid callback function") this.__callback := callback } UnSubscribeTouchpadEvent() => this.__callback := "" __New() { if TouchpadRawInput.__ini throw Error("An instance already exists") rawInputDevice := Buffer(16) NumPut("ushort", 0x0D, "ushort", 0x05, "uint", 0x100, "ptr", A_ScriptHwnd, rawInputDevice) if !TouchpadRawInput.__ini := DllCall("RegisterRawInputDevices", "ptr", rawInputDevice, "uint", 1, "uint", rawInputDevice.Size) throw OSError() OnMessage(0x00ff, this.__ProcBinding := this.__Proc.Bind(this)) this.__callback := "" } __Delete() { if !TouchpadRawInput.__ini return rawInputDevice := Buffer(16) NumPut("ushort", 0x0D, "ushort", 0x05, "uint", 0x1, "ptr", 0, rawInputDevice) DllCall("RegisterRawInputDevices", "ptr", rawInputDevice, "uint", 1, "uint", rawInputDevice.Size) OnMessage(0x00ff, this.__ProcBinding, 0) } __Proc(wParam, lParam, msg, hwnd) { Critical DllCall("GetRawInputData", "ptr", lParam, "uint", 0x10000003, "ptr", 0, "uint*", &dataSize := 0, "uint", 24, "uint") rawInputData := Buffer(dataSize) if DllCall("GetRawInputData", "ptr", lParam, "uint", 0x10000003, "ptr", rawInputData, "uint*", &dataSize, "uint", 24, "uint") != dataSize goto end if NumGet(rawInputData, 0, "uint") != 2 goto end hDevice := NumGet(rawInputData, 8, "ptr") DllCall("GetRawInputDeviceInfo", "ptr", hDevice, "uint", 0x20000005, "ptr", 0, "uint*", &dataSize, "uint") preparsedData := Buffer(dataSize) if DllCall("GetRawInputDeviceInfo", "ptr", hDevice, "uint", 0x20000005, "ptr", preparsedData, "uint*", &dataSize, "uint") != dataSize goto end hidpCaps := Buffer(64) if DllCall("Hid\HidP_GetCaps", "ptr", preparsedData, "ptr", hidpCaps) != 1114112 goto end inputValueCapsLength := NumGet(hidpCaps, 48, "ushort") inputValueCaps := Buffer(inputValueCapsLength * 72) if DllCall("Hid\HidP_GetValueCaps", "uint", 0, "ptr", inputValueCaps, "uint*", &inputValueCapsLength, "ptr", preparsedData) != 1114112 goto end contactID := x := y := "" dwSizeHid := NumGet(rawInputData, 24, "uint") loop inputValueCapsLength { offset := (A_Index - 1) * 72 usagePage := NumGet(inputValueCaps, offset, "ushort") linkCollection := NumGet(inputValueCaps, offset + 6, "ushort") if linkCollection <= 0 continue usage := NumGet(inputValueCaps, offset + 56, "ushort") if DllCall("Hid\HidP_GetUsageValue", "uint", 0, "ushort", usagePage, "ushort", linkCollection, "ushort", usage, "uint*", &value := 0, "ptr", preparsedData, "ptr", rawInputData.Ptr + 32, "uint", dwSizeHid) != 1114112 continue if usage == 0x51 && usagePage == 0x0d contactID := value else if usage == 0x30 && usagePage == 0x01 x := value else if usage == 0x31 && usagePage == 0x01 y := value if contactID !== "" && x !== "" && y !== "" break else if A_Index == inputValueCapsLength goto end } contact := this.contacts[contactID + 1] contact.x := x contact.y := y usageLength := 9 usageAndPage := Buffer(36) if DllCall("Hid\HidP_GetUsagesEx", "uint", 0, "ushort", linkCollection, "ptr", usageAndPage, "uint*", &usageLength, "ptr", preparsedData, "ptr", rawInputData.Ptr + 32, "uint", dwSizeHid) !== 1114112 goto end contact.tip := contact.confidence := false loop usageLength { usage := NumGet(usageAndPage, (A_Index - 1) * 4, "ushort") usagePage := NumGet(usageAndPage, (A_Index - 1) * 4 + 2, "ushort") if usage == 0x42 && usagePage == 0x0d contact.tip := true else if usage == 0x47 && usagePage == 0x0d contact.confidence := true } if this.__callback this.__callback.Call(contactID, x, y, contact.tip, contact.confidence) end: return (wParam & 0xff) == 0 ? DllCall("DefWindowProc", "ptr", hwnd, "uint", msg, "ptr", wParam, "ptr", lParam, "ptr") : 0 } }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)