较慢的SetDefaultMouseSpeed

时间:2017-02-18 19:36:18

标签: autohotkey

我有一个AHK脚本,可以将矢量文件转换为Mousemoves和Clicks。 SVG源文件示例:

source file

当我使用常规鼠标速度在我的脚本上运行上一张图片的SVG时,下一张图片是我在MS PaintBrush上获得的输出:

hi speed

我们可以注意到青色线条,它看起来不错。现在(在下一张图片的粉红色线条上)我面临的问题。 如果我将SetDefaultMouseSpeed更改为100,这是我在MS PaintBrush上获得的输出:

low speed

我需要降低鼠标速度,使其适用于滞后的在线应用程序,但线条变得弯曲。要解决此问题,我目前正在使用SetMouseDelay。我的问题是:有没有办法使用更高的SetDefaultMouseSpeed值,而无法获得这些弯曲的对角线?

这是一个带有问题的最小代码:

SendMode Event  

$F1::
SetDefaultMouseSpeed, 2
SetMouseDelay, 10   

Mousemove, 159, 180
Send {Click Down}
Mousemove, 188, 168
Mousemove, 217, 159
Mousemove, 249, 155
Send {Click Up}

return

$F2::
SetDefaultMouseSpeed, 100
SetMouseDelay, 10   

Mousemove, 159, 180
Send {Click Down}
Mousemove, 188, 168
Mousemove, 217, 159
Mousemove, 249, 155
Send {Click Up}

return

这是MS PaintBrush上的最小示例结果(右侧有缩放版本):

minimal example output

平滑的黑线是F1按键(默认鼠标速度)的结果,弯曲的粉红线是F2按键(降低速度)的结果。

2 个答案:

答案 0 :(得分:1)

问题可能是您的脚本与之交互的UI响应不够。在那种情况下,你无能为力。我的意思是除了关闭后台进程或升级你的硬件 您可能想尝试使用ControlClick而不是MouseMove等。这样您就可以在背景中实现它,这样您在绘图时至少可以做其他事情。

您可以尝试的另一件事是仅使用Click并为您要设置的每个像素发送一次点击。但是,你可能不得不为此做一些基本的插值数学运算。

然后有PixelSetColor,您可以使用它来确定是否实际绘制了像素。

但最后你可能最好寻找一个简单的转换工具/库。我的意思是在一天结束时你只是将SVG转换为位图。

我的建议:
获取ImageMagick,然后您只需从ahk脚本运行Run, magick convert test.svg test.png或在命令行中键入magick convert test.svg test.png即可。我认为Inkscape有类似命令来做这样的事情。

编辑: 您可以尝试使用PostMessage发送鼠标单击/移动事件。行为与ControlClick非常相似,但您也可以通过这种方式进行鼠标移动 例如。

x := 159
y := 189

;WM_LBUTTONDOWN
PostMessage, 0x201, 0, x&0xFFFF | y<<16,, YourWinTitle


x := 188
y := 168

;WM_MOUSEMOVE
PostMessage, 0x200, 0, x&0xFFFF | y<<16,, YourWinTitle

x := 217
y := 159

;WM_MOUSEMOVE
PostMessage, 0x200, 0, x&0xFFFF | y<<16,, YourWinTitle

x := 249
y := 155

;WM_MOUSEMOVE
PostMessage, 0x200, 0, x&0xFFFF | y<<16,, YourWinTitle


;WM_LBUTTONUP
PostMessage, 0x202, 0, x&0xFFFF | y<<16,, YourWinTitle

您应该尝试的另一件事是使用SetBatchLines -1。只需将其放在脚本的开头即可。这可以加快你的脚本速度。

答案 1 :(得分:1)

这是另一个想法。您提到要将鼠标事件发送到网站。因此,使用浏览器的开发工具触发网站上的鼠标事件可能更快,更可靠。 你提到了anondraw.com,所以我尝试了一下它似乎有效。

  • 转到浏览器中的网站
  • 按F12打开开发人员工具
  • 单击开发人员工具中的控制台选项卡
  • 现在将以下代码粘贴到其中,然后按Enter

加载一些库:

//This first part is not necessary in this case because the website already uses jquery
//var script = document.createElement('script');
//script.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
//document.head.appendChild(script); 

//Load some scripts to make simulating mouse events easy
$.getScript('http://j-ulrich.github.com/jquery-simulate-ext/jquery.simulate.js')
$.getScript('http://j-ulrich.github.com/jquery-simulate-ext/jquery.simulate.ext.js')
$.getScript('http://j-ulrich.github.com/jquery-simulate-ext/bililiteRange.js')
$.getScript('http://j-ulrich.github.com/jquery-simulate-ext/jquery.simulate.key-sequence.js')
$.getScript('http://j-ulrich.github.com/jquery-simulate-ext/jquery.simulate.key-combo.js')
$.getScript('http://j-ulrich.github.com/jquery-simulate-ext/jquery.simulate.drag-n-drop.js')

现在复制粘贴以下代码并按Enter:

//Simulate mouse events to draw stuff
$('.paint-canvas').simulate("mousedown", {clientX: 188, clientY: 168});
$('.paint-canvas').simulate("mousemove", {clientX: 188, clientY: 168});
$('.paint-canvas').simulate("mousemove", {clientX: 217, clientY: 159});
$('.paint-canvas').simulate("mousemove", {clientX: 249, clientY: 155});
$('.paint-canvas').simulate("mouseup", {clientX: 249, clientY: 155});

// (paint-canvas is the class name of the element in which you want to draw)