如何使用autohotkey获取textarea文本值?

时间:2018-04-28 20:47:07

标签: html automation autohotkey

我正在尝试使用https://www.tutorialspoint.com/online_java_formatter.htm格式化我的java代码。但我从textarea获取文本时遇到问题。我正在尝试从textarea中获取文本。

<textarea class="ace_text-input" style="width: 6.59px; height: 14.05px; right: 428.4px; bottom: 511.79px; opacity: 0;" spellcheck="false" wrap="off"></textarea>

Autohotkey代码:

;code beautifier java
^+b::
Send ^c
formatter := "https://www.tutorialspoint.com/online_java_formatter.htm"
(pwb2 := ComObjCreate("InternetExplorer.Application")).Visible:=True
pwb2.navigate(formatter)
while pwb2.busy
    sleep 15

pwb2.document.getElementsByTagName("textarea")[0].value=Clipboard
pwb2.document.getElementById("beautify").Click()
sleep 5000
Clipboard := pwb2.document.getElementsByTagName("textarea")[1].innerHTML
Send, ^v
pwb2.quit()
Return

1 个答案:

答案 0 :(得分:0)

问题是您用于格式化代码的网站不使用普通<textarea>,而是使用this code editor。如果您查看网站源代码底部附近的JavaScript,您会发现正在使用其中两个编辑器(editoroutputeditor)。他们的setValuegetValue方法可用于处理其内容。

要在AHK中执行此操作,您可以在页面中创建一个元素,其内容将包含剪贴板数据,以及稍后格式化的结果。 pwb2.document.parentWindow.execScript可用于执行JavaScript,以使用剪贴板元素中的数据与编辑器进行交互。

^+b::
Clipboard := ""
Send {Ctrl Down}c{Ctrl Up}
ClipWait 1
if ErrorLevel {
    MsgBox Java formatter error: Clipboard is empty
    return
}
java := Clipboard

formatter := "https://www.tutorialspoint.com/online_java_formatter.htm"
pwb2 := ComObjCreate("InternetExplorer.Application")
pwb2.navigate(formatter)
while pwb2.busy
    sleep 15

d := pwb2.document
ahkData := d.createElement("div")
ahkData.id := "ahkData"
ahkData.hidden := true
ahkData.innerText := java
d.body.appendChild(ahkData)

js =
(
    var ahkData = document.getElementById('ahkData');
    var marker = "//AHKDATA\n";
    editor.setValue(marker + ahkData.innerText);
    outputeditor.on("change", function(e) {
        var value = outputeditor.getValue();
        if (value.indexOf(marker) !== -1) {
            ahkData.innerText = value.substring(marker.length);
            ahkData.hidden = false;
        }
    });
    document.getElementById("beautify").click();
)

d.parentWindow.execScript(js)

while ahkData.hidden
    sleep 150

Clipboard := ahkData.innerText
Send ^v
pwb2.quit()
Return

请注意,美化按钮的单击处理程序会在更新outputeditor之前返回,因为它只是发送带有未格式化代码的异步POST请求,因此我添加了对outputeditor更改事件的回调。将在请求完成并更新编辑器时运行。此回调中的marker用于区分由于最初包含在网站上的代码而导致的outputeditor更改事件与格式化代码后发生的更改事件。我假设您不希望看到IE窗口并删除其可见性,但如果您确实希望它可见,则需要使用WinWaitActive或类似的东西等待IE窗口关闭以及之前( copy-from)窗口在发送 Ctrl + v 之前再次变为活动状态。

由于格式化确实是通过POST请求完成的,因此您可以使用WinHttp.WinHttpRequest.5.1 COM对象来复制请求。但是,IMO它更麻烦(至少在AHK中),因为你必须在剪贴板中手动编码Java代码。