找回密码
 加入
搜索
查看: 21810|回复: 28

[系统综合] [已解决]如何使用AutoIt发送字符到cmd命令窗体?

 火... [复制链接]
发表于 2013-3-21 21:47:12 | 显示全部楼层 |阅读模式
本帖最后由 mbdnmt 于 2013-4-2 00:20 编辑

如何使用AutoIt发送字符到cmd命令窗体?并把从cmd的返回值返回给AutoIt?

这个问题分两点:
一、 如何发送字符到cmd窗体?无论cmd窗体是否置前
      这里,不希望使用Activate来激活cmd窗体,然后用Send()的方式;要能支持后台发送的(最小化能否支持发送再说),即无论cmd窗体是否置前,都可以发送命令的;
      使用Run/RunWait或者ShellExecute/ShellExecuteWait貌似也不能满足需要,因为这种实现只能支持连续执行完一个文件字符的。而实际使用是希望通过cmd操作cmd_A,再AutoIt进行一些别的操作other_A,然后cmd命令行里再操作几步cmd_B;总之就是要交替操作的,而且cmd_B操作依赖cmd_A,单独使用Run/ShellExecute操作cmd_B无效。而cmd_A和cmd_B中一定要进行非cmd操作(如other_A)

      cmd_A
      other_A
      cmd_B

二、cmd_A操作会有一些返回值,如何把它返回给AutoIt?
发表于 2013-4-1 11:30:09 | 显示全部楼层
我收集的,看看对你有没有参考


#include <GuiButton.au3>
#include <GuiImageList.au3>
#include <Constants.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <Misc.au3>
#include <ScrollBarConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("CaretCoordMode", 0)
Global $aPalette[21] = [0xFFFFFF, 0x000000, 0xC0C0C0, 0x808080, _
                0xFF0000, 0x800000, 0xFFFF00, 0x808000, _
                0x00FF00, 0x008000, 0x00FFFF, 0x008080, _
                0x0000FF, 0x000080, 0xFF00FF, 0x800080, _
                0xC0DCC0, 0xA6CAF0, 0xFFFBF0, 0xA0A0A4, 0xABCDEF]

Global Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]")
Global Const $aFullScreen = WinGetPos($hFullScreen)

_GDIPlus_Startup()
Global Const $iW = 736, $iH = 369, $sFont = "Fixedsys"
Global $iFGColor = 0xC0C0C0, $iBGColor = 0x000000, $__Enum
Global Const $hGUI = GUICreate("DOS回显", 736, 450, -1, -1, -1, $WS_EX_CONTEXTHELP + $WS_EX_ACCEPTFILES)
Global Const $idEdit = GUICtrlCreateEdit($hGUI, 0, 0, $iW, $iH, BitOR($ES_AUTOVSCROLL, $WS_HSCROLL, $WS_VSCROLL, $ES_MULTILINE, $ES_WANTRETURN))
Global Const $hEdit = GUICtrlGetHandle($idEdit)
Global $sCMDLine = @HomeDrive & @HomePath
Global $sPrefix = StringStripWS(StringStripCR(ExecuteCMD("ver")), 3)
Global $iPrefixLen = StringLen($sCMDLine & ">")
Global Const $iColorTxt = $iFGColor
GUICtrlSetData($idEdit, $sPrefix & @CRLF & _
                "Copyright (c) 2009 Microsoft Corporation.  All rights reserved." & @CRLF & @CRLF)
GUICtrlSetFont($idEdit, 12, 400, 0, $sFont, 5)
GUICtrlSetColor($idEdit, $iColorTxt)
GUICtrlSetBkColor($idEdit, $iBGColor)
_GUICtrlEdit_SetLimitText($hEdit, -1)

Global Const $iStartx = 30, $iBtnWidth = 80, $iStarty = 390
Global Const $idButton_Dir = GUICtrlCreateButton("Dir", $iStartx, $iStarty, $iBtnWidth, 40)
Global Const $hButton_Dir = GUICtrlGetHandle($idButton_Dir)
Global Const $sButton_DirNN = _WinAPI_GetClassName($hButton_Dir) & _GetNN($hButton_Dir)

