Что нового

Как задать местоположение окна RUN

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
В программе использую подобные команды:
Код:
RunWait("C:\ftp\updata\wget.exe -P C:\ftp\updata\upd\ -c http://dragon.permpost.ru/upd/"&$filer)
RunWait("C:\ftp\updata\upd\"&$filer)

Есть ли возможность задать местоположение открывающегося окна CMD?

Да мне действительно нужно чтоб ЭТО выполнялось в открытом/видимом окне.
Но на разных мониторах местоположение окна получатся разным. В центре - почти никогда.
В идеале бы "припарковать" его в правый верхний угол.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ВиталийВВ
задать местоположение открывающегося окна CMD
Пока RunWait() ждёт завершения работы запущенной программы, изменить положение окна можно только при помощи "прерывающих" функций HotKeySet() или AdlibRegister(). Но можно обойтись без использования RunWait()
Код:
$PID = Run(@ComSpec & " /c pause")
WinMove(WinWait("[class:ConsoleWindowClass]"), "", 0, 0)
; для завершения скрипта нажмите любую клавишу в окне CMD
ProcessWaitClose($PID)
 
A

Alofa

Гость
Как вариант:
Код:
$iX = 300 ; Координата "X"
$iY = 200 ; Координата "Y"
$hPID = Run("C:\ftp\updata\upd\"&$filer, "", @SW_HIDE)
$hWin = WinWait("[class:ConsoleWindowClass]")
WinMove($hWin, "", $iX, $iY)
WinSetState($hWin, "", @SW_SHOW)
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Alofa сказал(а):
Как вариант:
Код:
$iX = 300 ; Координата "X"
$iY = 200 ; Координата "Y"
$hPID = Run("C:\ftp\updata\upd\"&$filer, "", @SW_HIDE)
$hWin = WinWait("[class:ConsoleWindowClass]")
WinMove($hWin, "", $iX, $iY)
WinSetState($hWin, "", @SW_SHOW)

А можно ли сделать, чтоб правый верхний угол этого окна совпадал с правым верхним углом экрана?
 
A

Alofa

Гость
Код:
#include <WinAPISys.au3>

$hPID = Run("C:\ftp\updata\upd\"&$filer, "", @SW_HIDE)
$hWnd = WinWait("[class:ConsoleWindowClass]")
$iWinWidth = _WinAPI_GetWindowWidth($hWnd)
$iLeft = DllStructGetData(_WinAPI_GetWorkArea(), 'Right') - $iWinWidth
WinMove($hWnd, "", $iLeft, 0)
WinSetState($hWnd, "", @SW_SHOW)
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Alofa сказал(а):
Код:
#include <WinAPISys.au3>

$hPID = Run("C:\ftp\updata\upd\"&$filer, "", @SW_HIDE)
$hWnd = WinWait("[class:ConsoleWindowClass]")
$iWinWidth = _WinAPI_GetWindowWidth($hWnd)
$iLeft = DllStructGetData(_WinAPI_GetWorkArea(), 'Right') - $iWinWidth
WinMove($hWnd, "", $iLeft, 0)
WinSetState($hWnd, "", @SW_SHOW)

От себя добавлю, что у меня версия 3.3.8.1 и там нету

#include <WinAPISys.au3>
но я вычитал и заменил эту строчку на
#include <WinAPIEx.au3>

в итоге - работает так как надо.

Спасибо за помощь!


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

Чуть модифицировал и вписал строку:
Код:
WinMove($hWnd, "", $iLeft, 0, 800, 400, 30)


Сейчас это окно ДВИЖЕТСЯ при выполнении. Выглядит - феерично!!!!!!! (зачем - не спрашивайте, но - завораживает!)

И параллельно вопрос:
можно ли не задавать ширину и высоту окна?
Пробовал ставить просто "", "" вместо нужных позиций, получается нулевое окно.

А еще б здорово, чтоб оно б постоянно двигалось, или "отпрыгивало" от мышки!!!
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Alofa сказал(а):
ВиталийВВ сказал(а):
... А еще б здорово, чтоб оно б постоянно двигалось, или "отпрыгивало" от мышки!!!
Это уже тема другого разговора.

Тоже верно. Не будем наших женщин шокировать, а то они и так уже от самодвижущихся окон начали креститься.
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Alofa сказал(а):
Код:
#include <WinAPISys.au3>

$hPID = Run("C:\ftp\updata\upd\"&$filer, "", @SW_HIDE)
$hWnd = WinWait("[class:ConsoleWindowClass]")
$iWinWidth = _WinAPI_GetWindowWidth($hWnd)
$iLeft = DllStructGetData(_WinAPI_GetWorkArea(), 'Right') - $iWinWidth
WinMove($hWnd, "", $iLeft, 0)
WinSetState($hWnd, "", @SW_SHOW)

При тестировании на рабочих машинах, при выполнении этого отрывка программы, выяснилась некоторая неприятность, в частности стали всплывать окна CMD видимо от других программ.
Видимо ЭТО видит что то другое. (не могу сформулировать :-( )
В итоге, можно ли для перетаскивания окна дать ему какое то имя, а уже потом тащить?
Или как то по иному двигать?
Не получается объяснить понятнее :-(
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
InnI сказал(а):
ВиталийВВ
стали всплывать окна CMD видимо от других программ
Код:
$hWnd = WinWaitActive("[class:ConsoleWindowClass]")

скорее чуть иначе.
сейчас думаю про вот это так:
Код:
$hWnd = WinWait("Wget")


Т.Е. просто пропишу тут имя (наименование?) того окна, которое будет "всплывать" и я его знаю и оно меняться не будет
 
A

Alofa

Гость
Код:
#include <WinAPIEx.au3>

_Run("C:\ftp\updata\wget.exe -P C:\ftp\updata\upd\ -c http://dragon.permpost.ru/upd/" & $filer)
_Run("C:\ftp\updata\upd\" & $filer)

Func _Run($sProg)
    Local $hPID, $aList, $hWnd, $iLeftPos
    $hPID = Run($sProg, '', @SW_HIDE)
    If Not ProcessWait($hPID, 6) Then Return SetError(1, 0, 0)
    $aList = WinList('[CLASS:ConsoleWindowClass]')
    If IsArray($aList) Then
        For $i = 1 To $aList[0][0]
            If WinGetProcess($aList[$i][1]) = $hPID Then
                $hWnd = $aList[$i][1]
                ExitLoop
            EndIf
        Next
    EndIf
    If Not $hWnd Then Return SetError(2, 0, 0)
    $iLeftPos = _WinAPI_GetWindowWidth(_WinAPI_GetDesktopWindow()) - _WinAPI_GetWindowWidth($hWnd)
    WinMove($hWnd, "", $iLeftPos, 0)
    WinSetState($hWnd, "", @SW_SHOW)
    Return $hPID
EndFunc   ;==>_Run
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
В итоге написал таким образом:
Код:
$hPID = Run("C:\ftp\updata\wget.exe -P C:\ftp\updata\upd\ -c http://dragon.permpost.ru/upd/"&$filer, "", @SW_HIDE)
		$hWnd = WinWait("Wget")
		$iWinWidth = _WinAPI_GetWindowWidth($hWnd)
		$iLeft = DllStructGetData(_WinAPI_GetWorkArea(), 'Right') - $iWinWidth
		WinMove($hWnd, "", $iLeft, 0)
		WinSetState($hWnd, "", @SW_SHOW)


$hWnd = WinWait("Wget") - тут вписываю название того окна, которое ожидается.
Проверил на рабочих машинах (пока на одной) вроде нормально. Не глючит.
Очень надеюсь, что все таки закончил эту эпопею.

Не сомневаюсь, что вариант от Alofa будет работать хорошо, но уже сроки поджимают. и беда в том, что этих кусков в программе у меня несколько. А днем испробовал свою версию.
 
A

Alofa

Гость
ВиталийВВ ваш код будет корректно работать только при условии если окно с таким загаловком одно. Если вы железно уверены, что так и будет - тогда оставляйте как есть.

Если опять баги, тогда:
Код:
; Замените в моем коде строку
$aList = WinList('[CLASS:ConsoleWindowClass]')

; на
$aList = WinList('Wget')

... и пробуйте.
В чем разница? В вашем коде скрипт просто ожидает появления окна с нужным заголовком, в моем же - ищется окно с заголовком связанное с данным прцессом.

Пробовал использовать для такой проверки "_WinAPI_EnumProcessWindows()", но что-то она с консольными окнами не очень дружит.
 
Верх