1 (изменено: mih, 2011-10-27 21:31:31)

Тема: AHK: Как определить аргументы командной строки, запустившей процесс?

Программы ProcessExplorer, Process Hacker позволяют видеть полную командную строку с аргументами, запустившую процесс. Как её получить в AHK ?

2

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

mih пишет:

Программы ProcessExplorer, Process Hacker позволяют видеть полную командную строку с аргументами, запустившую процесс. Как её получить в AHK ?

Там всё не очень просто. Если по пунктам:
1) нужно открыть целевой процесс с правами на чтение и получение информации(функция OpenProcess).
2) Затем нужно нужно получить информацию о процессе функцией NtQueryInformationProcess(второй аргумент ProcessBasicInformation).
3) В пункте 2 мы получили структуру PROCESS_BASIC_INFORMATION, вторым параметром которой является указатель на другую  структуру- PEB. Она-то нас и интересует.
4) Эта замечательная структура описана в MSDN не слишком подробно(link), но нам хватит(в интернете можно найти и полное описание). Эта структура находится в целевом процессе(См. ReadProcessMemory). Там нас интересует ссылка на структуру RTL_USER_PROCESS_PARAMETERS.
5) Описание RTL_USER_PROCESS_PARAMETERS см. тут или тут(полное). И там мы обнаруживаем параметр CommandLine, который и содержит командную строку, переданную процессу при запуске.
С какого места непонятно?

3

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

mih, еще пример в справке:

; Example #5: Retrieves a list of running processes via COM.

Gui, Add, ListView, x2 y0 w400 h500, Process Name|Command Line
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    LV_Add("", process.Name, process.CommandLine)
Gui, Show,, Process List

; Win32_Process: http://msdn.microsoft.com/en-us/library/aa394372.aspx

4 (изменено: mih, 2011-10-27 23:09:27)

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

Александр_, в светлой рамочке — понятно, а дальше я, конечно, не осилю, мягко говоря.
Может быть, встречалось что-нибудь консольное для рестарта? — я ради него спрашивал.
______________
доб.: creature.ws, спасибо! Как бы это ещё для рестарта приспособить, надо подумать.

5

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

mih пишет:

Может быть, встречалось что-нибудь консольное для рестарта? — я ради него спрашивал.

shutdown -r?

6 (изменено: mih, 2011-10-28 00:50:06)

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

Александр_, не системы — процесса, запущенного с параметрами (запустил не я, поэтому параметры заранее не известны). Нет, я поторопился — мне не достаточно рестарта, нужно получить именно строку параметров процесса с конкретным PID.

7

Re: AHK: Как определить аргументы командной строки, запустившей процесс?


Process, Exist
pid := ErrorLevel

for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") ; цикл  перебора всех запущенных процессов
  If (process.ProcessId = pid)           ; сравнение pid текущего процесса из списка процессов с неким значением
    cmdline := process.CommandLine       ; сохранение commandline в переменную
    
Run %cmdline%                            ; использование сохранённой строки

в данном случае используется pid процесса выполняющего текущий скрипт

8 (изменено: mih, 2011-10-28 02:25:55)

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

creature.ws — спасибо тебе ещё раз; я час смотрел в тот пример, ничего сделать с ним не мог. Это работает; именно то, что нужно.
Александр_, спасибо за участие.

9

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

Выражаю огромную благодарность creature.ws за это замечательное компактное решение!

10 (изменено: ComSyntax, 2012-05-11 01:22:49)

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

Помогите, пожалуйста:)
Каким образам изменить ниже приведенный код так, чтобы скомпилированная программа на AutoHotkey действовала не по всей области Фотошопа, а только в определенной ее области?
А именно в области ClassNN:PSViewC33.

>>>>>>>>>( Now Under Mouse Cursor )<<<<<<<<
ClassNN: PSViewC33
Text:
Color:
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<

#SingleInstance ignore
Run, Photoshop.exe, , Max UseErrorLevel
if ErrorLevel = ERROR
    {
    MsgBox При запуске программы Photoshop произошла ошибка. Пожалуйста, попробуйте снова.
    ExitApp
    }
WinWaitActive ahk_class Photoshop
SetTimer Check, 2000
Return

#IfWinActive ahk_class Photoshop
WheelDown::Send, {)} 
WheelUp::Send, {(} 
MButton & WheelDown:: Send, {f}
MButton & WheelUp::Send, {n}

Check:
  IfWinNotExist ahk_class Photoshop
    {  
    ExitApp
    } 
Return

11

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

ComSyntax, прежде чем задать вопрос, нужно ознакомиться с Правилами форума, и ещё вот с этой статьёй.

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

12

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

ComSyntax, как твой вопрос связан с названием данной темы? Тебе тонкий намёк.

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

13

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

teadrinker пишет:

ComSyntax, как твой вопрос связан с названием данной темы? Тебе тонкий намёк.

Как причина со следствием...

14

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

Я создам новую тему как и полагается, прошу прощение за флуд:)

15

Re: AHK: Как определить аргументы командной строки, запустившей процесс?

creature.ws
Почему-то у меня этот код всегда находит только одни процесс - скрипта АНК. А я так понимаю, что он должен перебрать все активные процессы и выбрать из них тот, который If=
Подскажите, пожалуйста, как его подправить, чтобы можно было находить ВСЕ процессы с определенного диска и закрывать их.