Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Работа в скрытом окне

Ответить
Настройки темы
[решено] Работа в скрытом окне

Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Здравствуйте!
Скажите пожалуйста, можно ли скрыть определённое окно программы, потом ему выслать комбинацию CTRL+S, ввести путь и нажать сохранить?
Пробовал так:
Код: Выделить весь код
WinWait("test")
WinSetState("test", "", @SW_HIDE)
ControlSend("test", "", "", "^s")
ControlSend("test", "", "Edit", "[ИМЯ_ФАЙЛА]")
ControlClick("Сохранить как", "", "Со&хранить")
WinSetState("test", "", @SW_SHOW)
Но не работает после отсылки кмбинации ктрл+S окно активируется и ничего не происходит.

-------
Хочу научиться писать драйвера на с++


Отправлено: 00:38, 16-03-2009

 

Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


пример:
Код: Выделить весь код
#region: - Option
    Opt('MustDeclareVars',      1)
    Opt('TrayIconDebug',        1)
    Opt('TrayIconHide',         0)
    Opt('SendKeyDelay',         1)
#endregion

#region: - Global
    Global  $iPid, $hHwd
#endregion

$iPid = Run('notepad.exe', '', @SW_HIDE)
While 1
    $hHwd = _ProcessGetWindow($iPid, 1)
    If IsHWnd($hHwd) Then ExitLoop
WEnd
ConsoleWrite($hHwd & @CRLF)
;~ MsgBox(0, '', $hHwd)

ControlSetText($hHwd, '', '[CLASS:Edit; INSTANCE:1]', 'Новый текст')
ControlSend($hHwd, '', '[CLASS:Edit; INSTANCE:1]', '^s')
Sleep(500)
WinSetState($hHwd, '', @SW_SHOW)

MsgBox(64, 'Внимание', 'Пока окно было сркыто, ему была высланна строка текста и комбинация Ctrl+S')

ProcessClose($iPid)

Func _ProcessGetWindow($iPID, $iRet=-1)
    Local $aWinList = WinList()
    Local $aRet[2]

    If IsString($iPID) Then $iPID = ProcessExists($iPID)

    For $i = 1 To UBound($aWinList)-1
        If WinGetProcess($aWinList[$i][1]) = $iPID Then
            $aRet[0] = $aWinList[$i][0] ;Title
            $aRet[1] = $aWinList[$i][1] ;WinHandle

            If $iRet = 0 Then Return $aRet[0]
            If $iRet = 1 Then Return $aRet[1]

            Return $aRet
        EndIf
    Next

    Return SetError(1, 0, $aRet)
EndFunc

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 04:00, 16-03-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


proxy, спасибо но есть один косячок, не знаю как отловить окно сохранить как... После высылки ктрл+S скрипт не может завершить сохранение.

-------
Хочу научиться писать драйвера на с++


Отправлено: 13:12, 16-03-2009 | #3


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


Обычно в текстовых редакторах комбинация CTRL+S отвечает, за простое сохранение в открытом окне... А на появление окна Сохранить как, назначено другое сочетание клавиш, вот у меня попробовал 4 программы и только в Опере при нажатии на CTRL+S выскакивает окно Сохранить как... Поэтому хоть название программы дай, в которой нужно такое проделать...

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Отправлено: 17:31, 16-03-2009 | #4


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


beve, Дак вообщето в томже блокноте если его открыть через run=>notepad.exe, а не открыть файл тогда он выдаёт окно сохранить как, т.к. куда ему сохранять?

-------
Хочу научиться писать драйвера на с++


Отправлено: 18:16, 16-03-2009 | #5


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


кстати:
Цитата:
После высылки ктрл+S скрипт не может завершить сохранение.
.....в том скрипте он и не сохранял )))) просто открывал окошко сохранения и потом убивал весь процесс,
благополучно со всеми окнами сохранения )))))

самый просто пример как отследить окошко "Сохранить как":
Код: Выделить весь код
#region: - Option
    Opt('MustDeclareVars',      1)
    Opt('TrayIconDebug',        1)
    Opt('TrayIconHide',         0)
    Opt('SendKeyDelay',         1)
#endregion

#region: - Global
    Global  $iMainWinPid, $hMainWinHwd
    Global  $hSaveAsWinHwd
#endregion

;~ $iMainWinPid = Run('notepad.exe')
$iMainWinPid = Run('notepad.exe', '', @SW_HIDE)
While 1
    $hMainWinHwd = _ProcessGetWindow($iMainWinPid, 1)
    If IsHWnd($hMainWinHwd) Then ExitLoop
