AHK 快餐店[9] 之 让鼠标移动一像素

32
1 Star2 Stars3 Stars4 Stars5 Stars(快来投票)
Loading...


上回对读者的留言进行了答复,外加向读者挑战。

vampire 在得到了颜色神偷之后,高兴得不得了。今天他又来找掌柜我鸟。

vampire:如何让鼠标移动一像素?
sfufoet:干嘛用的?
vampire:有时候在 PS 处理图片的时需要嘛。比如选择一个 2 × 2 像素的区域。人工移动鼠标根本做不到。

这个好办。我们可以写一个这样的脚本。本文涉及到的代码来自这里

LEFT::
MouseGetPos, x, y
; 获得鼠标位置,并把获得的 X,Y 坐标分别赋值给 x,y
Mousemove, x-1, y
; 移动鼠标,保持 y 坐标不变,向左移动一个像素。
Return

UP::
MouseGetPos, x, y
Mousemove, x, y-1
Return

RIGHT::
MouseGetPos, x, y
Mousemove, x+1, y
Return

DOWN::
MouseGetPos, x, y
Mousemove, x, y+1
Return

运行脚本后,就可以用上下左右箭头来控制鼠标的移动了。上面的代码好啰嗦哦,对于追求代码之美的程序员来说,下面的代码多完美啊。

Left::  MouseMove, -1,  0,, R
; MouseMove 的完整语法是:
; MouseMove, X, Y [, Speed, R]
; X – X 坐标;Y – Y 坐标;
[ ] 里面的是可选参数,Speed – 移动的速度,其范围是 0 – 100,不填写任何数字的话,参数默认是 0 ,最快速移动;最后的 R 表示前面的参数 X、Y 是相对鼠标当前位置,如果不带这个参数, X、Y 就表示屏幕上的坐标。讲起来很啰嗦,大家比较上面的代码就明白。
Up::    MouseMove,  0, -1,, R
Right:: MouseMove,  1,  0,, R
Down::  MouseMove,  0,  1,, R

update:本系列故事纯属虚构,请勿对号入座。

下回预告:AHK 快餐店[10] 之 键盘也会乾坤大挪移

