1 (изменено: predator, 2011-10-21 13:36:05)

Тема: AHK: Приостановить процесс - с возможностью его возобновления

Возникла необходимость автоматизировать следующие действие.
Windows 7: есть приложение "Монитор ресурсов", где можно выбрать запущенный процесс и приостановить его выполнение.
В последующем, можно продолжить выполнение процесса.
Возможно ли выполнить данную команду с помощью скрипта?

2

Re: AHK: Приостановить процесс - с возможностью его возобновления

predator, читаем первую тему на странице, редактируем заголовок.

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

3

Re: AHK: Приостановить процесс - с возможностью его возобновления

Думаю, можно. А какой процесс интересует?

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

4

Re: AHK: Приостановить процесс - с возможностью его возобновления

Остановить все потоки процесса .

5 (изменено: mih, 2011-10-21 21:53:54)

Re: AHK: Приостановить процесс - с возможностью его возобновления

pausep.exe — на WinXP работает.

6

Re: AHK: Приостановить процесс - с возможностью его возобновления

mih пишет:

pausep.exe — на WinXP работает.

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

7

Re: AHK: Приостановить процесс - с возможностью его возобновления

predator пишет:

Но, меня интересовала возможность сделать это посредством AHK.

Что именно не ясно- как получить список потоков или как останавливать/запускать потоки?

8

Re: AHK: Приостановить процесс - с возможностью его возобновления

Мне не понятно как поставить программу на паузу (вернее будет - приостановить/запустить потоки).

F1::Run, uTorrent.exe, C:\Program Files (x86)\uTorrent,, uTorrentID ; запуск программы
F2::Process, Close, %uTorrentID% ; закроет программу, а мне надо приостановить...

9 (изменено: mih, 2011-10-23 22:37:06)

Re: AHK: Приостановить процесс - с возможностью его возобновления

F1:: run notepad.exe,,,OutputVarPID
F2:: run pausep.exe %OutputVarPID% ,,hide
F3:: run pausep.exe %OutputVarPID% /r ,,hide

Количество нажатий f2 д.б. равно количеству нажатий f3.

10 (изменено: Александр_, 2011-10-24 11:37:21)

Re: AHK: Приостановить процесс - с возможностью его возобновления

predator пишет:

Мне не понятно как поставить программу на паузу (вернее будет - приостановить/запустить потоки).

Пример программы на AHK:

Unicode          := A_IsUnicode ? "W" : ""

TH32CS_SNAPPROCESS := 0x00000002
TH32CS_SNAPTHREAD  := 0x00000004 
CreateToolhelp32Snapshot(Flags, th32ProcessID)
{
   return DllCall("CreateToolhelp32Snapshot", "int", Flags, "int", th32ProcessID)
}
 
Process32First(hSnapshot, pe)
{
   global Unicode
   return DllCall("Process32First" . Unicode, "int", hSnapshot, "int", pe)
}
 
Process32Next(hSnapshot, pe)
{
   global Unicode
   return DllCall("Process32Next" . Unicode, "int", hSnapshot, "int", pe)
}
 
Thread32First(hSnapshot, te)
{
   return DllCall("Thread32First", "int", hSnapshot, "int", te)
}
 
Thread32Next(hSnapshot, te)
{
   return DllCall("Thread32Next", "int", hSnapshot, "int", te)
}
 
THREAD_SUSPEND_RESUME := 0x0002
OpenThread(DesiredAccess, InheritHandle, ThreadId)
{
   return DllCall("OpenThread" , "int", DesiredAccess, "int", InheritHandle, "int", ThreadId)
}
 
SuspendThread(hThread)
{
   return DllCall("SuspendThread", "int", hThread)
}
 
ResumeThread(hThread)
{
   return DllCall("ResumeThread", "int", hThread)
}
 
CloseHandle(Handle)
{
   return DllCall("CloseHandle", "int", Handle)
}
 
Gui Add, Button, x10 y5 w75 gL_Update, Обновить
Gui Add, Button, x100 y5 w75 gL_Stop, Stop
Gui Add, Button, x200 y5 w75 gL_Start, Start
Gui Add, ListView, x10 y35 r20 w450 -Multi, PID|имя процесса|статус
LV_ModifyCol(1, 50)
LV_ModifyCol(2, 300)
LV_ModifyCol(3, 50)
Update()
Gui Show
return
 
L_Update:
   Update()
return
 
L_Stop:
   Stop()
return
 
L_Start:
   Start()
return
 
