AutoIT - 保存到记事本而不是MsgBox

时间:2015-11-04 10:53:21

标签: autoit

我是编码的新手,我一直尝试在网上找到的各种代码段,但无法获得以下代码将数组保存到记事本而不是MsgBOX。

如果有人可以请给我答案并调整代码,以便将其保存到记事本中而不是显示在msgbox中,我会更好地学习分离工作代码作为尝试调整/修复损坏/错误的代码

我非常感激!。

由于 铜

Global $Array = _WinGetCtrlInfo(WinGetTitle(''))
Global $sOne = '[0][0] = ' & $Array[0][0] & @CR, $sTwo
For $iCC = 1 To $Array[0][0]
    $sOne &= '[' & $iCC & '][0] = ' & $Array[$iCC][0] & @CR
    $sTwo &= '[' & $iCC & '][1] = ' & $Array[$iCC][1] & @CR
Next
MsgBox(64, 'WinInfo', StringTrimRight($sOne, 1) & @CR & StringTrimRight($sTwo, 1))

Func _WinGetCtrlInfo($hWin)
    If IsString($hWin) Then $hWin = WinGetHandle($hWin)
    Local $sClassList = WinGetClassList($hWin), $iAdd, $aDLL, $sHold
    Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF), $aReturn[1][2]
    For $iCount = UBound($sSplitClass) - 1 To 1 Step - 1
        Local $nCount = 0
        While 1
            $nCount += 1
            If ControlGetHandle($hWin, '', $sSplitClass[$iCount] & $nCount) = '' Then ExitLoop
            If Not StringInStr(Chr(1) & $sHold, Chr(1) & $sSplitClass[$iCount] & $nCount & Chr(1)) Then
                $sHold &= $sSplitClass[$iCount] & $nCount & Chr(1)
                $iAdd += 1
                ReDim $aReturn[$iAdd][2]
                $aReturn[$iAdd - 1][0] = $sSplitClass[$iCount] & $nCount
                $aDLL = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', _
                    ControlGetHandle($hWin, '', $sSplitClass[$iCount] & $nCount))
                If @error = 0 Then
                    $aReturn[$iAdd - 1][1] = $aDLL[0]
                Else
                    $aReturn[$iAdd - 1][1] = ''
                EndIf
            EndIf
        WEnd
    Next
    $aReturn[0][0] = $iAdd - 1
    Return $aReturn
EndFunc

上面的当前代码运行正常并且会编译一个controlNN列表但是我使用它的软件有数百个不同的controlNN,所以它不适合消息框,我&#39 ;他们在网上搜索并尝试调整它以保存在记事本中但仍然存在问题。

再次感谢 铜

2 个答案:

答案 0 :(得分:0)

您可以使用autoit内置功能' FileWrite'这里取代了MsgBox。

Global $Array = _WinGetCtrlInfo(WinGetTitle(''))
Global $sOne = '[0][0] = ' & $Array[0][0] & @CR, $sTwo
For $iCC = 1 To $Array[0][0]
    $sOne &= '[' & $iCC & '][0] = ' & $Array[$iCC][0] & @CR
    $sTwo &= '[' & $iCC & '][1] = ' & $Array[$iCC][1] & @CR
Next

;MsgBox(64, 'WinInfo', StringTrimRight($sOne, 1) & @CR & StringTrimRight($sTwo, 1))

FileWrite("D:/notepad.txt",StringTrimRight($sOne, 1) & @CR & StringTrimRight($sTwo, 1))

Func _WinGetCtrlInfo($hWin)
    If IsString($hWin) Then $hWin = WinGetHandle($hWi   n)
    Local $sClassList = WinGetClassList($hWin), $iAdd, $aDLL, $sHold
    Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF), $aReturn[1][2]
    For $iCount = UBound($sSplitClass) - 1 To 1 Step - 1
        Local $nCount = 0
        While 1
            $nCount += 1
            If ControlGetHandle($hWin, '', $sSplitClass[$iCount] & $nCount) = '' Then ExitLoop
            If Not StringInStr(Chr(1) & $sHold, Chr(1) & $sSplitClass[$iCount] & $nCount & Chr(1)) Then
                $sHold &= $sSplitClass[$iCount] & $nCount & Chr(1)
                $iAdd += 1
                ReDim $aReturn[$iAdd][2]
                $aReturn[$iAdd - 1][0] = $sSplitClass[$iCount] & $nCount
                $aDLL = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', _
                    ControlGetHandle($hWin, '', $sSplitClass[$iCount] & $nCount))
                If @error = 0 Then
                    $aReturn[$iAdd - 1][1] = $aDLL[0]
                Else
                    $aReturn[$iAdd - 1][1] = ''
                EndIf
            EndIf
        WEnd
    Next
    $aReturn[0][0] = $iAdd - 1
    Return $aReturn
EndFunc

答案 1 :(得分:0)

您可以运行记事本并使用Send()在记事本中键入文本,而不是调用MsgBox

Global $Array = _WinGetCtrlInfo(WinGetTitle(''))
Global $sOne = '[0][0] = ' & $Array[0][0] & @CR, $sTwo
For $iCC = 1 To $Array[0][0]
    $sOne &= '[' & $iCC & '][0] = ' & $Array[$iCC][0] & @CR
    $sTwo &= '[' & $iCC & '][1] = ' & $Array[$iCC][1] & @CR
Next
Run("notepad.exe")
WinWaitActive("Unbenannt - Editor")
Send($sOne)
Send($sTwo)

请注意,您必须修改空记事本窗口的标题以与您的本地化相匹配。

这是一个关于这个主题的有趣教程:
https://www.autoitscript.com/autoit3/docs/tutorials/notepad/notepad.htm

作为替代方案,您可以遵循Xenobiologist的建议并使用_FileWriteFromArray直接写入文件,然后在记事本中打开此文件,这要快得多:

#include <File.au3>
Global $Array = _WinGetCtrlInfo(WinGetTitle(''))
_FileWriteFromArray(@DesktopDir & "\output.txt", $Array)
Run("notepad.exe " & @DesktopDir & "\output.txt", @WindowsDir, @SW_MAXIMIZE)