0

在特定程序中,我想为右键单击光标的当前位置,然后移动光标以选择该菜单上的一个项目,然后再次移动光标以选择子菜单上的一个项目的动作分配一个热键。我已经了解了前两个命令。当我到达mousemove时,无论我输入什么坐标,光标都会射到屏幕的左上角,当我想要它做的是先向右移动100像素然后向上移动60像素,然后再移动100右侧的像素,y 轴上的零像素。显然我误解了一些东西。请指教。

谢谢,艾伦

   s::

MouseGetPos

Click right

sleep, 100

MouseMove, 60, -60, 5, R

Sleep, 100

MouseMove, 200, 0, 5, R

MouseClick, L

return
4

3 回答 3

1

艾伦,首先,如果可能的话,试试你是否可以使用键盘快捷键。
请检查:控制面板\轻松访问中心\使键盘更易于使用\在键盘快捷键和访问键下划线。这将显示您可以使用的快捷方式。这样,您甚至可以找到菜单的键盘快捷键,而不是使用鼠标位置。

^+b:: ; Record the location of the menu at the beginnin with [Shift]+[Ctrl]+b
SoundBeep, 500, 500
ToolTip, Click on the "XYZ" Link
KeyWait, LButton, D
MouseGetPos, xPos, yPos
Send, {Esc}
ToolTip
Return

^b::
MouseClick, Right, xPos, yPos
;Mousemove, 100, 60 R
Send, e : OR WHATEVER Shortcut letter OR.....
Send, {Down 3}{Enter} ; IF you want to use down arrow 3 times to get to the item.
Return

已修改,您必须将鼠标定位在不断变化的菜单位置上。

^b::
    MouseClick, Right ; presses where the mouse is located
    ;Mousemove, 100, 60 R
    Send, e : OR WHATEVER Shortcut letter OR.....
    Send, {Down 3}{Enter} ; IF you want to use down arrow 3 times to get to the item.
    Return

如果您可以识别菜单 ID(使用 AHK Windows Spy,请将鼠标放在菜单上并查看“鼠标下方”),您可以使用 controlsend。这将与位置无关,因为 controlsend 将使用菜单 ID 发送信号。如果您告诉我您尝试控制哪个应用程序,我可以查看是否可以使用 controlSend....

哦,顺便说一句,我不知道您使用的是 XP,启用快捷方式说明适用于 Windows 7。

于 2013-04-24T18:15:08.893 回答
0

Mousemove应该MouseMove取而代之吗?就像文档中的那样。

于 2013-04-24T20:10:14.067 回答
0
  • 这个 AutoHotkey 脚本,包括用户创建的 AutoHotkey 函数,应该可以满足您的要求。它会自动右键单击程序,然后在后续菜单上选择 3 个项目。

  • 该脚本已编写为在 Media Player Classic 上运行,但只需要编辑某些行以使其适用于您的程序 TypeTool 3。您指定一个以逗号分隔的列表,其中包含一个或多个项目,即项目的名称在第一个菜单中选择,在第二个菜单项中选择等等。

  • 绝大多数程序使用标准上下文菜单,因此它应该适用于您的程序;这与菜单栏和其他类型的控件/资源形成对比,这些控件/资源在程序之间变化更大。

-

;note: requires Acc.ahk library in AutoHotkey\Lib folder
;https://github.com/Drugoy/Autohotkey-scripts-.ahk/blob/master/Libraries/Acc.ahk
;on right of screen right-click Raw, Save target as...

;the currently assigned hotkey is ctrl+q
;e.g. Media Player Classic, open right-click menu, click items
#IfWinActive, ahk_class MediaPlayerClassicW
^q::
WinGet, hWnd, ID, A
WinGetClass, vWinClass, ahk_id %hWnd%
if vWinClass not in MediaPlayerClassicW
Return
CoordMode, Mouse, Screen
MouseGetPos, vPosX2, vPosY2

WinGetPos, vPosX, vPosY, vPosW, vPosH, ahk_id %hWnd%
vPosX := Round(vPosX + vPosW/2)
vPosY := Round(vPosY + vPosH/2)
MouseMove, %vPosX%, %vPosY%

vList = View,On Top,Default
MenuRCSelectItem(vList)
MouseMove, %vPosX2%, %vPosY2%
Return
#IfWinActive

;===============

MenuRCSelectItem(vList, vDelim=",", vPosX="", vPosY="", vDelay=0)
{
DetectHiddenWindows, Off
CoordMode, Mouse, Screen
MouseGetPos, vPosX2, vPosY2
(vPosX = "") ? (vPosX := vPosX2)
(vPosY = "") ? (vPosY := vPosY2)

if !(vPosX = vPosX2) OR !(vPosY = vPosY2)
MouseMove, %vPosX%, %vPosY%
Click right

Loop, Parse, vList, %vDelim%
{
vTemp := A_LoopField
WinGet, hWnd, ID, ahk_class #32768
    if !hWnd
    {
    MsgBox error
    Return
    }

oAcc := Acc_Get("Object", "1", 0, "ahk_id " hWnd)
Loop, % oAcc.accChildCount
if (Acc_Role(oAcc, A_Index) = "menu item")
if (oAcc.accName(A_Index) = vTemp)
if (1, oRect := Acc_Location(oAcc, A_Index), vIndex := A_Index)
break

vPosX := Round(oRect.x + oRect.w/2)
vPosY := Round(oRect.y + oRect.h/2)
MouseMove, %vPosX%, %vPosY%
Sleep %vDelay% ;optional delay
oAcc.accDoDefaultAction(vIndex)
WinWaitNotActive, ahk_id %hWnd%, , 6
    if ErrorLevel
    {
    MsgBox error
    Return
    }
}

MouseMove, %vPosX2%, %vPosY2%
Return
}

;==================================================
于 2017-01-01T04:11:55.380 回答