1

Тема: AHK: Некорректные действия скрипта

Доброго времени суток друзья!

Столкнулся со следующей проблемой в скрипте.

После запуска скрипта (n-е количество раз) перестаёт реагировать команда Send, и скрипт продолжает выполнение со следующей строки.


{ifWinExist, Вариограф ; поиск окна "vg"

 {
  WinActivate ; активация окна
}

   else ; или
   {
      Run, C:\Program Files (x86)\Variograph 4.6.44\vg.exe ; запуск vg
       WinWait, C:\Program Files (x86)\Variograph 4.6.44\vg.exe; ожидание появления окна "vg"
       WinActivate ; активация окна
 }
}

FileRead, FileName, D:\work\Script VAR\1.txt; замен строки
RegExMatch(FileName, "m`a).*>.*", FileName)
Stringreplace,FileName,FileName, >, _
FileName := RegExReplace(FileName, ".jpg|.png|.psd")
DropFiles( "D:\work\Script VAR\готовые\" FileName ".psd", "Вариограф" )

DropFiles(ByRef fileList, windowTitle := "", ctrl := "", x := 0, y := 0, NCA := 0); перетяшивание файла в окно vg
{
    offset := 20
    VarSetCapacity(dropFiles, StrLen(fileList) + offset, 0)
    pDP := &dropFiles

    loop, parse, fileList, `n, `r
        StrPut(A_LoopField, pDP + offset, StrLen(A_LoopField), "CP0")
        , offset += StrLen(A_LoopField) + 4
        , NumPut(0, pDP + offset - 4, "UInt")

    NumPut(0, pDP + offset, "UInt")
    NumPut(20, pDP + 0, "UInt")
    NumPut(x, pDP + 4, "UInt")
    NumPut(y, pDP + 8, "UInt")
    NumPut(NCA, pDP + 12, "UInt")
    NumPut(0, pDP + 16, "UInt")

    nSize := offset + 4
    hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", nSize, "Ptr")
    pData := DllCall("GlobalLock", "Ptr", hDrop, "Ptr")
    DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", pDP, "UInt", nSize)
    DllCall("GlobalUnlock", "Ptr", hDrop)

    PostMessage, 0x233, hDrop, 0, %ctrl%, %windowTitle%
}
return

F9::
{if KeepRunning = y ; проверка переменной, она будет отвечать за вкл либо выкл цикла.


KeepRunning = y ; запуск, переменная создана (следующее нажатие кнопки F9   кадрирование)

Send ^c; за это сочетание отвечает команда кадрировать в программе с ней и есть проблемы
Send {Enter}
}
KeyWait, F9
{ifWinExist, Adode Photoshop CS3
    {
     WinActivate
    }
      else
     {
      Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
      WinWait, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
      WinActivate
     }
}







    

Буду очень признателен, если укажете в чем тут дело.

2 (изменено: creature.ws, 2012-12-05 12:48:04)

Re: AHK: Некорректные действия скрипта

Интересное применение «{» и «}». Давайте будем брать в фигурные скобки всё, что не приведёт к ошибке при запуске.

Если у вас имеется желание выравнивать блоки кода в скрипте случайным количеством пробелов — лучше не выравнивайте.

3

Re: AHK: Некорректные действия скрипта

не ясно

4

Re: AHK: Некорректные действия скрипта

С посылом Ctrl-C могут быть проблемы, если окно переключено на русский язык. Лучше использовать виртуальный код клавиши C.


Send ^{vk43}

5

Re: AHK: Некорректные действия скрипта

Попытался улучшить читаемость кода. Так работает?

IfWinExist, Вариограф    ;Если существует окно "vg"
    WinActivate    ;активация окна

Else    
    {
    Run, C:\Program Files (x86)\Variograph 4.6.44\vg.exe    ;иначе запуск vg
    WinWait, C:\Program Files (x86)\Variograph 4.6.44\vg.exe    ;ожидание появления окна "vg"
    WinActivate    ;активация окна
    }

FileRead, FileName, D:\work\Script VAR\1.txt; замен строки
RegExMatch(FileName, "m`a).*>.*", FileName)
Stringreplace,FileName,FileName, >, _
FileName := RegExReplace(FileName, ".jpg|.png|.psd")
DropFiles( "D:\work\Script VAR\готовые\" FileName ".psd", "Вариограф" )

DropFiles(ByRef fileList, windowTitle := "", ctrl := "", x := 0, y := 0, NCA := 0)    ;перетяшивание файла в окно vg
{
    offset := 20
    VarSetCapacity(dropFiles, StrLen(fileList) + offset, 0)
    pDP := &dropFiles

    loop, parse, fileList, `n, `r
    StrPut(A_LoopField, pDP + offset, StrLen(A_LoopField), "CP0")
    , offset += StrLen(A_LoopField) + 4
    , NumPut(0, pDP + offset - 4, "UInt")

    NumPut(0, pDP + offset, "UInt")
    NumPut(20, pDP + 0, "UInt")
    NumPut(x, pDP + 4, "UInt")
    NumPut(y, pDP + 8, "UInt")
    NumPut(NCA, pDP + 12, "UInt")
    NumPut(0, pDP + 16, "UInt")

    nSize := offset + 4
    hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", nSize, "Ptr")
    pData := DllCall("GlobalLock", "Ptr", hDrop, "Ptr")
    DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", pDP, "UInt", nSize)
    DllCall("GlobalUnlock", "Ptr", hDrop)

    PostMessage, 0x233, hDrop, 0, %ctrl%, %windowTitle%
}
Return

F9::
if KeepRunning = y    ;проверка переменной, она будет отвечать за вкл либо выкл цикла.
KeepRunning = y        ;запуск, переменная создана (следующее нажатие кнопки F9 кадрирование)

Send ^{vk43}        ;за это сочетание отвечает команда кадрировать в программе с ней и есть проблемы
Sleep, 1000    ;возможно, эта пауза решит проблему    
Send {Enter}

KeyWait, F9
IfWinExist, Adode Photoshop CS3
    WinActivate
Else
    {
    Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
    WinWait, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
    WinActivate
    }

6 (изменено: Maxfashko, 2012-12-05 13:17:27)

Re: AHK: Некорректные действия скрипта

Да, спасибо. Работает

Есть еще одна особенность, не могу завершить процесс либо послать новую команду после этого куска кода

IfWinExist, Adode Photoshop CS3
    WinActivate
Else
    {
    Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
    WinWait, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
    WinActivate
    }

проверка, запущен ли photoshop.

То есть если после этого написать
Process, close, "имя моего скрипта.exe"
ничего не произойдёт.

А мне бы хотелось еще передать Send photoshop`у

7

Re: AHK: Некорректные действия скрипта

Проверьте, доходит ли вообще скрипт до этого пункта (Script lines most recently executed). Может быть он дожидается появления окна Photoshop.

8

Re: AHK: Некорректные действия скрипта

Как это сделать?
Окно он активирует и переходит в него, дальше стопор

9

Re: AHK: Некорректные действия скрипта

Давайте код скрипта с учётом Process, close. Так виднее будет.

10

Re: AHK: Некорректные действия скрипта

{ifWinExist, Вариограф ; поиск окна "vg"

 {
  WinActivate ; активация окна
}

   else ; или
   {
      Run, C:\Program Files (x86)\Variograph 4.6.44\vg.exe ; запуск vg
       WinWait, C:\Program Files (x86)\Variograph 4.6.44\vg.exe; ожидание появления окна "vg"
       WinActivate ; активация окна
 }
}

FileRead, FileName, D:\work\Script VAR\1.txt
RegExMatch(FileName, "m`a).*>.*", FileName)
Stringreplace,FileName,FileName, >, _
FileName := RegExReplace(FileName, ".jpg|.png|.psd")
DropFiles( "D:\work\Script VAR\готовые\" FileName ".psd", "Вариограф" )

DropFiles(ByRef fileList, windowTitle := "", ctrl := "", x := 0, y := 0, NCA := 0)
{
    offset := 20
    VarSetCapacity(dropFiles, StrLen(fileList) + offset, 0)
    pDP := &dropFiles

    loop, parse, fileList, `n, `r
        StrPut(A_LoopField, pDP + offset, StrLen(A_LoopField), "CP0")
        , offset += StrLen(A_LoopField) + 4
        , NumPut(0, pDP + offset - 4, "UInt")

    NumPut(0, pDP + offset, "UInt")
    NumPut(20, pDP + 0, "UInt")
    NumPut(x, pDP + 4, "UInt")
    NumPut(y, pDP + 8, "UInt")
    NumPut(NCA, pDP + 12, "UInt")
    NumPut(0, pDP + 16, "UInt")

    nSize := offset + 4
    hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", nSize, "Ptr")
    pData := DllCall("GlobalLock", "Ptr", hDrop, "Ptr")
    DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", pDP, "UInt", nSize)
    DllCall("GlobalUnlock", "Ptr", hDrop)

    PostMessage, 0x233, hDrop, 0, %ctrl%, %windowTitle%
}
return

F9::
{if KeepRunning = y; проверка переменной, она будет отвечать за вкл либо выкл цикла.


KeepRunning = y; запуск, переменная создана (следующее нажатие кнопки F9   кадрирование)

Send ^{vk43}        
Sleep, 500
Send {Enter}    

}
KeyWait, F9
{ifWinExist, Adode Photoshop CS3
    {
     WinActivate
    }
      else
     {
      Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
      WinWait, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
      WinActivate
     }
}
Process, close, Drag and Drop.exe

11

Re: AHK: Некорректные действия скрипта

Не понятно, почему не срабатывает Process, close. Судя по всему, должно рабоать.

12

Re: AHK: Некорректные действия скрипта

после последней строки не работает ничего 
даже простой msgbox

13

Re: AHK: Некорректные действия скрипта

Я вот сомневаюсь, что окно программы Photoshop имеет заголовок "C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe"

WinWait [, WinTitle, WinText, Seconds, ExcludeTitle, ExcludeText].

Окно он активирует

Так что возможно, окно не он активирует, а оно само активируется. А скрипт так и продолжает ждать появления окна с заголовком "C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe". Чтобы это проверить, запускайте скрипт в нескопилированном виде. В области уведомлений (она же - system tray) сделайте двойной щёлок по иконке скрипта. Вы увидите, чем занимается скрипт в данный момент.

14

Re: AHK: Некорректные действия скрипта

Да, именно так

068: WinWait,C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe (20.63)

15 (изменено: Maxfashko, 2012-12-05 15:14:43)

Re: AHK: Некорректные действия скрипта

в принципе, помогло удаление этой строки.
процесс завершился, а вот send так и не работает

16

Re: AHK: Некорректные действия скрипта

Не посылаются нажатия клавиш в окно Variograph или в Photoshop?

17

Re: AHK: Некорректные действия скрипта

именно в photoshop, он активен

18

Re: AHK: Некорректные действия скрипта

В Вашем коде команда Send встречается только один раз, после активации окна "Вариограф". Добавьте соответствующую команду после активации окна Photoshop.

19

Re: AHK: Некорректные действия скрипта

ypppu пишет:

В Вашем коде команда Send встречается только один раз, после активации окна "Вариограф". Добавьте соответствующую команду после активации окна Photoshop.


Это и было сделано ранее)
К примеру

KeyWait, F9
{ifWinExist, Adode Photoshop CS3
    {
     WinActivate
    }
      else
     {
      Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
      WinActivate
     }
}
Send {F12}
Process, close, Drag and Drop.exe

20

Re: AHK: Некорректные действия скрипта

А что показывает дебаггер?

21 (изменено: Maxfashko, 2012-12-05 22:05:02)

Re: AHK: Некорректные действия скрипта

Он пролетает мимо send
завершая процесс

22

Re: AHK: Некорректные действия скрипта

Maxfashko, используй знаки препинания.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Некорректные действия скрипта

Выложите ещё раз полный код и отчёт дебаггера.

24

Re: AHK: Некорректные действия скрипта

Вот

{ifWinExist, Вариограф ; поиск окна "vg"

 {
  WinActivate ; активация окна
}

   else ; или
   {
      Run, C:\Program Files (x86)\Variograph 4.6.44\vg.exe ; запуск vg
       WinWait, C:\Program Files (x86)\Variograph 4.6.44\vg.exe; ожидание появления окна "vg"
       WinActivate ; активация окна
 }
}

FileRead, FileName, D:\work\Script VAR\1.txt
RegExMatch(FileName, "m`a).*>.*", FileName)
Stringreplace,FileName,FileName, >, _
FileName := RegExReplace(FileName, ".jpg|.png|.psd")
DropFiles( "D:\work\Script VAR\готовые\" FileName ".psd", "Вариограф" )

DropFiles(ByRef fileList, windowTitle := "", ctrl := "", x := 0, y := 0, NCA := 0)
{
    offset := 20
    VarSetCapacity(dropFiles, StrLen(fileList) + offset, 0)
    pDP := &dropFiles

    loop, parse, fileList, `n, `r
        StrPut(A_LoopField, pDP + offset, StrLen(A_LoopField), "CP0")
        , offset += StrLen(A_LoopField) + 4
        , NumPut(0, pDP + offset - 4, "UInt")

    NumPut(0, pDP + offset, "UInt")
    NumPut(20, pDP + 0, "UInt")
    NumPut(x, pDP + 4, "UInt")
    NumPut(y, pDP + 8, "UInt")
    NumPut(NCA, pDP + 12, "UInt")
    NumPut(0, pDP + 16, "UInt")

    nSize := offset + 4
    hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", nSize, "Ptr")
    pData := DllCall("GlobalLock", "Ptr", hDrop, "Ptr")
    DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", pDP, "UInt", nSize)
    DllCall("GlobalUnlock", "Ptr", hDrop)

    PostMessage, 0x233, hDrop, 0, %ctrl%, %windowTitle%
}
return

F9::
{if KeepRunning = y; проверка переменной, она будет отвечать за вкл либо выкл цикла.


KeepRunning = y; запуск, переменная создана (следующее нажатие кнопки F9   кадрирование)

Send ^{vk43}        
Sleep, 500
Send {Enter}    

}
KeyWait, F9
{ifWinExist, Adode Photoshop CS3
    {
     WinActivate
    }
      else
     {
      Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
      WinActivate
Send {F12}
     }
}

Дебаггер:

001: {
001: IfWinExist,Вариограф
004: WinActivate (0.13)
005: }
013: }
015: FileRead,FileName,D:\work\Script VAR\1.txt
016: RegExMatch(FileName, "m).*>.*", FileName)  
017: StringReplace,FileName,FileName,>,_
018: FileName := RegExReplace(FileName, ".jpg|.png|.psd")
019: DropFiles( "D:\work\Script VAR\готовые\" FileName ".psd", "Вариограф" )  
023: offset := 20
024: VarSetCapacity(dropFiles, StrLen(fileList) + offset, 0)  
025: pDP := &dropFiles
027: Loop,parse,fileList,
,

028: StrPut(A_LoopField, pDP + offset, StrLen(A_LoopField), "CP0"), offset += StrLen(A_LoopField) + 4, NumPut(0, pDP + offset - 4, "UInt")  
032: NumPut(0, pDP + offset, "UInt")  
033: NumPut(20, pDP + 0, "UInt")  
034: NumPut(x, pDP + 4, "UInt")  
035: NumPut(y, pDP + 8, "UInt")  
036: NumPut(NCA, pDP + 12, "UInt")  
037: NumPut(0, pDP + 16, "UInt")  
039: nSize := offset + 4
040: hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", nSize, "Ptr")
041: pData := DllCall("GlobalLock", "Ptr", hDrop, "Ptr")
042: DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", pDP, "UInt", nSize)  
043: DllCall("GlobalUnlock", "Ptr", hDrop)  
045: PostMessage,0x233,hDrop,0,%ctrl%,%windowTitle%
046: }
022: {
047: Return (1.64)
050: {
050: if KeepRunning = y; проверка переменной, она будет отвечать за вкл либо выкл цикла.
055: Send,^{vk43} (0.03)
056: Sleep,500 (0.50)
057: Send,{Enter} (0.01)
059: }
060: KeyWait,F9
061: {
061: IfWinExist,Adode Photoshop CS3
067: Run,C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe (0.25)
068: WinActivate
069: Send,{F12} (0.02)
070: }
071: }
072: Exit (17.59)

25

Re: AHK: Некорректные действия скрипта

В ходе проверки условия ifWinExist, Adode Photoshop CS3 скрипт выявил, что такого окна не существует. Поэтому он перешёл к выполнению секции:

     {
      Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
      WinActivate
Send {F12}
     }

Был ли на самом деле при этом запущен Photoshop, знаете только Вы. Если он не был запущен, конечно, нажатие F12 сработает до того, как он успеет загрузиться.
Если он был запущен, и его окно было активно, нажатие F12 должно было передаться.

26 (изменено: serzh82saratov, 2012-12-06 12:10:26)

Re: AHK: Некорректные действия скрипта

Maxfashko посмотрите на этот код:


IfWinNotExist, Вариограф ; поиск окна "vg"
{
 Run, C:\Program Files (x86)\Variograph 4.6.44\vg.exe ; запуск vg
 WinWait, Вариограф
}
WinActivate, Вариограф

FileRead, FileName, D:\work\Script VAR\1.txt
RegExMatch(FileName, "m`a).*>.*", FileName)
Stringreplace,FileName,FileName, >, _
FileName := RegExReplace(FileName, ".jpg|.png|.psd")
DropFiles( "D:\work\Script VAR\готовые\" FileName ".psd", "Вариограф" )

DropFiles(ByRef fileList, windowTitle )
{
    offset := 20
    VarSetCapacity(dropFiles, StrLen(fileList) + offset, 0)
    pDP := &dropFiles

    loop, parse, fileList, `n, `r
        StrPut(A_LoopField, pDP + offset, StrLen(A_LoopField), "CP0")
        , offset += StrLen(A_LoopField) + 4
        , NumPut(0, pDP + offset - 4, "UInt")

    NumPut(0, pDP + offset, "UInt")
    NumPut(20, pDP + 0, "UInt")
    NumPut(0, pDP + 16, "UInt")

    nSize := offset + 4
    hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", nSize, "Ptr")
    pData := DllCall("GlobalLock", "Ptr", hDrop, "Ptr")
    DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", pDP, "UInt", nSize)
    DllCall("GlobalUnlock", "Ptr", hDrop)

    PostMessage, 0x233, hDrop, 0, %ctrl%, %windowTitle%
}
return

F9::
if KeepRunning = y; проверка переменной, она будет отвечать за вкл либо выкл цикла.
 KeepRunning = y; запуск, переменная создана (следующее нажатие кнопки F9   кадрирование)
 Send ^{vk43}        
 Sleep, 500
 Send {Enter}    

KeyWait, F9
IfWinNotExist, Adode Photoshop CS3
Run, C:\Program Files (x86)\Adobe\Adobe Photoshop CS3\Photoshop.exe
WinWait, Adode Photoshop CS3
WinActivate
Send {F12}
ExitApp

Нмкак не смог понять зачем это:

{if KeepRunning = y; проверка переменной, она будет отвечать за вкл либо выкл цикла.

KeepRunning = y; запуск, переменная создана (следующее нажатие кнопки F9   кадрирование)

Если "KeepRunning = y" то зачем ей в этом случае присваивать тоже значение, если оно и так ему равно? И где переменная "KeepRunning" вообще используется?
И зачем перед if вы пишете "{" ?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27

Re: AHK: Некорректные действия скрипта

serzh82saratov

Скрипт ждёт активации окна adobe photoshop CS3 и не идёт дальше.

28 (изменено: serzh82saratov, 2012-12-06 13:46:24)

Re: AHK: Некорректные действия скрипта

Значит неправильно задан критерий поиска. Пробуйте:

ahk_class adobe photoshop CS3

AU3_Spy пользуете?
И ждёт он не активации, а существования.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29

Re: AHK: Некорректные действия скрипта

И что по счёт переменной "KeepRunning".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Некорректные действия скрипта

Мысль с классом правильная:)
spy показал ahk_class adobe photoshop
его и использовал=)

Спасибо!