我是编码的新手,我一直尝试在网上找到的各种代码段,但无法获得以下代码将数组保存到记事本而不是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 ;他们在网上搜索并尝试调整它以保存在记事本中但仍然存在问题。
再次感谢 铜
答案 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)