Что нового

Встраивание окна в интерфейс - по его названию

mv6677

Новичок
Сообщения
105
Репутация
0
Здравствуйте. Помогите разобраться с работой скрипта.

У меня есть скрипт GUI, который встраивает в окно интерфейса - два окна блокнота и окно калькулятора.
Код:
;#include <WinAPISysWin.au3>
#include <WinAPI.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

Посоветуйте - как изменить скрипт, чтобы он не загружал окно 2.txt - сразу, а ждал бы когда я сам вручную запущу этот файл - и лишь потом бы встраивал его в окно GUI ?

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

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Вот не рабочий для вас вариант:
Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

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

While 1
	For $i = 0 To UBound($aOpen) - 1
		If $aOpen[$i] Then
			$hWnd = WinActive($aOpen[$i])
			If $hWnd Then
				$k += 100
				WinMove($hWnd, '', $k, $k)
				_WinAPI_SetParent($hWnd, $hGUI)
				;$aOpen[$i] = '' ; Активируйте эту строку если хотите захватить 1 экземпляр окна
			EndIf
		EndIf
	Next
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
WEnd
;D
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
xXx ну так он реально - не работает.

Появляется пустое окно

Если пытаешься вручную открыть файлы с названиями 1.txt или 2.txt - то они открываются, быстро моргают и исчезают.
Но интерфейс окна GUI - остается совершенно пустым.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Так ? Ваш скрипт с минимальными переделками (в логику особор не вникал):
Код:
;#include <WinAPISysWin.au3>
#include <WinAPI.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("calc.exe")
$hWnd3 = WinWaitActive("Calculato")
_WinAPI_SetParent($hWnd3, $hGUI)
WinMove($hWnd3, "", 400, 0)
$OldPos3 = WinGetPos($hWnd3)

$OldActive = 0
AdlibRegister("Refresh")

$Flag=True

Do
	sleep(200)
	If WinExists("2.txt — Блокнот") And $Flag Then Refresh_2()
Until GUIGetMsg() = -3

Func Refresh_2()
$Flag=False
$hWnd2 = WinActive("2.txt — Блокнот")
_WinAPI_SetParent($hWnd2, $hGUI)
WinMove($hWnd2, "", 0, 300, 400, 300)
$OldPos2 = WinGetPos($hWnd2)
  $NewPos2 = WinGetPos($hWnd2)
  For $i = 0 To 3
    If $NewPos2[$i] <> $OldPos2[$i] Then
      _WinAPI_InvalidateRect($hGUI)
      $OldPos2 = $NewPos2
      Return
    EndIf
  Next
EndFunc

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

  $NewPos3 = WinGetPos($hWnd3)
  For $i = 0 To 3
    If $NewPos3[$i] <> $OldPos3[$i] Then
      _WinAPI_InvalidateRect($hGUI)
      $OldPos3 = $NewPos3
      Return
    EndIf
  Next
EndFunc
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
ra4o все работает. Спасибо большое.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
mv6677 сказал(а):
они открываются, быстро моргают и исчезают.
Но интерфейс окна GUI - остается совершенно пустым.
Вы пробовали развернуть GUI окно во весь экран, после этого?
Мой скрипт не выравнивает захваченные окна, в отличии от скрипта InnI.
Изменил скрипт.
 
Верх