Global Const $idButton_IPC = GUICtrlCreateButton("IPConfig", 2 * $iStartx + 1 * $iBtnWidth, $iStarty, $iBtnWidth, 40)
Global Const $hButton_IPC = GUICtrlGetHandle($idButton_IPC)
Global Const $sButton_IPCNN = _WinAPI_GetClassName($hButton_IPC) & _GetNN($hButton_IPC)

Global Const $idButton_Ping = GUICtrlCreateButton("Ping", 3 * $iStartx + 2 * $iBtnWidth, $iStarty, $iBtnWidth, 40)
Global Const $hButton_Ping = GUICtrlGetHandle($idButton_Ping)
Global Const $sButton_PingNN = _WinAPI_GetClassName($hButton_Ping) & _GetNN($hButton_Ping)

Global Const $idButton_RunBatch = GUICtrlCreateButton("运行批处理", 4 * $iStartx + 3 * $iBtnWidth, $iStarty, $iBtnWidth, 40, $BS_DEFPUSHBUTTON)
GUICtrlSetBkColor(-1, 0xE0FFE0)
Global Const $hButton_RunBatch = GUICtrlGetHandle($idButton_RunBatch)
Global Const $sButton_RunBatchNN = _WinAPI_GetClassName($hButton_RunBatch) & _GetNN($hButton_RunBatch)

Global Const $idButton_Exit = GUICtrlCreateButton("退出", $iW - $iBtnWidth - $iStartx, $iStarty, $iBtnWidth, 40)
Global Const $hButton_Exit = GUICtrlGetHandle($idButton_Exit)
Global Const $sButton_ExitNN = _WinAPI_GetClassName($hButton_Exit) & _GetNN($hButton_Exit)

Global Const $idLable_ChgBGColor = GUICtrlCreateLabel("更改背景色", 5 * $iStartx + 4 * $iBtnWidth, $iStarty - 10)
Global Const $idLable_ChgFGColor = GUICtrlCreateLabel("更改字体颜色", 5 * $iStartx + 4 * $iBtnWidth, $iStarty + 14)
Global Const $idLable_ChgFont = GUICtrlCreateLabel("更改字体", 5 * $iStartx + 4 * $iBtnWidth, $iStarty + 36)
Global $iStyle = $BS_SPLITBUTTON + $BCSS_NOSPLIT
If @OSBuild < 6000 Then $iStyle = Default
Global Const $idButton_ChgBGColor = GUICtrlCreateButton("", 5 * $iStartx + 4 * $iBtnWidth + 92, $iStarty - 12, 40, 18, $iStyle)
Global Const $hButton_ChgBGColor = GUICtrlGetHandle($idButton_ChgBGColor)
Global Const $sButton_ChgBGColorNN = _WinAPI_GetClassName($hButton_ChgBGColor) & _GetNN($hButton_ChgBGColor)
_GUICtrlButton_SetSplitInfo($hButton_ChgBGColor, -1, $BCSS_NOSPLIT)

Global Const $idButton_ChgFGColor = GUICtrlCreateButton("", 5 * $iStartx + 4 * $iBtnWidth + 92, $iStarty + 12, 40, 18, $iStyle)
Global Const $hButton_ChgFGColor = GUICtrlGetHandle($idButton_ChgFGColor)
Global Const $sButton_ChgFGColorNN = _WinAPI_GetClassName($hButton_ChgFGColor) & _GetNN($hButton_ChgFGColor)
_GUICtrlButton_SetSplitInfo($hButton_ChgFGColor, -1, $BCSS_NOSPLIT)

Global Const $idButton_ChgFont = GUICtrlCreateButton("...", 5 * $iStartx + 4 * $iBtnWidth + 92, $iStarty + 34, 40, 18, $BS_TOP)
Global Const $hButton_ChgFont = GUICtrlGetHandle($idButton_ChgFont)
Global Const $sButton_ChgFontNN = _WinAPI_GetClassName($hButton_ChgFont) & _GetNN($hButton_ChgFont)

Global $hImage_BG = _GUIImageList_Create(14, 10, 5, 3)
Global $hBmp_BG = _WinAPI_CreateSolidBitmap($hButton_ChgBGColor, $iBGColor, 14, 10)
_GUIImageList_Add($hImage_BG, $hBmp_BG)
_GUICtrlButton_SetImageList($hButton_ChgBGColor, $hImage_BG, 1)