Start()
{
   global TH32CS_SNAPTHREAD, THREAD_SUSPEND_RESUME
   row := LV_GetNext(0, "Focused")
   LV_GetText(id, row)
   hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, id)
   VarSetCapacity(te, 28)
   NumPut(28, te, 0)
   str := ""
   test := Thread32First(hSnapshot, &te)
   while test
   {
      if (id=NumGet(te, 12))
      {
         hThread := OpenThread(THREAD_SUSPEND_RESUME, 0, NumGet(te, 8))
         if (hThread=0)
         {
            LV_Modify(row, "Col3" , "-1 (" . a_lasterror . ")")
            CloseHandle(hSnapshot)
            return
         }
         ret := ResumeThread(hThread)
         CloseHandle(hThread)
      }
      test := Thread32Next(hSnapshot, &te)
   }
   CloseHandle(hSnapshot)
   LV_Modify(row, "Col3" , ret=0 ? 0 : ret-1)
}
 
Stop()
{
   global TH32CS_SNAPTHREAD, THREAD_SUSPEND_RESUME
   row := LV_GetNext(0, "Focused")
   LV_GetText(id, row)
   hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, id)
   VarSetCapacity(te, 28)
   NumPut(28, te, 0)
   test := Thread32First(hSnapshot, &te)
   while test
   {
      if (id=NumGet(te, 12))
      {
         hThread := OpenThread(THREAD_SUSPEND_RESUME, 0, NumGet(te, 8))
         if (hThread=0)
         {
            LV_Modify(row, "Col3" , "-1 (" . a_lasterror . ")")
            CloseHandle(hSnapshot)
               return
         }
         ret := SuspendThread(hThread)
         CloseHandle(hThread)
      }
      test := Thread32Next(hSnapshot, &te)
   }
   CloseHandle(hSnapshot)
   LV_Modify(row, "Col3" , ret+1)
}
 
Update()
{
   global TH32CS_SNAPPROCESS
   LV_Delete()
   hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
   pesize := A_IsUnicode ? 556 : 296
   VarSetCapacity(pe, pesize)
   NumPut(pesize, pe, 0)
   test := Process32First(hSnapshot, &pe)
   while test
   {
      LV_Add("", NumGet(pe,8), StrGet(&pe+36),"?")
      test := Process32Next(hSnapshot, &pe)
   }
   CloseHandle(hSnapshot)
}
 
GuiClose:
   ExitApp
return

В первом столбце PID процесса, во втором имя модуля и в третьем счётчик остановок. Если счётчик равен нулю, то процесс запущен, в противном случае он приостановлен. Изначально третий столбец не заполнен, т.к. я не знаю как получить значение счётчика не запуская/останавливая потоки. Если значение в третьем столбце равно -1, значит не удалось получить доступ к процессу, в скобках будет указан код ошибки(обычно 5, из-за нехватки прав). Остановка своего процесса не предусмотрена, хотя в принципе возможна.
В самой программе функция Update обновляет список процессов, Start уменьшает значение счётчика остановок на единицу, а Stop увеличивает его(счётчик всегда больше или равен нулю).

11 (изменено: predator, 2011-10-24 08:19:48)

Re: AHK: Приостановить процесс - с возможностью его возобновления

Увы, у меня не запустился скрипт: указывает на ошибку в строке  142.

http://s1.ipicture.ru/uploads/20111024/1ZOmrkDL.png

Оболочка программы не нужна.
Необходимо с помощью скрипта:
1. Запустить конкретную программу (aaa.exe).
2. Получить  ее ID.
3. Приостановить/поставить на паузу процесс.
4. Возобновить.

12

Re: AHK: Приостановить процесс - с возможностью его возобновления

predator пишет:

Увы, у меня не запустился скрипт: указывает на ошибку в строке  142.

Либо используйте AutoHotkey_L, либо напишите свою функцию StrGet, которая конвертирует null-terminate строку в формат ahk.

predator пишет:

Оболочка программы не нужна.

Ну дык убери её //_-.

predator пишет:

1. Запустить конкретную программу (aaa.exe).
2. Получить  ее ID.

Пример использования функции Run был ранее в этой теме.

predator пишет:

3. Приостановить/поставить на паузу процесс.

См. функцию Stop.

predator пишет:

4. Возобновить.

См. функцию Start. Только вместо

ret := ResumeThread(hThread)

нужно составить цикл, выполняющийся пока ret>1.

13

Re: AHK: Приостановить процесс - с возможностью его возобновления

Спасибо большое за помощь.