【问题标题】:Autohotkey script to bookmark to a specific folder自动热键脚本将书签添加到特定文件夹
【发布时间】:2015-09-02 16:32:31
【问题描述】:

我正在使用 Firefox,我正在寻找一个自动热键脚本,当我在特定文件夹中为页面添加书签并用单个键盘快捷键替换它时,它可以让我跳过整个系列的点击。

虽然我已经阅读了 Autohotkey 论坛上的论坛主题,但在这里我仍然不知道如何制作一个有效的脚本来减少为页面添加书签以点击键盘快捷键和我想要存储的文件夹的首字母那个页面。使用 KeyWait 命令,我已使其适用于单个文件夹,但不知道如何使其适用于我可能用作书签文件夹名称的任何字母或数字。假设我有一个名为 XXXX 的文件夹,此脚本会在点击指定的快捷方式和字母 x 后将网页发送到 XXXX 文件夹(需要使用鼠标单击命令将窗口聚焦到书签对话框窗格中的文件夹):

!+^w::
Send,^d
Sleep,400
MouseClick,Left,864,304
Sleep,400
KeyWait, x ,D    
Sleep, 400
Send,^{Enter}
return

我不知道如何使此脚本适用于任何字母或数字,而不仅仅是单个字母。这个脚本还有一个大问题是它会阻塞键盘,直到我按下 X 键。如果我已经为该页面添加了书签,则按转义键删除书签窗格将阻止键盘,并且只有在我重新运行自动热键脚本时才能取消阻止它。

我也尝试使用 Input 命令作为 Autohotkey 论坛页面建议的贡献者,但它也不起作用,因为我不明白 Input 命令是如何工作的。我确实使用 KeyWait 使它适用于上述脚本的单个字母,但这是我能做的最好的。此脚本还会阻止键盘,直到击中字母:

!+^w::
Send,^d
MouseClick,Left,864,304
Sleep,400
Input, Character, L1
If Character = t
Send, t
Sleep,400
Send,^{Enter}
return

希望有人可以帮助我,这样可以方便地简化 Firefox 中的书签过程。

【问题讨论】:

  • 你的第二种方法对我来说看起来不错......?尝试用简单的send %character% 替换if character = t / send, t。如果您希望Input 不阻止发送的密钥,请使用V 选项(请参阅 ahkscript 文档 -> 输入)
  • 您好 Blauhirn,谢谢您的回答。 Input 命令是否像 KeyWait 一样工作?我希望脚本在等待输入字符后执行其余代码。在“书签对话框”窗口中确认书签是通过 Ctrl+Enter 完成的,我想通过一个可以为我自动化的脚本来避免该快捷方式。
  • 是的,inputkeyWait 一样“暂停”脚本。你说L1,所以在第一次按键后,它会立即继续。输入的字母将保存到Character

标签: autohotkey


【解决方案1】:

我有个好主意。这将打开添加书签对话框并导航到文件夹选择部分并展开所有文件夹。 您需要做的就是输入文件夹名称(或其中的一部分),它将自动被选中。完成后,只需按 Enter。

