用于打开右键菜单并选择菜单项的脚本

时间:2013-04-24 16:38:56

标签: autohotkey

在一个特定的程序中,我想为在光标当前位置右键单击的操作分配一个热键,然后移动光标选择该菜单上的项目,然后再次移动光标以选择子项目上的项目-菜单。我已经达到了前两个命令。当我到达鼠标移动时,无论我放入什么坐标,光标都会射到屏幕的左上角,当我想要它做的时候首先向右移动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

3 个答案:

答案 0 :(得分:1)

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

^+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 ....

哦b.t.w。我不知道你使用的是XP,启用快捷方式指令适用于Windows 7。

答案 1 :(得分:0)

Mousemove不应该是MouseMove吗?它就像docs中那样。

答案 2 :(得分: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
}

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