已有 32 条评论, 我要留言

  1. Paveo说道:

    沙发。。。

  2. 柠檬杀手说道:

    难道他不知道世界上有放大这种功能么?

  3. helfee说道:

    这里还能抢沙发 – -!
    支持AHK~

  4. helfee说道:

    @柠檬 ,那只是举个例子啊,又不是非让你这么用~

  5. 3m说道:

    嗯… 这个例子确实用处不大…

  6. Paveo说道:

    “比如选择一个 2 × 2 像素的区域。人工移动鼠标根本做不到。”

    完全做得到。

  7. sfufoet说道:

    的确不够实用,这次是想 show 一下 AHK 代码的简洁美。

    一像素一像素移动鼠标的最强用法是:验证码识别,传说中的功能。嘿嘿~

  8. elfox说道:

    我的天啦- -~~~ 连载到这么长了

  9. 李二嫂的猪说道:

    宁愿使用API的GetCursorPos和SetCursorPos……
    AHK的功能太强了,接近一个完善的程序开发语言,所以总有这样的感觉:学习时间可能不短,还不如学一门语言。

  10. 李二嫂的猪说道:

    晕,啥时候还加一个Logo啊?

  11. sfufoet说道:

    @李二嫂,昨晚做的,喜欢么?因为本文不知道配什么图好。煎蛋煎多了,习惯配图。

    ahk 的确强大简洁,做 Gui 方面个人觉得不够友好。

    学其他语言的话,你想实现一个小小的 AHK 效果都会累死你。比如 java。

  12. faint说道:

    晕,楼上的没事做了吧,实现这功能用java。你怎么不说用AHK去写J2EE程序试试?

  13. 李二嫂的猪说道:

    To 火山:

    Logo不错啊~真有点Web 2.0风格呢~

    今年7、8月份的时候,有过一阵子AHK,那时是用来做软件的GUI测试的,先录制,再修改,让他输入一些随机数据,确实很方便。至于其它的,就没怎么弄过了。

  14. sfufoet说道:

    @李二嫂,我很好奇你这个 ID,i 服了 u。

    版聊了。orz~

  15. 李二嫂的猪说道:

    To 火山:

    一小般啦~不过前天玩音速时遇到个克星,他叫“我是李二哥”,当时这个无奈啊~

  16. tireless说道:

    怎样让代码只在某程序中运行?如我想让下面的只在命令行窗口起作用,其它地方则无效—–
    ^c::
    Send, {Enter}
    return

  17. tireless说道:

    按数学原理,纵坐标-1,坐标点不是向下吗?
    怎么这里的y-1是往上走了??

  18. sfufoet说道:

    @tireless,这样写:

    ^c::
    WinGetActiveTitle, Title
    IfInString, Title, cmd.exe
    Send, {Enter}
    return

    屏幕上的坐标是以屏幕左上角为原点的。然后向左、向下递增。

  19. vampire说道:

    我是来声明下我不是白痴的

  20. helfee说道:

    @tireless,试试这样~

    #IfWinActive ahk_class ConsoleWindowClass
    ^c::Send,dir{Enter}
    return

  21. tireless说道:

    @sfufoet,(*^__^*) 嘻嘻……你的代码无效
    @helfee,有用。这下可以在该死的命令提示符下使用^c ^v ^a 了

    thx sfufoet&helfee

  22. […] [from darknew] Applications Inn-AHK 快餐店[9] 之 让鼠标移动一像素 […]

  23. […] AHK 快餐店[9] 之 让鼠标移动一像素 10-30-2007 […]

  24. sfufoet说道:

    @tireless,orz,我是根据标题含有 cmd.exe 判断的,helfee 是根据窗口类来判断的。我这样写不够通用。他那样写绝对保险。

  25. Dofy说道:

    hotkey,^left ,a_left
    hotkey,^right ,a_right
    hotkey,^up ,a_up
    hotkey,^down ,a_down

    hotkey,^1,init

    init:
    x := 0
    y := 0
    tooltip,
    return

    a_left:
    mousemove,-1,0,0,r
    x--
    tooltip, X:%x% Y:%y%
    return

    a_right:
    mousemove,1,0,0,r
    x++
    tooltip, X:%x% Y:%y%
    return

    a_up:
    mousemove,0,-1,0,r
    y--
    tooltip, X:%x% Y:%y%
    return

    a_down:
    mousemove,0,1,0,r
    y++
    tooltip, X:%x% Y:%y%
    return

    这是我写着玩的, ctrl + 方向 控制鼠标,下图是用这个工具画的 😀

    http://dofy.net/myfiles/autohotkey_test.png

  26. Dofy说道:

    有意思, 研究中, 还不知道怎么在一个自定义函数中调用另一个自定义函数 🙁

    @tireless: cmd 窗口中 ctrl+c 是终止, 建议定义其他热键做复制粘贴

  27. Dofy说道:

    @tireless: 偶写了一段, 在cmd窗口中用 win+s 开始选择, win+c 复制, win+v 粘贴, win+q 退出

    ;—————————————-
    #ifWinActive,ahk_class ConsoleWindowClass

    beginSelect := false

    #s::
    if(beginSelect == false){
    click right, 10, 50
    send k
    beginSelect := true
    }
    return

    #c::
    if(beginSelect == true){
    click right, 10, 50
    beginSelect := false
    }
    return

    #v::
    click right, 10, 50
    send p
    ;send %clipboard%
    ; 曾尝试剪贴板, 速度不如右键菜单这个快
    return

    #q::
    send ^c exit {enter}
    return
    ;—————————————-

  28. sfufoet说道:

    @dofy
    第一种:
    Gosub, Label1
    MsgBox, The Label1 subroutine has returned (it is finished).
    return

    Label1:
    MsgBox, The Label1 subroutine is now running.
    return

    第二种:

    Goto, MyLabel

    MyLabel:
    Sleep, 100

  29. […] sfufoet: @dofy 第一种: Gosub, Label1 MsgBox, The… […]

  30. Dofy说道:

    @sfufoet 多谢老兄 😀
    另外, autohotkey 是不是有多种语法啊? 我找到另外的解决方案, 感觉不错, 而且优化了一下鼠标移动, hoho 🙂 http://blog.dofy.net/?p=479

  31. sfufoet说道:

    这两种语法是不一样的,第一种是运行一个代码片段,最后又会返回。第二种是跳到代码片段那里去执行。

  32. 橙色八月说道:

    其实默认参数是1!!你调到0就知道了

有不同想法?说说看