!+^w::                      ;Hotkey: Ctrl+Alt+Shift+w
    Send, ^d                ;send Ctrl+d to open the add-bookmark dialog
    Sleep, 500              ;wait for the dialog to open
    Send, {Tab}{Tab}{Enter} ;navigate into the folder selection
    Sleep, 300              ;wait to make sure we are there
    Send,{Home}             ;select the first item in the list
                            ;The following line should expand all the folders so that you can just type the folders name to search for it
    Loop, 100 {             ;Increase the number if it doesn't expand all folders
        SendInput, {Right}{Down} ;expand folders
    }
    Send, {Home}            ;navigate to the first item in the list again
    Input, L, V L1 T2       ;wait until you start typing a folder name (if you just wait 2 seconds, the bookmark won't be created)
    If (ErrorLevel =  "Timeout") {
        Send, {Tab 5}       ;press tab 5 times to navigate to the cancel button
        Send, {Enter}       ;cancel the bookmark
        Return              ;end of the hotkey
    }
    Loop {                  ;wait until you haven't typed a new letter for 0.4 seconds
        Input, L, V L1 T0.4
        If (ErrorLevel =  "Timeout")
            Break
    }
    Send, {Tab 4}           ;press tab 4 times to navigate to the enter button
    Send, {Enter}           ;save the bookmark
Return

【讨论】:

  • 嗨 Forivin 感谢您的帮助!我想摆脱“输入”。我使用 MouseClick 命令获得了文件夹窗口,我需要做的就是输入字母并按 Enter。我不需要 KeyWait 或 Input 。我已经将书签减少到一个快捷方式、一个字母并按 Enter 键。听起来可能没有必要,但我做了很多书签,我想让它的工作尽可能短,这意味着我也想避免按 Enter,这就是为什么我需要 KeyWait 或 Input 函数来自动化这个确认我输入的字母的最后一步。
  • 好的,但这意味着每个文件夹都必须以不同的字母开头。你真的想要吗?
  • @RejlanGivens 我刚刚有了一个想法并编辑了脚本。该脚本现在将等待您停止输入文件夹名称 0.4 秒,然后它会自动为您保存书签。它对我来说真的很棒,你觉得呢?
  • 像魅力一样工作,非常感谢 Forivin!当我不确认书签时,我也没有遇到阻塞键盘的问题,尽管在这种情况下的快捷方式在再次使用键盘之前将不起作用,这根本不是问题。 (例如,我要保存的书签已经在我的书签中,我点击了转义键或在另一个页面上单击鼠标,在这种情况下,如果我想为另一个页面添加书签,则快捷方式将不起作用,直到我激活键盘再次,开始输入任何内容,由于某种原因,这会再次重新启用快捷方式)。再次感谢您!
  • 一旦我获得 15 名论坛所需的声望,我将投票支持您的脚本,作为其他可能会发现此功能有用的人的信息。
【解决方案2】:

我的变种。 按 f1 在文件夹 test1 中创建书签。 按 f2 在文件夹 test2 中创建书签。

SetBatchLines, -1
Folders := {F1: "test1", F2: "test2"}
#IfWinActive, ahk_class MozillaWindowClass
F1::
F2::
Folder := Folders[A_ThisHotkey]
Send, ^d
AccFirefox := Acc_ObjectFromWindow(WinExist("ahk_class MozillaWindowClass"))
AccElem := SearchElement(AccFirefox, ROLE_SYSTEM_LISTITEM := 0x22, Folder, "")
AccElem.accDoDefaultAction(0)
sleep 100
Send {Enter}
msgbox done
return
#IfWinActive

SearchElement(ParentElement, params*)
{
   found := 1
   for k, v in params  {
      (k = 1 && ParentElement.accRole(0) != v && found := "")
      (k = 2 && ParentElement.accName(0) != v && found := "")
      (k = 3 && ParentElement.accValue(0) != v && found := "")
   }
   if found
      Return ParentElement

   for k, v in Acc_Children(ParentElement)
      if obj := SearchElement(v, params*)
         Return obj
}

Acc_Init()
{
    Static  h
    If Not  h
        h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}

Acc_ObjectFromWindow(hWnd, idObject = 0)
{
    Acc_Init()
    If  DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
    Return  ComObjEnwrap(9,pacc,1)
}

Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
    try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}

Acc_Error(p="") {
    static setting:=0
    return p=""?setting:setting:=p
}

Acc_Children(Acc) {
    if ComObjType(Acc,"Name") != "IAccessible"
        ErrorLevel := "Invalid IAccessible Object"
    else {
        Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]
        if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 {
            Loop %cChildren%
                i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):
            return Children.MaxIndex()?Children:
        } else
            ErrorLevel := "AccessibleChildren DllCall Failed"
    }
    if Acc_Error()
        throw Exception(ErrorLevel,-1)
}

【讨论】:

  • 嗨马尔切夫,谢谢!我已经尝试过了,它没有将书签放在我在书签菜单和书签工具栏中创建的 test1 或 test2 文件夹中。它直接将页面保存在书签菜单中。 “完成”对话框对我来说不是必需的,我不明白为文件夹添加快捷方式是如何工作的。 Forivin 的解决方案允许输入文件夹的首字母或全名,因此任何书签位置的任何文件夹都可以轻松分配一个书签。它还解决了当我决定不为页面添加书签时阻止脚本的问题,因为它已经被添加了书签。
  • 尝试增加睡眠。从睡眠 100 到睡眠 200 或 300。文件夹的快捷方式不是必需的。脚本搜索确切的文件夹名称。但是,如果您有多个同名文件夹 - 脚本将保存在首先找到的文件夹中。
  • 不,仍然不适合我 malcev,抱歉。我在运行脚本时没有打开文件夹窗口,所以我无法输入要存储书签的文件夹的名称。
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 2018-09-08
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
相关资源
最近更新 更多