Global $hImage_FG = _GUIImageList_Create(14, 10, 5, 3)
_GUIImageList_Add($hImage_FG, _WinAPI_CreateSolidBitmap($hButton_ChgFGColor, $iFGColor, 14, 10))
_GUICtrlButton_SetImageList($hButton_ChgFGColor, $hImage_FG, 1)

Global $hBitmap = CreateCaretBitmap()
Global $aBlinkTime = DllCall('user32.dll', 'int', 'GetCaretBlinkTime')
Global $iBlinkTime_save = $aBlinkTime[0]
Global $iBlinkTime = Int($aBlinkTime[0] * 0.9)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

_GUICtrlEdit_AppendText($hEdit, $sCMDLine & ">")
GUISetIcon(@SystemDir & "\cmd.exe", 0, $hGUI)
;~ ControlClick("", "", $idEdit)
Global $aCaretPos[2], $sFile, $aFont
Global $hEditWndProc = DllCallbackRegister("EditWndProc", "lresult", "hwnd;uint;wparam;lparam")
Global $hOldEditProc = _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, DllCallbackGetPtr($hEditWndProc))

$aCaretPos = GetCaretPos()

Global Const $WM_DROPFILES = 0x0233
;~ DllCall('user32.dll', 'int', 'SetCaretPos', 'int', $aCaretPos[0] + 100, 'int', $aCaretPos[1])
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")

Do
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $idButton_Exit
                        GUIRegisterMsg($WM_DROPFILES, "")
                        GUIRegisterMsg($WM_COMMAND, "")
                        _WinAPI_DeleteObject($hBmp_BG)
                        _GUIImageList_Destroy($hImage_BG)
                        _GUIImageList_Destroy($hImage_FG)
                        _WinAPI_DeleteObject($hBitmap)
                        _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $hOldEditProc)
                        DllCallbackFree($hEditWndProc)
                        DllCall('user32.dll', 'int', 'SetCaretBlinkTime', 'uint', $iBlinkTime_save)
                        _GDIPlus_Shutdown()
                        GUIDelete()
                        Exit
                Case $idButton_Dir
                        If ControlGetFocus($hGUI) <> $sButton_DirNN Then ContinueCase
                        SendCommand2CMD("dir")
                Case $idButton_IPC
                        If ControlGetFocus($hGUI) <> $sButton_IPCNN Then ContinueCase
                        SendCommand2CMD("ipconfig")
                Case $idButton_Ping
                        If ControlGetFocus($hGUI) <> $sButton_PingNN Then ContinueCase
                        SendCommand2CMD("ping www.autoitx.com -n 10")
                Case $idButton_RunBatch
                        If ControlGetFocus($hGUI) <> $sButton_RunBatchNN Then ContinueCase
                        $sFile = FileOpenDialog("选择你想执行的批处理文件", "", "Bat文件(*.cmd; *.bat)", 3, "", $hGUI)
                        If @error Then
                                MsgBox(64, "信息", "已终止", 5, $hGUI)
                                ContinueCase
                        EndIf
                        SendCommand2CMD($sFile)
                Case $idButton_ChgBGColor
                        If ControlGetFocus($hGUI) <> $sButton_ChgBGColorNN Then ContinueCase
                        ChooseColorBG($hGUI, $hButton_ChgBGColor, $aPalette, $hImage_BG, "BG")
                Case $idButton_ChgFGColor
                        If ControlGetFocus($hGUI) <> $sButton_ChgFGColorNN Then ContinueCase
                        ChooseColorBG($hGUI, $hButton_ChgFGColor, $aPalette, $hImage_FG, "FG")
                Case $idButton_ChgFont
                        If ControlGetFocus($hGUI) <> $sButton_ChgFontNN Then ContinueCase
                        $aFont = _ChooseFont($sFont, 10, 0, 600, False, False, False, $hGUI)
                        If @error Then ContinueLoop
                        GUICtrlSetFont($idEdit, $aFont[3], $aFont[4], $aFont[1], $aFont[2], 5)
                        ControlFocus($hGUI, "", $idEdit)
        EndSwitch
Until False

