Closed yhtt2020 closed 11 months ago
扩展屏? 指的是多个屏幕还是由软件模拟出的屏幕
扩展屏? 指的是多个屏幕还是由软件模拟出的屏幕 物理连接的多个屏幕。当扩展屏摆放在主屏左侧或者上侧的时候,会导致坐标轴变成负数,此时,会触发无法hook和取值变成一个六万多的整数的bug
还有就是开启监听后,好像如果快速滚动滚轮,可能会导致电脑发出嘟嘟嘟的那种粘滞键的提示音
GetMouseMovePoints 函数是系统api 没有中间商赚差价,我尝试复现下再思考方法
GetMouseMovePoints 函数是系统api 没有中间商赚差价,我尝试复现下再思考方法
那挺奇怪的,我后来不得不用electron带的获取屏幕坐标封装了一下,但是electron没有钩子可以钩鼠标移动事件。无法解决鼠标移动事件无响应的问题。
sleep 阻塞的是整个进程 也不建议在对键盘进行hook时候使用 建议用异步阻塞代替 进程阻塞 Sleep是异步的(大写S开头)
mouseHook 是个非常低级的hook接口 不建议重复调用,因为他会对每次鼠标事件进行一次处理,然后传递给下一个钩子处理最后才传递给系统
sleep 阻塞的是整个进程 也不建议在对键盘进行hook时候使用 建议用异步阻塞代替 进程阻塞 Sleep是异步的(大写S开头)
mouseHook 是个非常低级的hook接口 不建议重复调用,因为他会对每次鼠标事件进行一次处理,然后传递给下一个钩子处理最后才传递给系统
- 这个我得先看下cpp代码下
好的, 非常感谢建议,我想想看怎么优化一下这个处理方式。我之前找了一下好像涉及鼠标钩子的,有mouse方法和一个setSystemHook方法。
2.当鼠标移动到x轴或者y轴为负数的屏幕上的时候
3.当我使用setCursorPos的时候,鼠标在移动,也会造成无法成功移动鼠标。
2.当鼠标移动到x轴或者y轴为负数的屏幕上的时候
- 这个我做了一个防止异常的处理,小于0 大于400000000的时候会被忽略掉 这个我修改下触发阈值
3.当我使用setCursorPos的时候,鼠标在移动,也会造成无法成功移动鼠标。
可能需要您说明下
- 是鼠标移动被 setCursorPos 挤掉了要从setCursorPos的坐标开始
- 还是鼠标移动被 setCursorPos 指引到了新的地方但是鼠标无法从setCursorPos 的新坐标开始移动
- 还是直接导致鼠标失灵
例如我在晃动鼠标的时候,此时坐标轴在不断改变,然后我用setCursorPos去设置鼠标坐标。大概率是无法成功的。返回是true,但是好像没有移动过鼠标。 所以为了提升成功率,我只能被动做了个循环去触发50次坐标改动,这样成功率就会提升。但是同样引入了上面那个延时的问题。因为如果间隔太短,依然还是有可能被忽略了。
还有就是开启监听后,好像如果快速滚动滚轮,可能会导致电脑发出嘟嘟嘟的那种粘滞键的提示音
这个问题我无法复现 这个我也不晓得问题在哪里
此issues 被合并到 https://github.com/kihlh/hmc-win32/issues/33
此issues在 https://github.com/kihlh/hmc-win32/commit/560fd534ceadb8aa981c4d408292888556999c48 版本中得到修复, 在1.4.3版本中已发布 同时新增以下API可能 能优化您的代码结构
sleep 阻塞的是整个进程 也不建议在对键盘进行hook时候使用 建议用异步阻塞代替 进程阻塞 Sleep是异步的(大写S开头) mouseHook 是个非常低级的hook接口 不建议重复调用,因为他会对每次鼠标事件进行一次处理,然后传递给下一个钩子处理最后才传递给系统
- 这个我得先看下cpp代码下
好的, 非常感谢建议,我想想看怎么优化一下这个处理方式。我之前找了一下好像涉及鼠标钩子的,有mouse方法和一个setSystemHook方法。
SetSystemHOOK 是个非常危险的api 他的原名应该是叫 SetSystemLock 有人用了 就将错就错了 没有改名,他的功能是禁用键盘鼠标,我认为你只是想要一个在xxms内禁用鼠标移动的函数 ,我新增个
2.当鼠标移动到x轴或者y轴为负数的屏幕上的时候
- 这个我做了一个防止异常的处理,小于0 大于400000000的时候会被忽略掉 这个我修改下触发阈值
3.当我使用setCursorPos的时候,鼠标在移动,也会造成无法成功移动鼠标。
可能需要您说明下
- 是鼠标移动被 setCursorPos 挤掉了要从setCursorPos的坐标开始
- 还是鼠标移动被 setCursorPos 指引到了新的地方但是鼠标无法从setCursorPos 的新坐标开始移动
- 还是直接导致鼠标失灵
例如我在晃动鼠标的时候,此时坐标轴在不断改变,然后我用setCursorPos去设置鼠标坐标。大概率是无法成功的。返回是true,但是好像没有移动过鼠标。 所以为了提升成功率,我只能被动做了个循环去触发50次坐标改动,这样成功率就会提升。但是同样引入了上面那个延时的问题。因为如果间隔太短,依然还是有可能被忽略了。
严格设置坐标的话请使用 setLimitMouseRange API
举个栗子:
hmc.setLimitMouseRange (5000,1,50,50,50)
5000代表5000ms内不允许鼠标离开这个范围
近期正在做一个关于鼠标穿梭的需求,晃动鼠标快速移动到扩展屏上,再次晃动回到原位。使用了win32.mouseHook.on钩子 遇到几个问题: 1.如果同时打开两个进程,都监听了鼠标,可能造成鼠标移动缓慢问题。不知道是不是我监听的方法不对,目前没有做防抖动。 2.当鼠标移动到x轴或者y轴为负数的屏幕上的时候,move事件无回调,同理,使用getMouseMovePoints 获取最近的64个坐标方法取到的数值也不正确,得到了一个六万多的整数(负数坐标),似乎像是坐标数值溢出了。 我换用electron自带的获取鼠标坐标可获取到正确的负数坐标。 3.当我使用setCursorPos的时候,鼠标鼠标在移动,也会造成无法成功移动鼠标。 附上相关代码,希望有帮助 ` let currentRoundEdge = 0 let currentDirection = 'left' let times = 0 let timer = null let sleep = false let lastPos = { x: 0, y: 0 } let pinPos = { x: 0, y: 0 } let go = false const options = { timeout: 1000, sleep: 1000, debounce: 10 } win32.mouseHook.on('move', (x, y, mousePoint) => { console.log('事件触发',mousePoint) if(!window.shake?.enable){ return } const point=tsbApi.mouse.getPos() x=point.x y=point.y console.log('输出判断用的x,y',x,y) if (times === 0) { lastPos = { x, y } } if (sleep) { return }
function setClearTimeout () { if (!timer) { clearTimeout(timer) } timer = setTimeout(() => { times = 0 }, options.timeout) }
function judeTimes (cbTimes, cb) { if (times >= cbTimes) { sleep = true setTimeout(() => { sleep = false }, options.sleep) times = 0 cb(mousePoint) } else { } }
function setCursorPos (x, y) { for (let i = 0; i < 50; i++) { win32.Auto.setCursorPos(x, y)//移动过去,但是这个过程中鼠标在移动则无法移动 win32.sleep(10) } }
function shakeMouseEvent (mousePoint) { document.getElementById('shakeAudio').play() if (!go) { go = true pinPos = { ...lastPos } if (window.shake?.pos) { setCursorPos(window.shake.pos.x, window.shake.pos.y) } } else { go = false if (window.shake?.pos) { setCursorPos(pinPos.x, pinPos.y) } } times = 0 }
if (currentDirection === 'left') { if (x > (currentRoundEdge + options.debounce)) { //左移的时候,x突然大于当前位置,代表反向了 setClearTimeout() currentDirection = 'right' times++ judeTimes(window.shake?.sensitive, shakeMouseEvent) return } else { //继续突破 currentRoundEdge = x } } else if (currentDirection === 'right') { if (x < (currentRoundEdge - options.debounce)) { setClearTimeout() //左移的时候,x突然大于当前位置,代表反向了 currentDirection = 'left' times++ judeTimes(window.shake?.sensitive, shakeMouseEvent) return } else { //继续突破 currentRoundEdge = x } } }) win32.mouseHook.start() `