Что нового

Получить отступ окна WinGetPos

Lamand

Новичок
Сообщения
12
Репутация
0
Пытаюсь получить отступ окна:

Код:
While 1
  
$aDesk = WinGetPos('Program Manager'); Общая ширина двух экранов
$aDesk2 = WinGetPos('заголовок окна'); Отступ 

If $aDesk[2] >= 2000 Then
   Sleep(1000)
  If $aDesk2[0] >= 500 Then
     Sleep(10000)
     If Not ProcessExists("файл.exe") Then
       Run ("C:\файл.exe")
      EndIf
   EndIf
EndIf
 
WEnd


Получаю ошибку: "ERROR subscript used on non accessible variable" из-за $aDesk2[0]. Подскажите пожалуйста как это исправить?
Сообщение автоматически объединено:

Интересно то, что в MsgBox он выводит $aDesk2[0] без проблем, а вот если использовать его в условиях сразу ошибка...
Сообщение автоматически объединено:

Возможно это связано с массивом, а именно его отсутствием как писали тут. Но MsgBox выводит данные по координатам!

Например:

Код:
$aPos = WinGetPos('заголовок окна')
 MsgBox(0, "WinGetPos активного окна", _
    "Координаты:" & @LF & @TAB & _
    "X=" & $aPos[0] & @LF & @TAB & _
    "Y=" & $aPos[1] & @LF & @LF & _
    "Размеры:" & @LF & @TAB & _
    "ширина =  " & $aPos[2] & @LF & @TAB & _
    "высота  =  " & $aPos[3])


Я в замешательстве...
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
279
Репутация
74
Пробовали ли вы проверить наличие ошибок, например так?
Код:
If IsArray($aDesk) Then
    If $aDesk[2] >= 2000 Then
        If IsArray($aDesk2) Then
            Sleep(1000)
            If $aDesk2[0] >= 500 Then
                Sleep(10000)
                If Not ProcessExists("файл.exe") Then
                    Run("C:\файл.exe")
                EndIf
            EndIf
        Else
            MsgBox(0, @error, 'Ошибка, определения размера "заголовок окна", (см. @error)')
        EndIf
    EndIf
Else
    MsgBox(0, @error, "Ошибка определения размера рабочего стола!")
EndIf
 
Автор
L

Lamand

Новичок
Сообщения
12
Репутация
0
Пробовали ли вы проверить наличие ошибок, например так?
Да, ошибка есть, именно при проверке заголовка окна. Так же заметил что она иногда (рандомна), не появляется, но условие которое с ним работает все равно не отрабатывает, как будто в массиве ничего нет и ему просто не с чем сравнивать, хотя тот же MsgBox всегда все выводит без ошибок. Может этот массив перед использованием как-то преобразовать можно?
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Сначала проверяйте наличие окна "заголовок окна" с помощью vvvvvv
И если окно существует / активно, только тогда переходим к получению координат.
Код:
If WinActive("заголовок окна") Then
    If IsArray($aDesk) Then
        If $aDesk[2] >= 2000 Then
            If IsArray($aDesk2) Then
                Sleep(1000)
                If $aDesk2[0] >= 500 Then
                    Sleep(10000)
                    If Not ProcessExists("файл.exe") Then
                        Run("C:\файл.exe")
                    EndIf
                EndIf
            Else
                MsgBox(0, @error, 'Ошибка, определения размера "заголовок окна", (см. @error)')
            EndIf
        EndIf
    Else
        MsgBox(0, @error, "Ошибка определения размера рабочего стола!")
    EndIf
Else
    MsgBox(0, @error, 'Окно "заголовок окна" не существует или не активно!')
EndIf
 
Автор
L

Lamand

Новичок
Сообщения
12
Репутация
0
И если окно существует / активно, только тогда переходим к получению координат.
Правильно ли я понимаю что, если я просто вручную делаю его активным и на переднем плане, то это может не работать, а через WinActive будет норм?
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Да, такое тоже иногда бывает.
В таком случае окно нужо активировать
Код:
WinActivate("заголовок окна")
 
Автор
L

Lamand