Func ChooseColorBG($hGUI, $hControl, ByRef $aPalette, $hImageList, $xG)
        GUISetState(@SW_DISABLE, $hGUI)
        Local $aCtrlPos = MouseGetPos()
        Local Const $iUB = UBound($aPalette) - 1, $iWX = 4, $iWY = 5
        Local Const $dx = 4, $dy = 4, $iSizeW = 24, $iSizeH = 24
        Local $iW = $iWX * ($iSizeW + $dx) - $dx, $iH = $iWY * ($iSizeH + $dy) - $dy + 45
        Local $iX = $aCtrlPos[0] - $dx, $iY = $aCtrlPos[1] - $dy
        If ($iX + $iW) > $aFullScreen[2] Then $iX -= $iW - $dx * 2
        If ($iY + $iH) > $aFullScreen[3] Then $iY -= $iH - $dy * 2
        Local Const $hGUI_Color = GUICreate("", $iW, $iH, $iX, $iY, $WS_POPUP, $WS_EX_DLGMODALFRAME, $hGUI)
        Local Const $idButton_CC = GUICtrlCreateButton("更多", $iW / 2 - 30, $iWY * ($iSizeH + $dy) + 5, 60, 30)
        Local $x, $y, $z
        Local $aCLabels[$iUB]
        While $z < $iUB
                $aCLabels[$z] = GUICtrlCreateLabel("", $x * ($iSizeW + $dx), $y * ($iSizeH + $dy), $iSizeW, $iSizeH, $SS_SUNKEN)
                GUICtrlSetBkColor($aCLabels[$z], $aPalette[$z])
                $x = Mod($x + 1, $iWX)
                If Not $x Then $y += 1
                $z += 1
        WEnd
        Local Const $min = $aCLabels[0], $max = $aCLabels[0] + UBound($aCLabels) - 1
        GUISetState(@SW_SHOW, $hGUI_Color)
        Local $aInfo, $c
        Do
                Switch GUIGetMsg()
                        Case $GUI_EVENT_CLOSE
                                ExitLoop
                        Case $idButton_CC
                                $c = _ChooseColor(2, 0, 2, $hGUI_Color)
                                If @error Then ContinueLoop
                                $aPalette[$iUB] = "0x" & Hex($c, 6)
                                ChangeColor($max + 1, $min, $hControl, $hImageList, $xG)
                                ExitLoop
                EndSwitch
                $aInfo = GUIGetCursorInfo($hGUI_Color)
                Switch $aInfo[2]
                        Case 1
                                If $aInfo[4] >= $min And $aInfo[4] <= $max Then
                                        ChangeColor($aInfo[4], $min, $hControl, $hImageList, $xG)
                                        ExitLoop
                                EndIf
                EndSwitch
        Until False
        GUISetState(@SW_ENABLE, $hGUI)
        GUIDelete($hGUI_Color)
        ControlFocus($hGUI, "", $idEdit)
EndFunc   ;==>ChooseColorBG

Func ChangeColor($iID, $min, $hControl, $hImageList, $xG)
        _GUIImageList_Remove($hImageList)
        _WinAPI_DeleteObject($hBmp_BG)
        Local Const $iColor = $aPalette[$iID - $min]
        $hBmp_BG = _WinAPI_CreateSolidBitmap($hControl, $iColor, 14, 10)
        _GUIImageList_Add($hImageList, $hBmp_BG)
        _GUICtrlButton_SetImageList($hControl, $hImageList, 1)
        If $xG = "BG" Then
                GUICtrlSetBkColor($idEdit, $iColor)
        Else
                GUICtrlSetColor($idEdit, $iColor)
                _WinAPI_DeleteObject($hBitmap)
                $hBitmap = CreateCaretBitmap(9, 14, "0xFF" & Hex($iColor, 6))
        EndIf
EndFunc   ;==>ChangeColor

Func SendCommand2CMD($sCommand)
        ControlFocus($hGUI, "", $idEdit)
        ControlSend($hGUI, "", $idEdit, $sCommand & @LF)
EndFunc   ;==>SendCommand2CMD

