1

Тема: AHK: Запрещение вывода сообщений. Закрытие после сбоя

1. Можно ли вообще запретить скрипту вывод сообщений об ошибках?
2. Существуют ли методы, позволяющие закрыть скрипт, убить процесс сбойнувшего скрипта, из самого скрипта?
3. Как закрыть скрипт, убить процесс сбойнувшего скрипта сторонними средствами, если иконка не реагирует?

2

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

3. Из другого скрипта.

3

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

1. Прочитайте про #ErrorStdOut.
2. А скрипт скомпилирован? Существует комана Process, Close и встроенные переменные A_ScriptName, A_ScriptDir, A_ScriptFullPath, A_ScriptHwnd.
3. Программой вроде Диспетчера задач.

4

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

ypppu пишет:

1. Прочитайте про #ErrorStdOut.
2. А скрипт скомпилирован? Существует комана Process, Close и встроенные переменные A_ScriptName, A_ScriptDir, A_ScriptFullPath, A_ScriptHwnd.
3. Программой вроде Диспетчера задач.

1. Вообще, в первую очередь, я имел ввиду сообщения, которые возникают не при запуске, а во время работы скрипта.
2. Интересует этот вопрос и для скриптов скомпилированных  и нет. Как можно воспользоваться этими перменными, если скрипт выдал ошибку и не откликается?
3. Если скрипт не скомпилирован, то его процесс  трудно найти в диспетчере, если параллельно ещё 2-3 скрипта работает.

5

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

YMP пишет:

3. Из другого скрипта.

  Как найти нужный процесс, если запущено несколько скриптов, явного окна нет, а меню из иконки не вызывается?

6

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Можно запускать один скрипт из другого командой Run и запоминать PID процесса. По которому потом и закрыть процесс.

7

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Next пишет:

2. Интересует этот вопрос и для скриптов скомпилированных  и нет. Как можно воспользоваться этими перменными, если скрипт выдал ошибку и не откликается?

Кажется, есть общее решение:

DetectHiddenWindows, On
1:: ; Нажмите на единичку, чтобы убить собственный процесс скрипта
Sleep, 3000
Soundbeep
WinGet, OutputVar, PID, ahk_id %A_ScriptHwnd%
Process, Close, %OutputVar%
Return

Если скрипт не откликается (завис наглухо), естественно, сам себе он не поможет. Но "не откликаться" можно по-разному.

8 (изменено: Next, 2014-05-28 01:42:58)

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Хорошая идея для работы с проблемным скриптом.  Только не знаю будет ли это работать, когда простой "ExitApp" не станет.

9 (изменено: serzh82saratov, 2014-11-04 14:59:18)

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Если реагирует на хоткей, то считай что и не завис.
Насчёт обработки ошибок определённых строк, есть TRY. Для всех ошибок Com объектов в скрипте, есть ComObjError(false).

Next пишет:

Если скрипт не скомпилирован, то его процесс  трудно найти в диспетчере, если параллельно ещё 2-3 скрипта работает.

Ну и по случаю, давно хотел себе сделать простенький таскман анк скриптов.



  ; http://forum.script-coding.com/viewtopic.php?pid=83407#p83407

#SingleInstance Force
#NoTrayIcon
#NoEnv
ListLines Off
SetBatchLines -1
Menu, Tray, UseErrorLevel
Menu, Tray, Icon, Shell32.dll, 262

IgnoreList =  
LimitRow := 12, Process := [], Count := 0
Query := "SELECT * FROM Win32_Process WHERE Caption = 'AutoHotkey.exe' AND ProcessId != " DllCall("GetCurrentProcessId")
WMI := ComObjGet("winmgmts:").ExecQuery(Query)
For Proc In WMI
{
    RegExMatch(Proc.CommandLine, "Si).*""(?<Folder>.*?:.*)\\(?<Name>.*)\.ahk""", _)
    Date := SubStr(Proc.CreationDate, 1, 14)
    FormatTime, Time, %Date%, HH:mm:ss ; dd-MM
    If _Name In %IgnoreList%
        Continue
    Process[A_Index] := [_Name, Time, _Folder, Proc.ProcessId], ++Count
}
DeleteDummyIcons()
If !Count
{ 
    MsgBox, 4149,  AhkTask, AutoHotkey process not found!
    IfMsgBox Retry
        Reload 
    ExitApp
}
RC := Count > LimitRow ? LimitRow : Count

Gui, Font, s10
Gui, Margin, 0, 0
Gui, -DPIScale +AlwaysOnTop
Gui, Add, ListView, AltSubmit Grid vLV hwndhLV BackgroundE8E8FF R%RC%, Name|TimeCreate|Folder|PID
Gui, Add, Text, y+2 vBut1 Border +0x201 gClose, Close
Gui, Add, Text, x+0 vBut2 Border +0x201 hp gOpenFolder, In Folder
Gui, Add, Text, xm y+2 vBut3 Border +0x201 hp gSelectAll, Select All
Gui, Add, Text, x+0 vBut4 Border +0x201 hp gReload, Reload

For k, v in Process
    LV_Add("", v[1], v[2], v[3], v[4])

GuiControl, -Redraw, LV
Loop % LV_GetCount("Col")
    LV_ModifyCol(A_Index, "AutoHdr") 
LV_InsertCol(LV_GetCount("Col")+1), LV_ModifyCol(LV_GetCount("Col")-1, "AutoHdr"), LV_DeleteCol(LV_GetCount("Col"))
    LV_Modify(1, "Select"), LV_ModifyCol(2, "SortDesc")