Новичок
Сообщения
12
Репутация
0
Засада с этим делом, скрипт ведет себя странно, иногда показывает ту самую ошибку, иногда нет, окно активирует, но все равно не отрабатывает. Может взглянуть на дело под другим углом...
Есть два монитора, главный и расширенный, есть приложение, в конфигах которого прописано запускаться с левым отступом, таким образом при условии что оба монитора включены приложение запускается на расширенном мониторе, но если расширенный выключится, то приложение перейдет на главный экран и в последующем на нем и останется, даже не смотря на то, что расширенный снова включился. Задача заключается в том чтоб определить что приложение находится на главном экране и выгрузить его, и так по кругу, пока не включиться расширенный и оно само автоматом туда перейдет.
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Вам нужно найти когда или точнее при каких условиях возникают эти ошибки.
Что бы их можно было повторить, прсимулировать.
Не зная причину, трудно понять, как эти проблемы устранить.
 
Автор
L

Lamand

Новичок
Сообщения
12
Репутация
0
По мучал его немного и заметил закономерность, если приложение запущено и скрипт определил отступ, который, скажем так, вписывается в условия при которых ничего делать не надо, он как будто где-то запоминает полученное число и более не обновляет его, то есть если отступ меняется на такое значение при которым должна быть реакция, он просто ничего не делает, но если скрипт перезапустить он сразу начинает работать, но до тех пор пока снова не произойдет смена отступа и так по кругу.
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Ну дак отследите это через ConsoleWrite() / MsgBox()
 
Автор
L

Lamand

Новичок
Сообщения
12
Репутация
0
Ну дак отследите это через ConsoleWrite() / MsgBox()

Сделал вот так:

Код:
Global $aPos = WinGetPos('Заголовок окна')
Global $aDesk = WinGetPos('Program Manager'); Общая ширина двух экранов

While 1
   Sleep(2000)
If WinWait("Заголовок окна") Then
    If IsArray($aDesk) Then
        If $aDesk[2] >= 2000 Then
            If IsArray($aPos) Then
                Sleep(3000)
                If $aPos[0] < 500 Then
                    Sleep(1000)
                    ProcessClose('файл.exe')
                EndIf
            Else
                MsgBox(0, @error, 'Ошибка, определения размера "заголовок окна", (см. @error)')
            EndIf
        EndIf
    Else
        MsgBox(0, @error, "Ошибка определения размера рабочего стола!")
    EndIf
Else
    MsgBox(0, @error, 'Окно "заголовок окна" не существует или не активно!')
 EndIf

 WEnd


Сообщений об ошибках не получаю, что еще можно сделать чтоб понять на чём он останавливается? WinActive и WinActivate тоже пробовал, как по отдельности так и совместно, картина та же.
Сообщение автоматически объединено:

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

В продолжении мысли..., добавил присвоение значения $aPos[0] = 1920, в том случае если произошла выгрузка приложения, хоть это и нелогично, но теперь стало норм, работает как надо!
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
279
Репутация
74
Мне тоже нечего добащить

Вместо Sleep() я сделал бы так
Sleep(2000)
Код:
If WinWait("Заголовок окна", 2) Then
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Если я правильно понял, размеры "Program Manager" меняются в зависимости от того один или два монитора включены.
Если так, то размеры "Program Manager" нужно обновлять - получать в цикле.

Возможно вам поможет вот этот
Код:
Global $aDesk, $aPos

While Sleep(250)
     If Not WinWait("Заголовок окна", "", 2) Then;ждем окно в течении двух секунд
          MsgBox(0, @error, 'Окно "заголовок окна" не существует или не активно!')
     Else
          $aDesk = WinGetPos('Program Manager')
          If Not IsArray($aDesk) Then
               MsgBox(0, @error, "Ошибка определения размера рабочего стола!")
          ElseIf $aDesk[2] >= 2000 Then
               $aPos = WinGetPos('Заголовок окна')
               If Not IsArray($aPos) Then
                    MsgBox(0, @error, 'Ошибка, определения размера "заголовок окна", (см. @error)')
               ElseIf $aPos[0] < 500 Then
                    ProcessClose('файл.exe')
               EndIf
          EndIf
     EndIf
WEnd
Если опишете более подробно требуемый результат, попробую помочь.

А пока что я понял:

- при откл. второго монитора, окно прыгает на первый и программу нужно ...
А) закрыть
Б) игнорировать

- при включении второго монитора, окно программы требуется ...
А) запустить программу (и переместить ее окно на второй монитор - по координатам)
Б) переместить окно программы на второй монитор - по координатам.
 
Верх