为什么这个操作在变成函数时会中断(AutoHotKey / AHK)

时间:2015-05-14 06:13:43

标签: function com macros ms-office autohotkey

以下操作可以纠正AHK内部。它用一个打开的单词文档中的单词tom替换了ted这个词。

工作代码

; Word Constants
    vbTrue := -1
    wdReplaceNone := 0
    wdFindContinue := 1
    return

#IfWinActive, ahk_exe WINWORD.EXE
^7::
    try
       oWord := ComObjActive("Word.Application")
    catch
       return

    FindText := "ted"
    ReplaceWith := "tom"

    oFind := oWord.Selection.Find
    oHyperlinks := oWord.ActiveDocument.Hyperlinks

    oFind.ClearFormatting
    oFind.Replacement.ClearFormatting
    while oFind.Execute(FindText, vbTrue, false,,,,, wdFindContinue,,, wdReplaceNone)
        oHyperlinks.Add(oWord.Selection.Range, "http://www.autohotkey.com",,, ReplaceWith)
    return

然而,当我将这个完全相同的代码转换为函数时,它不起作用。以这种方式编写时它不起作用,即使删除了参数并将变量放回到脚本中,它也不起作用。

代码损坏(带参数)

ReplaceAndLink(FindText, ReplaceWith)
    {
    ; Word Constants
        vbTrue := -1
        wdReplaceNone := 0
        wdFindContinue := 1
        return
    try
       oWord := ComObjActive("Word.Application")
    catch
       return

    oFind := oWord.Selection.Find
    oHyperlinks := oWord.ActiveDocument.Hyperlinks

    oFind.ClearFormatting
    oFind.Replacement.ClearFormatting
    while oFind.Execute(FindText, vbTrue, false,,,,, wdFindContinue,,, wdReplaceNone)
        oHyperlinks.Add(oWord.Selection.Range, "http://www.autohotkey.com",,, ReplaceWith)
    return
    }


#IfWinActive, ahk_exe WINWORD.EXE
^7::

ReplaceAndLink("ted", "tom")

代码损坏(无参数)

ReplaceAndLink(FindText, ReplaceWith)
    {
    ; Word Constants
        vbTrue := -1
        wdReplaceNone := 0
        wdFindContinue := 1
        return
    try
       oWord := ComObjActive("Word.Application")
    catch
       return

    FindText := "ted"
    ReplaceWith := "tom"

    oFind := oWord.Selection.Find
    oHyperlinks := oWord.ActiveDocument.Hyperlinks

    oFind.ClearFormatting
    oFind.Replacement.ClearFormatting
    while oFind.Execute(FindText, vbTrue, false,,,,, wdFindContinue,,, wdReplaceNone)
        oHyperlinks.Add(oWord.Selection.Range, "http://www.autohotkey.com",,, ReplaceWith)
    return
    }


#IfWinActive, ahk_exe WINWORD.EXE
^7::

ReplaceAndLink()

故障排除说明:

  • Word在两个操作期间都处于打开状态
  • 我使用的是最新版本的AHK
  • 我尝试在干净的重启
  • 上运行破坏的那个
  • 没有正在运行的特殊库或其他AHK脚本

另外......我知道类似的基于COM的AHK脚本可以放入函数中......例如参见:

LinkCreator(FindText, ReplaceWith)
    {
        oWord := ComObjActive("Word.Application")
        oWord.Selection.Find.ClearFormatting
        oWord.Selection.Find.Replacement.ClearFormatting

        oWord.Selection.Find.Execute(FindText, 0, 0, 0, 0, 0, 1, 1, 0, ReplaceWith, 2)
    }

F2::
       LinkCreator("store", "town")

1 个答案:

答案 0 :(得分:1)

在功能完成之前,您正在调用return。这会导致脚本停止处理该函数并返回调用者。

ReplaceAndLink(FindText, ReplaceWith)
{
; Word Constants
    vbTrue := -1
    wdReplaceNone := 0
    wdFindContinue := 1
    return <---------- HERE
try
   oWord := ComObjActive("Word.Application")
catch
   return

尝试删除它,它应该按预期执行。

当某些内容未执行时,一个简单的故障排除提示是在代码中的某处放置SoundbeepMsgBox,以查看是否有一些无法访问的代码并从那里向后工作。