1 (изменено: stuermer, 2023-05-28 15:42:19)

Тема: AHK: Подсчет количества нефоновых процессов

Есть функция, которая считает количество процессов с одиноковым именем:

DuplicateProcessCount()
{
	NrOfPrcs := 0, PrcName := "IpTvPlayer.exe"
	for Prc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
		NrOfPrcs += Prc.Name = PrcName
	; MsgBox,% NrOfPrcs " " PrcName
	Return NrOfPrcs
}

Но она не различает фоновые и нефоновые процессы. Возможно ли подправить, чтобы она считала только нефоновые процессы?

2

Re: AHK: Подсчет количества нефоновых процессов

Я раньше не слыхал про "фоновые" и "нефоновые" процессы. Что это такое, в чём разница?

3 (изменено: __Михаил__, 2023-05-28 18:05:25)

Re: AHK: Подсчет количества нефоновых процессов

stuermer, Проверьте код:

DuplicateProcessCount(PrcName){
 For Prc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
  NrOfPrcs += (Prc.Name = PrcName And Prc.ProcessID > 0)
 Return NrOfPrcs
}
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4 (изменено: stuermer, 2023-05-28 18:28:56)

Re: AHK: Подсчет количества нефоновых процессов

Проверил, скобки не было одной:

DuplicateProcessCount(PrcName)
{
	NrOfPrcs := 0
	For Prc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
	{
		If (Prc.Name = PrcName) And (Prc.ProcessID > 0)
		NrOfPrcs++
	}
	MsgBox,% NrOfPrcs " " PrcName
	Return NrOfPrcs
}

Находит 2 процесса, когда 1 фоновый, а другой одноименный - приложение.
В диспетчере задач у фонового процесса этой программы командная строка показана с параметром /agent. Может это отличие поможет, если нет универсального способа. Но тогда функция будет работать только для этой конкретной программы.

ypppu, фоновые процессы это те, которые в трее. Нефоновые это приложения в диспетчере задач.

5

Re: AHK: Подсчет количества нефоновых процессов

Фоновый процесс — это процесс, не требующий взаимодействия с пользователем, не важно, есть ли у него иконка в трее. В Диспетчере задач есть все процессы.

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

6

Re: AHK: Подсчет количества нефоновых процессов

Если есть иконка, то есть и взаимодействие, иначе зачем она. В таком случае фоновый ли он?

7

Re: AHK: Подсчет количества нефоновых процессов

В этом случае он может быть и таким, и таким. Иконка, например, может использоваться только для вызова окна настроек.

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

8

Re: AHK: Подсчет количества нефоновых процессов

Тогда всё упирается в понятие "взаимодействие с пользователем". Настройки, на мой взгляд, те же команды. И если они отдаются в окне приложения, будь оно даже окно настроек, то есть ли принципиальная разница с командами в другом окне?

9

Re: AHK: Подсчет количества нефоновых процессов

Фоновый процесс это процесс, который находится в разделе "фоновые процессы" в диспетчере задач. У него может быть "тезка" в разделе "Приложения."

10

Re: AHK: Подсчет количества нефоновых процессов

Тут все просто.
https://devblogs.microsoft.com/oldnewth … 0/?p=97606

11

Re: AHK: Подсчет количества нефоновых процессов

Как это выгдядеть будет?
IsProcessCritical(Prc) не компилируется.

12

Re: AHK: Подсчет количества нефоновых процессов

Проверяйте есть ли у процесса видимое окно - если есть, то процесс нефоновый.

13 (изменено: Malcev, 2023-05-29 17:22:47)

Re: AHK: Подсчет количества нефоновых процессов

Хотя решил проверить и оказалось, что не совсем так.
Вначале надо проверить, что процесс критичный/некритичный, а потом уже проверять все некритичные на видимое окно.

pid := 7300
hProcess := DllCall("OpenProcess", "uint", 0x1000, "int", 0, "uint", pid, "ptr")
DllCall("IsProcessCritical", "ptr", hProcess, "int*", bool)
DllCall("CloseHandle", "ptr", hProcess)
msgbox % bool 

Кстати, после установки недокументированной RtlSetProcessIsCritical, при завершении процесса получаем BSOD.
https://www.codeproject.com/Articles/43 … essIsCriti

14 (изменено: stuermer, 2023-05-30 21:03:03)

Re: AHK: Подсчет количества нефоновых процессов

Достаточно проверить на критичность. Если у программы Lingvo.exe [16.2.2.133] снять 2 фоновых процесса вручную, то она продолжает работать без свернутых окон и без трея. При этом она нефоновая.

15 (изменено: stuermer, 2023-05-31 20:18:19)

Re: AHK: Подсчет количества нефоновых процессов

Подскажите, чего не работает? Хочу вывести командную строку процесса.

For Prc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
	If InStr(Prc.ExecutablePath, "agent")
	{
		PrcID = Prc.ProcessID
		PrcPath = Prc.ExecutablePath
	}
MsgBox % "" PrcPath

Выводит "Prc.ExecutablePath"

16

Re: AHK: Подсчет количества нефоновых процессов

Читайте Variables and Expressions.

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

17 (изменено: stuermer, 2023-06-01 17:48:45)

Re: AHK: Подсчет количества нефоновых процессов

.CommandLine и .ExecutablePath содержат только командную строку в кавычках, а нужно найти и вывести с параметром после ковычек: /agent .
Как сделать? Перебрал почти все Properties Win32_Process class:

https://learn.microsoft.com/uk-ua/windo … 32-process

For Prc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
	If InStr(Prc.ExecutablePath, "player")
	{
		PrcPath := Prc.ExecutablePath ; .CommandLine
	}
MsgBox % "" PrcPath

18

Re: AHK: Подсчет количества нефоновых процессов

Разве параметры не часть командной строки?

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

19 (изменено: stuermer, 2023-06-01 17:47:48)

Re: AHK: Подсчет количества нефоновых процессов

По логике .CommandLine и .ExecutablePath выходит, что нет. В диспетчере задач в разделе Командная строка написан путь в кавычках и параметр. Но эти свойства содержат только сам путь в кавычках без параметра.

20

Re: AHK: Подсчет количества нефоновых процессов

ExecutablePath не должен содержать параметров, в CommandLine они должны быть, если были при запуске процесса.

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

21 (изменено: stuermer, 2023-06-01 19:27:07)

Re: AHK: Подсчет количества нефоновых процессов

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