Что нового

Встраивание окна внешнего приложения в интерфейс GUI

mv6677

Новичок
Сообщения
105
Репутация
0
Приветствую всех.
Хочу задать вопрос насчет интерфейса.
Я где-то слышал, что в автоите можно встроить окна внешних приложений - в интерфейс.
И это удобно - эти несколько собранных в одном интерфейсе окон программ будут отображаться под одним ярлыком на панели задач, их можно разом закрыть, перетащить, свернуть и т.д.

Как создать такой составной интерфейс (кажется он называется GUI), в который было бы встроено два блокнота и калькулятор ?

Под двумя блокнотами имеются ввиду файлы 1.txt и 2.txt (в одной папке со скриптом), а под калькулятором - программа Calc.exe
( В общем скрипт просто открывает эти программы - так, что они отображаются - внутри GUI )

 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Вот простой пример. Доработайте под свои нужды
Код:
#include <WinAPISysWin.au3>

$hGUI = GUICreate("MultiProg", 800, 600, -1, -1, 0x00CF0000) ; $WS_OVERLAPPEDWINDOW
GUISetState()

Run("notepad.exe " & @ScriptDir & "\1.txt")
$hWnd1 = WinWaitActive("[class:Notepad]")
_WinAPI_SetParent($hWnd1, $hGUI)
WinMove($hWnd1, "", 0, 0, 400, 300)
$OldPos1 = WinGetPos($hWnd1)

Run("notepad.exe " & @ScriptDir & "\2.txt")
$hWnd2 = WinWaitActive("[class:Notepad]")
_WinAPI_SetParent($hWnd2, $hGUI)
WinMove($hWnd2, "", 0, 300, 400, 300)
$OldPos2 = WinGetPos($hWnd2)

Run("calc.exe")
$hWnd3 = WinWaitActive("Калькулятор")
_WinAPI_SetParent($hWnd3, $hGUI)
WinMove($hWnd3, "", 400, 0)
$OldPos3 = WinGetPos($hWnd3)

$OldActive = 0
AdlibRegister("Refresh")

Do
Until GUIGetMsg() = -3

Func Refresh()
  $NewActive = WinGetHandle("")
  If $NewActive <> $OldActive Then
    _WinAPI_InvalidateRect($hGUI)
    $OldActive = $NewActive
    Return
  EndIf
  $NewPos1 = WinGetPos($hWnd1)
  For $i = 0 To 3
    If $NewPos1[$i] <> $OldPos1[$i] Then
      _WinAPI_InvalidateRect($hGUI)
      $OldPos1 = $NewPos1
      Return
    EndIf
  Next
  $NewPos2 = WinGetPos($hWnd2)
  For $i = 0 To 3
    If $NewPos2[$i] <> $OldPos2[$i] Then
      _WinAPI_InvalidateRect($hGUI)
      $OldPos2 = $NewPos2
      Return
    EndIf
  Next
  $NewPos3 = WinGetPos($hWnd3)
  For $i = 0 To 3
    If $NewPos3[$i] <> $OldPos3[$i] Then
      _WinAPI_InvalidateRect($hGUI)
      $OldPos3 = $NewPos3
      Return
    EndIf
  Next
EndFunc
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
		
Opt('WinTitleMatchMode', 2)
Global $aOpen[3][2] = [[@ScriptDir & '\1.txt', '[TITLE:1.txt]'], _
        [@ScriptDir & '\2.txt', '[TITLE:2.txt]'], _
        [@SystemDir & '\calc.exe', '[TITLE:Калькулятор]']]
        
Global $hGUI = GUICreate('', -1, -1, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN), $WS_EX_CLIENTEDGE)

For $i = 0 To UBound($aOpen) - 1
    If ShellExecute($aOpen[$i][0], '', '', $SHEX_OPEN, @SW_HIDE) Then
        $hWnd = WinWait($aOpen[$i][1], '', 2)
        If $hWnd Then
            $aOpen[$i][1] = $hWnd
            _WinAPI_SetParent($hWnd, $hGUI)
        EndIf
    Else
        $aOpen[$i][1] = ''
    EndIf