GuiControl, +Redraw, LV

Loop % 4 + (Width := 0)
{
    SendMessage, 4125, A_Index - 1, 0, , ahk_id %hLV%
    Width += ErrorLevel
}
Width += (Count > LimitRow ? 26 : 4)
GuiControl, Move, LV, % "w" Width
Loop 4
    GuiControl, Move, But%A_Index%, % "w" Width // 2 " x" Width // 2 * (Mod(A_Index+1, 2))
Gui, Show, % "xCenter y100 w" Width, AhkTask
OnMessage(0x203, "WM_LBUTTONDBLCLK")
Return

Close:
    Critical
    Loop % S := LV_GetCount("S")
    {
        sRow := LV_GetNext()
        LV_GetText(sPID, sRow, 4)
        Process, Close, %sPID%
        Process, WaitClose, %sPID%, 1
        If !ErrorLevel
            LV_Delete(sRow), DeleteDummyIcons()
    }
    If S = 1
        LV_Modify(LV_GetCount() < sRow ? LV_GetCount() : sRow, "Select")
    Return

OpenFolder:
    Loop % LV_GetCount("S") + (sRow := 0)
    {
        sRow := LV_GetNext(sRow)
        LV_GetText(sFolder, sRow, 3)
        LV_GetText(sName, sRow, 1)
        SelectFilePath(sFolder "\" sName ".ahk")
    }
    Return

SelectAll:
    LV_Modify(0, "Select")
    Return

Reload:
    Reload
    Return

GuiClose:
GuiEscape:
    ExitApp

WM_LBUTTONDBLCLK()  {
    If InStr(A_GuiControl, "But")
    {
        If A_GuiControl = But1
            SetTimer, Close, -1
        Return 0
    }
}

SelectFilePath(FilePath)   {
   SplitPath, FilePath,, Dir
   for window in ComObjCreate("Shell.Application").Windows
   {
      ShellFolderView := window.Document

      Try If ((Folder := ShellFolderView.Folder).Self.Path != Dir)
         Continue
      Catch
         Continue

      for item in Folder.Items
      {
         If (item.Path != FilePath)
            Continue

         ShellFolderView.SelectItem(item, 1|4|8|16)
         WinActivate, % "ahk_id" window.hwnd
         Return
      }
   }
   Run, %A_WinDir%\explorer.exe /select`, "%FilePath%", , UseErrorLevel
}  
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

serzh82saratov пишет:

Ну и по случаю, давно хотел себе сделать простенький таскман анк скриптов.

Интересно, тоже напишу себе что-то такое.

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

11

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

serzh82saratov пишет:

Ну и по случаю, давно хотел себе сделать простенький таскман анк скриптов.

Запустил. Сразу заругался, что в Shell32.dll нет иконки 262.

Исправил 262 на 26. Запустил. Скрипт сказал, что запущенных скриптов нет, хотя работало два скомпилированных скрипта (один AHK-clssic, второй AHK_L). Думаю, может скомпилированные скрипты добавить к отображаемым? Искать их по классу скрытого окна. Это так, мысли вслух.

Запустил, предварительно запустив нескомпилированный скрипт - всё нормально отобразил.

12

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

ypppu пишет:

Думаю, может скомпилированные скрипты добавить к отображаемым?

Да, скомпилированные добавить не помешает. Можно чекбокс сделать "Показывать скомпилированные скрипты".

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

13

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Тут поинтересней есть.
Можно и скомпилированные, но у меня их и небыло никогда.
Сделал просто для личных нужд, как подпрограмму в "основной" скрипт. Ну и как пример поиска запущенных скриптов для ТС.

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

14

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Не хватает динамического отслеживания памяти, занимаемой процессом, и загрузки процессора.

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

15

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Искать их по классу скрытого окна.

Не могу придумать, как определить хэндл основного окна зная пид скрипта.

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

16

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

serzh82saratov пишет:

Не могу придумать, как определить хэндл основного окна зная пид скрипта.

Наверное так:

WinGet, OutputVar, ID, ahk_pid %ПеременнаяСодержащаяPID%

Искать их по классу скрытого окна.

Я имел в виду


DetectHiddenWindows, On
WinGet, OutputVar, list, ahk_class AutoHotkey
MsgBox, %OutputVar% `r`n %OutputVar1% `r`n %OutputVar2% `r`n %OutputVar3%
Return

17

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Мне например хочется показать только главное окно скрипта, как это сделать.

DetectHiddenWindows, On
Gui, +Toolwindow
Gui, Show, w111 h111 NA
1::
    MouseGetPos, , , winid 
    WinGet, PID, PID, ahk_id %winid% 
    WinGet, OutputVar, List, ahk_pid %PID%
 
    List =
    Loop % OutputVar
        List .= OutputVar%A_Index% "`n"
    ToolTip % List "`n" A_ScriptHwnd 

    ; Хочу показать только главное
    ; WinShow  % "ahk_id" OutputVar%ScriptHwnd%
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Мне например хочется показать только главное окно скрипта, как это сделать.

В каком смысле?  От чего Вы отталкиваетесь?

19

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

В смысле отталкиваюсь. Просто интересно по каким признакам можно определить именно главное окно скрипта.

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

20

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

У основного окна класс AutoHotkey. У GUI-окна класс AutoHotkeyGUI.

21

Re: AHK: Запрещение вывода сообщений. Закрытие после сбоя

Точно! А Я и не заметил.

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