Что нового

Как послать ctrl+c в окно cmd

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Добрый день!
Пишу скрипт для формирования команды для старта/стопа видеозаписи
Код:
Opt("TrayMenuMode", 1 + 2)
TraySetToolTip("Видеозапись (Ver-1)")
TraySetIcon("shell32.dll", "246")
$k=0
While 1
    If WinExists ("Окно", "Завершить") Or WinExists ("Безы") Then
        If $k = 0 Then
            $k = 1
            $iReturn = Run('rec.bat', "", @SW_HIDE)
            MsgBox (0, "", $iReturn, 1)
            TraySetState (4)
        EndIf
    Else
        $k = 0
        TraySetState (8)
    EndIf
    Sleep (500)
WEnd

После "Else" необходимо выслать команду CTRL+C в CMD окно которое запущено чуть ранее (Run('rec.bat', "", @SW_HIDE)).
На этом и застрял.
Командой типа
Send("^c") - не получается
Помогите советом/командой :smile:
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Send("^c") - не получается
Чтобы получилось, окно нужно активировать. Даже если оно скрыто.

Или так без активации
Код:
ControlSend("[Class:ConsoleWindowClass]", "", "", "^c")
Раскладка клавиатуры в обоих случаях, естественно, должна быть английская.
Сообщение автоматически объединено:

А что, батник на AutoIt нельзя переписать?
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
в моем понятии нет, ибо автоит же синхронный. если я внутри скрипта автоита сформирую команду "старт записи"
(она выглядит примерно так:
ffmpeg -f dshow -s 640x480 -i video="Microsoft LifeCam VX-800" -r 30 out.mp4)
то как далее я буду ловить маркер на команду стоп?
Сейчас (видно из скрипта) я опрашиваю наличие окна, пропадание которого и будет являться признаком "стопа" который пошлется в СМД окно
Сообщение автоматически объединено:

что то я в трех соснах заблудился!!!
Код:
Opt("TrayMenuMode", 1 + 2)
TraySetToolTip("Видеозапись (Ver-1)")
TraySetIcon("shell32.dll", "246")

$k=0

While 1
    If WinExists ("Окно", "Завершить") Or WinExists ("Безы") Then
        If $k = 0 Then
            $k = 1
            $iReturn = Run('rec.bat', "", @SW_MINIMIZE)
            MsgBox (0, "", $iReturn, 1)
            TraySetState (4)
        EndIf
    Else
        $k = 0
        WinSetState ("C:\Windows\system32\cmd.exe", "", @SW_MAXIMIZE)
        TraySetState (8)
        WinActivate ("C:\Windows\system32\cmd.exe")
        WinWaitActive ("C:\Windows\system32\cmd.exe", "", 1)
        ControlSend("C:\Windows\system32\cmd.exe", "", "", "^c")
    EndIf
    Sleep (500)

WEnd

По логике вроде все правильно, но не работает! Открывается окно СМД, как надо, после пропадания маркера - максимизируется, но не закрывается. При этом, если, при запущенном скрипте, просто запустить СМД, то его закроет (выкидывается правильная команда CTRL+C)
Где я тут туплю???
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
У меня ваш скрипт нормально работает при таком батнике
Код:
ping -t ya.ru
Главное не запускать скрипт с правами администратора.
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
После долгих экспериментов все стало еще менее понятно.
Исходная ситуация:

CMD файл (1.cmd) с содержанием:
c:\video\ffmpeg.exe -f dshow -s 640x480 -i video="USB Video Device" -r 15 -f dshow -i audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{098BF491-ADEA-4AD1-80F9-C5F5F0BFDBB1}" out.mp4
для простоты экспериментов пользую более простой аналог строки:
ping ya.ru -t

файл stop-1.au3
с содержанием:
ControlSend ("C:\Windows\system32\cmd.exe", "", "", '^c')

файл stop-2.au3
с содержанием:
ProcessClose("cmd.exe")

В итоге:
- когда просто (из проводника скажем), запускаю файл 1.cmd - начинается его выполнение (пока все по плану)
- выполняю файл stop-1 - происходит выдача CTRL+C в окно CMD - так и должно быть (процесс прерывается)
- выполняю stop-2 - происходит закрытие окна CMD - так и должно быть
ВСЕ ЗАМЕЧАТЕЛЬНО!!!

НО!!!!!!!!!!!
Если я пытаюсь запустить 1.cmd как им то образом из автоита:
- команда RUN - run("1.cmd")
- команда RUN - Run(@ComSpec & " /c " & '1.cmd', "", )
- шеллом - ShellExecute("1.cmd")
То после подобного запуска это окно никак не реагирует на работу stop-1 и stop-2

Что происходит? что не так делаю?
Как имитировать запуск 1.cmd как если бы я его руками запускал???

Пробовал сформировать некий промежуточный файл (cmd), который запустить, и который бы запустил 1.cmd, но этот вариант ничего не дает.

Помогите!!!!!!!!!! уже второй день бьюсь!!!!!!!!!!!!!!!!!!!!!!! вопрос то вроде простой, а нифига не получается!
Сообщение автоматически объединено:

У меня ваш скрипт нормально работает при таком батнике
Код:
ping -t ya.ru
Главное не запускать скрипт с правами администратора.
у меня ЭТО не проходит, хоть тресни!!!!!!!
 

tonycstech

Новичок
Сообщения
94
Репутация
3
необходимо выслать команду CTRL+C в CMD окно которое запущено чуть ранее (Run('rec.bat', "", @SW_HIDE)).
На этом и застрял.
Командой типа
Send("^c") - не получается
Помогите советом/командой :smile:

Для чего вам нужна такая комбинация, чтобы скопировать текст из окна rec.bat ?
Или вы как то хотите определённую часть текста в этом окне скопировать ?
Не совсем понятно что и как. Если можно, дайте пошаговое обьяснение происходющего и желаемого.
 
Верх