WEnd

ControlSetText($hMainWinHwd, '', '[CLASS:Edit; INSTANCE:1]', 'Новый текст 1')
ControlSend($hMainWinHwd, '', '[CLASS:Edit; INSTANCE:1]', '^s')

While 1
    $hSaveAsWinHwd = WinGetHandle('[ACTIVE]')
    If ControlGetText($hSaveAsWinHwd, 'Текстовые документы (*.txt)', '[CLASS:Edit; INSTANCE:1]') == '*.txt' Then
        WinSetState($hSaveAsWinHwd, '', @SW_HIDE)
        ControlSetText($hSaveAsWinHwd, 'Текстовые документы (*.txt)', '[CLASS:Edit; INSTANCE:1]', 'new file.txt')
        ControlClick($hSaveAsWinHwd, 'Текстовые документы (*.txt)', '[CLASS:Button; INSTANCE:2]')
        ExitLoop
    EndIf
WEnd

Sleep(50)

$hSaveAsWinHwd = WinGetHandle('[ACTIVE]')
If ControlGetText($hSaveAsWinHwd, '&Да', '[CLASS:Button; INSTANCE:1]') == '&Да' Then
    WinSetState($hSaveAsWinHwd, '', @SW_HIDE)
    ControlClick($hSaveAsWinHwd, '&Да', '[CLASS:Button; INSTANCE:1]')
EndIf

WinSetState($hMainWinHwd, '', @SW_SHOW)

MsgBox(64,  'Внимание', 'Пока окно было сркыто:' & @CRLF & _
            '- ему был высланна строка текста:' & @TAB & 'Новый текст 1' & @CRLF & _
            '- ему был высланна комбинация:' & @TAB & 'Ctrl+S' & @CRLF & _
            '- файлы был сохранен под иминем:' & @TAB & 'new file.txt' & @CRLF & _
            '- файл был сохранен с заменой файлов' & @CRLF & @CRLF & _
            'Сейчас это окно будет закрыто')

ProcessClose($iMainWinPid)

Func _ProcessGetWindow($iMainWinPid, $iRet=-1)
    Local $aWinList = WinList()
    Local $aRet[2]

    If IsString($iMainWinPid) Then $iMainWinPid = ProcessExists($iMainWinPid)

    For $i = 1 To UBound($aWinList)-1
        If WinGetProcess($aWinList[$i][1]) = $iMainWinPid Then
            $aRet[0] = $aWinList[$i][0] ;Title
            $aRet[1] = $aWinList[$i][1] ;WinHandle

            If $iRet = 0 Then Return $aRet[0]
            If $iRet = 1 Then Return $aRet[1]

            Return $aRet
        EndIf
    Next

    Return SetError(1, 0, $aRet)
EndFunc
ребята правильно подметели, если нужно именно окно "Сохранить как", которое не вызывается комбинацией Ctrl+S,
то тут нужно разбираться непосредственно с окном. К примеру можно кликнуть на кнопочку на панели Tool bar,
если там есть конечно нужная.

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:37, 16-03-2009 | #6


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


С блокнотом работает и ещё с несколькими программами, а вот с этой не хочет. Помогите пожалуйста, хоть разберусь.

-------
Хочу научиться писать драйвера на с++


Отправлено: 22:12, 16-03-2009 | #7


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


хитрая прожка....лучше не получилось:

Код: Выделить весь код
#region: - Option
    Opt('MustDeclareVars',      1)
    Opt('TrayIconDebug',        1)
    Opt('TrayIconHide',         0)
    Opt('SendKeyDelay',         1)
    Opt('WinDetectHiddenText',  1)
    Opt('WinSearchChildren',    1)
#endregion

#region: - Global
    Global  $sFilePath = 'C:\Program Files\Multi Password Recovery\MPR.exe'
    Global  $iMainWinPid, $hMainWinHwd
    Global  $sWarningText = 'Attention! Saving all recovered passwords to a single file is insecure.'
    Global  $sFileSaveName = 'mpf_save.mpf'
#endregion

;~ ==>отладка
;~ $iMainWinPid = Run($sFilePath)
;~ Sleep(2000)
;~ WinSetState('Multi Password Recovery v.1.0.5', '', @SW_SHOW)
;~ WinMove('Multi Password Recovery v.1.0.5', '', @DesktopWidth-700, @DesktopHeight-700)
;~ Exit
;~ <==отладка