Next

GUISetState(@SW_MAXIMIZE)

For $i = 0 To UBound($aOpen) - 1
    If $aOpen[$i][1] Then WinSetState($aOpen[$i][1], '', @SW_SHOW)
Next

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
xXx , ваш скрипт не работает.
Появляется пустое окно GUI, на котором ничего не отображается.


Добавлено:
Сообщение автоматически объединено:

InnI , ваш код не работает.

Выдает сообщение об ошибке:
"Error: Error opening the file."
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
xXx, у меня файлы 1.txt и 2.txt - тоже лежат в одной папке со скриптом.

Тем не менее - оба кода не работают.
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
И почему я вам не верю?

Я вас не обманываю.

Вот скриншот из тотал коммандера.
На нем видно, что оба файла txt - лежат рядом со скриптом au3

 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
mv6677
Попробуйте без файлов
Код:
Run("notepad.exe")


Посмотрите, находит ли AutoIt файл
Код:
MsgBox(0, "", FileExists(@ScriptDir & "\1.txt"))


Выдает сообщение об ошибке:"Error: Error opening the file."
Это сообщение блокнота? Если да, то это проблемы блокнота, а не скрипта.
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
InnI ,
Код:
Run("notepad.exe")

Открывает блокнот с названием окна "Безымянный - Блокнот".

Код:
MsgBox(0, "", FileExists(@ScriptDir & "\1.txt"))

Выдает окошко с сообщением "1" (Все сообщение - это одна цифра "1")

Выдает сообщение об ошибке:"Error: Error opening the file." - сам автоит, а не блокнот.
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
mv6677 [?]
Открывает блокнот с названием окна "Безымянный - Блокнот".
Я имел в виду не запустить эту строчку, а заменить в скрипте строки, запускающие блокнот с файлом, на просто запуск блокнота.

сообщение об ошибке:"Error: Error opening the file." - сам AutoIt
Но в моём скрипте нет функций работы с файлами.
Или вы хотите сказать, что AutoIt не может открыть файл скрипта?
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
Вот какую ошибку выдает:



Это в коде InnI такая ошибка появляется
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
mv6677 сказал(а):
Вот какую ошибку выдает:
Но тут же ясно написано:
Строка 1 файла "2.au3"
#include <WinAPISysWin.au3> (<= Вот так она выглядит)
Ошибка: Не могу такой файл открыть
Потому как найти не может такой файл, потому как у вас версия AutoIt 3.3.14.0, а не v3.3.14.5 (как в справке).
Код:
;#include <WinAPISysWin.au3> ; Замените это
#include <WinAPI.au3> ; На это

P.s: интересно, а почему же мой-то не работает?
Изменил скрипт
 
Последнее редактирование:
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0

Да.
Вот теперь в коде Inni - все заработало.
А ваш код по-прежнему выдает пустое белое окно.

В общем всем большое спасибо за ответы.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
mv6677 сказал(а):
выдает пустое белое окно.
Почему белое?

А если так?
Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('WinTitleMatchMode', 2)
Global $aOpen[3][2] = [[@ScriptDir & '\1.txt', '[TITLE:1.txt]'], [@ScriptDir & '\2.txt', '[TITLE:2.txt]'], [@SystemDir & '\calc.exe', '[TITLE:Калькулятор]']]
Global $k, $hGUI = GUICreate('', -1, -1, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN), $WS_EX_CLIENTEDGE)

For $i = 0 To UBound($aOpen) - 1
	If ShellExecute($aOpen[$i][0], '', '', $SHEX_OPEN, @SW_HIDE) Then
		$hWnd = WinWait($aOpen[$i][1], '', 2)
		If $hWnd Then
			$k += 100
			WinMove($hWnd, '', $k, $k)
			_WinAPI_SetParent($hWnd, $hGUI)
			WinSetState($hWnd, '', @SW_SHOW)
		EndIf
	EndIf
Next

GUISetState(@SW_MAXIMIZE)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
WEnd
 
Верх