Func EditWndProc($hWnd, $iMsg, $wParam, $lParam)
        Switch $iMsg
                Case $WM_KEYDOWN
                        Switch $wParam
                                Case 0x25 
                                        $aCaretPos = GetCaretPos()
                                        If ($aCaretPos[0] / 9) <= $iPrefixLen Then
                                                DllCall('user32.dll', 'int', 'SetCaretPos', 'int', $aCaretPos[0] + 1, 'int', $aCaretPos[1])
                                                $aCaretPos = GetCaretPos()
                                                Return 1
                                        EndIf
                                Case 0x0D 
                                        Local $sCMD = StringMid(_GUICtrlEdit_GetLine($hEdit, _GUICtrlEdit_LineFromChar($hEdit)), $iPrefixLen + 1)
                                        If $sCMD <> "" Then
                                                ExecuteCMDRT($sCMD)
                                                $sCMDLine = StringReplace(ExecuteCMD("cd"), @CRLF, "")
                                                ExecuteCMD("cd /d " & $sCMDLine)
                                        EndIf
                                        $iPrefixLen = StringLen($sCMDLine & ">")
                                        _GUICtrlEdit_AppendText($hEdit, $sCMDLine & ">")
                                        _GUICtrlEdit_SetSel($hEdit, -1, -1)
                                        _GUICtrlEdit_Scroll($hEdit, $SB_SCROLLCARET)
                                        $aCaretPos = GetCaretPos()
                                        Sleep(30)
                                        Return 1
                                Case 0x08, 0x24, 0x26, 0x28 
                                        If _GUICtrlEdit_LineLength($hEdit) < $iPrefixLen Then
                                                _GUICtrlEdit_AppendText($hEdit, ">")
                                                $aCaretPos = GetCaretPos()
                                        EndIf
                                        Return 1
                        EndSwitch
                Case $WM_LBUTTONDOWN
                        DllCall('user32.dll', 'int', 'SetCaretPos', 'int', $aCaretPos[0], 'int', $aCaretPos[1])
                        Return 1
        EndSwitch
        Return _WinAPI_CallWindowProc($hOldEditProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>EditWndProc

Func GetCaretPos() ;http://msdn.microsoft.com/en-us/library/ms648402(v=vs.85).aspx
        Local Const $Point = "LONG x;LONG y;"
        Local $sPoint = DllStructCreate($Point)
        DllCall("User32.dll", "int", "GetCaretPos", "ptr", DllStructGetPtr($sPoint))
        Local $aPos[2] = [DllStructGetData($sPoint, "x") - 1, DllStructGetData($sPoint, "y")]
        Return $aPos
EndFunc   ;==>GetCaretPos

Func ExecuteCMDRT($sCommand)
        Local $iPID, $line
        If StringMid($sCommand, 2, 1) = ":" Then
                $iPID = Run(@ComSpec & ' /c "' & $sCommand & '"', StringRegExpReplace($sCommand, "(.+\\)(.*)", "$1"), @SW_HIDE, $STDERR_MERGED) ;set working dir to path of file
        Else
                $iPID = Run(@ComSpec & ' /c "' & $sCommand & '"', $sCMDLine, @SW_HIDE, $STDERR_MERGED)
        EndIf
        While 1
                $line = StdoutRead($iPID)
                If @error Then ExitLoop
                _GUICtrlEdit_AppendText($hEdit, Oem2Ansi($line))
        WEnd
        _GUICtrlEdit_AppendText($hEdit, @CRLF)
EndFunc   ;==>ExecuteCMDRT

Func ExecuteCMD($sCommand)
        Local $iPID = Run(@ComSpec & ' /c "' & $sCommand & '"', $sCMDLine, @SW_HIDE, $STDERR_MERGED)
        Local $line
        While 1
                $line &= StdoutRead($iPID)
                If @error Then ExitLoop
        WEnd
        Return Oem2Ansi($line)
EndFunc   ;==>ExecuteCMD

Func Oem2Ansi($Text)
        Local $aText = DllCall("user32.dll", "Int", "OemToChar", "str", $Text, "str", "")
        Return $aText[2]
EndFunc   ;==>Oem2Ansi

Func CreateCaretBitmap($iW = 9, $iH = 14, $iColor = 0xFFC0C0C0)
        Local Const $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
        Local Const $hBitmap = $aResult[6]
        Local Const $hCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        Local Const $hBrush = _GDIPlus_BrushCreateSolid($iColor)
        _GDIPlus_GraphicsFillRect($hCtx, 0, $iH - 3, $iW, $iH, $hBrush)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_GraphicsDispose($hCtx)
        Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBitmap
EndFunc   ;==>CreateCaretBitmap

Func WM_DROPFILES($hWnd, $msg, $wParam, $lParam)
        Local $aRet = DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", -1, "ptr", 0, "int", 0)
        If @error Then Return SetError(1, 0, 0)
        Local $tBuffer = DllStructCreate("char[256]")
        DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", 0, "ptr", DllStructGetPtr($tBuffer), "int", DllStructGetSize($tBuffer))
        Local Const $sDroppedFiles = DllStructGetData($tBuffer, 1)
        _GUICtrlEdit_AppendText($hEdit, $sDroppedFiles)
        $aCaretPos = GetCaretPos()
        DllCall("shell32.dll", "none", "DragFinish", "int", $wParam)
        $tBuffer = 0
        WinActivate($hWnd)
        Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_DROPFILES

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Switch BitShift($wParam, 16)
                Case $EN_SETFOCUS
                        DllCall('user32.dll', 'int', 'CreateCaret', 'hwnd', $lParam, 'ptr', $hBitmap, 'int', 0, 'int', 0)
                        DllCall('user32.dll', 'int', 'ShowCaret', 'hwnd', $lParam)
                        DllCall('user32.dll', 'int', 'SetCaretBlinkTime', 'uint', $iBlinkTime)
                        $aBlinkTime = DllCall('user32.dll', 'int', 'GetCaretBlinkTime')
                        $iBlinkTime = $aBlinkTime[0]
                Case $EN_KILLFOCUS
                        DllCall('user32.dll', 'int', 'HideCaret', 'hwnd', $lParam)
                        DllCall('user32.dll', 'int', 'DestroyCaret')
                        DllCall('user32.dll', 'int', 'SetCaretBlinkTime', 'uint', $aBlinkTime[0])
        EndSwitch
        Return "GUI_RUNDEFMSG"
EndFunc   ;==>WM_COMMAND

Func _GetNN($hWnd)
        Local $List, $Text, $ID = 0
        $Text = _WinAPI_GetClassName($hWnd)
        If Not $Text Then
                Return -1
        EndIf
        $List = _WinAPI_EnumChildWindows(_WinAPI_GetAncestor($hWnd, $GA_ROOT), 0)
        If @error Then
                Return -1
        EndIf
        For $i = 1 To $List[0][0]
                If $List[$i][1] = $Text Then
                        $ID += 1
                EndIf
                If $List[$i][0] = $hWnd Then
                        ExitLoop
                EndIf
        Next
        If Not $ID Then
                Return -1
        EndIf
        Return $ID
EndFunc   ;==>_GetNN

Func _WinAPI_EnumChildWindows($hWnd, $fVisible = 1)
        If Not _WinAPI_GetWindow($hWnd, 5) Then
                Return SetError(1, 0, 0)
        EndIf
        Local $hEnumProc = DllCallbackRegister('__EnumWindowsProc', 'int', 'hwnd;lparam')
        Dim $__Enum[101][2] = [[0]]
        DllCall('user32.dll', 'int', 'EnumChildWindows', 'hwnd', $hWnd, 'ptr', DllCallbackGetPtr($hEnumProc), 'lparam', $fVisible)
        If (@error) Or (Not $__Enum[0][0]) Then
                $__Enum = 0
        EndIf
        DllCallbackFree($hEnumProc)
        If Not IsArray($__Enum) Then
                Return SetError(1, 0, 0)
        EndIf
        __Inc($__Enum, -1)
        Return $__Enum
EndFunc   ;==>_WinAPI_EnumChildWindows

Func __EnumWindowsProc($hWnd, $fVisible)
        If ($fVisible) And (Not _WinAPI_IsWindowVisible($hWnd)) Then
                Return 1
        EndIf
        __Inc($__Enum)
        $__Enum[$__Enum[0][0]][0] = $hWnd
        $__Enum[$__Enum[0][0]][1] = _WinAPI_GetClassName($hWnd)
        Return 1
EndFunc   ;==>__EnumWindowsProc

Func __Inc(ByRef $aData, $iIncrement = 100)
        Select
                Case UBound($aData, 2)
                        If $iIncrement < 0 Then
                                ReDim $aData[$aData[0][0] + 1][UBound($aData, 2)]
                        Else
                                $aData[0][0] += 1
                                If $aData[0][0] > UBound($aData) - 1 Then
                                        ReDim $aData[$aData[0][0] + $iIncrement][UBound($aData, 2)]
                                EndIf
                        EndIf
                Case UBound($aData, 1)
                        If $iIncrement < 0 Then
                                ReDim $aData[$aData[0] + 1]
                        Else
                                $aData[0] += 1
                                If $aData[0] > UBound($aData) - 1 Then
                                        ReDim $aData[$aData[0] + $iIncrement]
                                EndIf
                        EndIf
                Case Else
                        Return 0
        EndSelect
        Return 1
EndFunc   ;==>__Inc


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +40 收起 理由
zldfsz + 10
haijie1223 + 30

查看全部评分

发表于 2013-3-21 22:07:08 | 显示全部楼层
controlsend
 楼主| 发表于 2013-3-21 23:05:44 | 显示全部楼层
回复 2# 星雨朝霞

这种方式倒是可以解决发送的问题,第二点如何获得返回值呢?
$sRtn = ControlSend("C:\WINDOWS\system32\CMD.exe", "", "", "ipconfig" & @CRLF)
ConsoleWrite("sRtn is " & $sRtn & @CRLF)
   
(注:这里的cmd命令以ipconfig举例,并不意味着我需要ipconfig的返回值,实际用的不是ipconfig)
 楼主| 发表于 2013-3-23 00:58:00 | 显示全部楼层
回复 4# zhao_ming


不叫dos吧? 就是cmd窗口,运行输入cmd运行的窗体
发表于 2013-3-23 11:04:55 | 显示全部楼层
用@ComSpec 不可以吗?
发表于 2013-3-23 13:32:02 | 显示全部楼层
dos返回值怎么解
发表于 2013-3-23 17:34:12 | 显示全部楼层
回复 7# 烟雨


StdoutRead()
发表于 2013-3-23 18:15:56 | 显示全部楼层
回复 8# jwchen119


    给力
发表于 2013-3-23 19:55:33 | 显示全部楼层
回复  烟雨


StdoutRead()
jwchen119 发表于 2013-3-23 17:34


正解,就是这个命令.
 楼主| 发表于 2013-3-25 01:02:37 | 显示全部楼层
回复 8# jwchen119

试了,不行,求源码
发表于 2013-3-25 09:34:53 | 显示全部楼层
#include <Constants.au3>

Local $data = Run(@ComSpec & " /c ipconfig", "", @SW_HIDE, $STDOUT_CHILD)
Local $wert
While 1
    $wert &= StdoutRead($data)
    If @error Then ExitLoop
        MsgBox(0, "STDOUT read:", $wert)
WEnd
 楼主| 发表于 2013-3-26 00:27:19 | 显示全部楼层
回复 12# jwchen119

我要实现的结构是这样的:
      cmd_A
      other_A
      cmd_B

比如,cmd_A为  path d:\tempA;%path%
         cmd_B为  path d:\tempB;%path%
预期的path应该为 d:\tempA;d:\tempb;%path%, 而通过两次Run(@ComSpec & " /c path...", "", @SW_HIDE, $STDOUT_CHILD)是达不到这样的预期的。这是因为这两次调用,cmd_A产生的效果没用应用到cmd_B,而是重新一个新的环境。

注:我这里只是拿path举例,实际中并不是用path。 只是说明这种实现cmd_A作用的效果不会继承到cmd_B。
      other_A是一个和cmd窗体无关的操作。
发表于 2013-3-26 08:49:59 | 显示全部楼层
回复 13# mbdnmt
其實我還是不太懂你要的效果, 我的認知是你想要執行 d:\tempA 後用 StdoutRead() 讀取資料後再用
ControlSend() 傳送資料調用 d:\tempB, 我比較不了解的是為何要有 cmd_A 和 cmd_B?
 楼主| 发表于 2013-3-28 23:43:15 | 显示全部楼层
回复 2# 星雨朝霞


我发现ControlSend是不可靠的,如果在后台发送的过程中按了Ctrl、Alt或者Shift键,发送就会受影响。并且要合理设置Opt的KeyDelay和KeyDownDelay,快了不可靠,可靠了太浪费实现。。。
 楼主| 发表于 2013-3-29 00:59:55 | 显示全部楼层
回复 15# mbdnmt

目前找到的最好的方法是:

#include "PostMessage_UDF.au3"

调用     _SendText

例如:
_SendText(HWnd(0x002604E6),"ping 192.168.1.1" & @CRLF)
_SendText(HWnd(0x002604E6),"ping www.smth.org" & @CRLF)

UDF下载路径:http://www.autoitx.com/forum.php ... id=37836&extra=
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 10:34 , Processed in 0.083479 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表