HotKeySet('!{ESC}', '_Pro_Exit')

;~ таймер, закрывает скрипт через 2 минуты:
AdlibEnable('_Pro_Exit', 1000*60*2)

If ProcessExists('MPR.exe') Then
    ProcessClose('MPR.exe')
    ProcessWaitClose('MPR.exe')
EndIf

$iMainWinPid = Run($sFilePath)
WinWait('Multi Password Recovery v.1.0.5')
;~ WinMove('Multi Password Recovery v.1.0.5', '', @DesktopWidth+100, @DesktopHeight+100); не работает
;~ WinSetState('Multi Password Recovery v.1.0.5', '', @SW_HIDE); не работает

While 1
    If WinExists('Multi Password Recovery v.1.0.5', 'Scan finished') Then
        WinSetState('Multi Password Recovery v.1.0.5', 'Scan finished', @SW_HIDE)
        ControlSend('Multi Password Recovery v.1.0.5', '', '[CLASS:TTreeView; INSTANCE:1]', '^s')
    EndIf

    If WinExists('Warning', $sWarningText) Then
        WinSetState('Warning', $sWarningText, @SW_HIDE)
        ControlCommand('Warning', $sWarningText, '[CLASS:TCheckBox; INSTANCE:1]', 'Check')
        WinClose('Warning', $sWarningText)
    EndIf

    If WinExists('Сохранить как', 'Password files (*.mpf)') Then
        WinSetState('Сохранить как', 'Password files (*.mpf)', @SW_HIDE)
        ControlSetText('Сохранить как', 'Password files (*.mpf)', '[CLASS:Edit; INSTANCE:1]', $sFileSaveName)
        ControlClick('Сохранить как', 'Password files (*.mpf)', '[CLASS:Button; INSTANCE:2]')
    EndIf

    If WinExists('Сохранить как', $sFileSaveName & ' уже существует') Then
        WinSetState('Сохранить как', $sFileSaveName & ' уже существует', @SW_HIDE)
        ControlClick('Сохранить как', $sFileSaveName & ' уже существует', '[CLASS:Button; INSTANCE:1]')
    EndIf

    If WinExists('OK', 'File saved') Then
        WinSetState('OK', 'File saved', @SW_HIDE)
        ControlClick('OK', 'File saved', '[CLASS:Button; INSTANCE:1]')
        ExitLoop
    EndIf

    Sleep(10)
WEnd

_Pro_Exit()

Func _Pro_Exit()
    ProcessClose($iMainWinPid)
    Exit
EndFunc

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:21, 17-03-2009 | #8


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


При запуске, MPR создает дочерное окно, которое и отображает GUI.
Стандартными средствми скрыть основное окно, а соответсвенно и кнопку с панели задач не удалось,
ни Run со флагом @SW_HIDE, ни WinSetState с параметром @SW_HIDE - не помогли.
Если же сразу после запуска сркыть или переметсить за область видимости
дочерное окно, которое отображает GUI, то скрипт не сработает, так
как элементы и данные в дочерном GUI окне НЕ ОБНОВЛЯЮТСЯ,
т.е. к примеру так и не появиться надпись "Scan finished" в статус баре...

п.с. в таком виде все работает ок, думаю если не применять такой сценарий
для вредноносных целей, то сойдет )))

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 04:26, 17-03-2009 | #9


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


proxy, спасибо огромное, а я то думал что я криво сделал. А оказывается
Цитата proxy:
хитрая прожка... »

-------
Хочу научиться писать драйвера на с++


Отправлено: 10:20, 17-03-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Работа в скрытом окне

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] _IECreate("Url", Default, 0) Узнать процент загрузки страницы при скрытом окне IE FlatX007 AutoIt 2 13-10-2009 12:05
Разное - [решено] Папки открываются в новом окне! ra_mc Microsoft Windows Vista 9 17-05-2009 17:52
Интерфейс - [решено] Диски открываются в новом окне... atax Microsoft Windows 2000/XP 2 07-05-2009 00:19
Установка - [Хелп] Слетела VISTA из-за XP и требует диск, но все внутри в скрытом spaxy Microsoft Windows Vista 29 27-04-2008 12:36
[решено] Папки открываются в новом окне PCYuriy Microsoft Windows 2000/XP 10 13-07-2006 12:31




 
Переход