Что нового

[Процессы] Откуда запущен процесс

Papazol

Новичок
Сообщения
16
Репутация
1
Может ли скомпилированный скрипт определить, откуда он был запущен: из автозагрузки или, например, с ярлыка?
 
Автор
P

Papazol

Новичок
Сообщения
16
Репутация
1
Спасибо, посмотрел, надо разбираться, но, к сожалению, я ничего не смыслю в DLL и связанном с ними. Как я понял, вариантов запуска может быть несколько больше двух, и эту информацию можно извлечь. Мне нужно определить, с автозапуска или нет.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Papazol [?]
Мне нужно определить, с автозапуска или нет.
Пропишите при автозапуске определенный параметр (ключ) и проверяйте его наличие.
 
Автор
P

Papazol

Новичок
Сообщения
16
Репутация
1
C ключом идея хорошая, только носом бы ткнуться куда надо.
А вот функция получения пути процесса выдаёт одно и то же что при старте с экзешника, что при автозапуске, процесс ведь один и тот же.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Papazol сказал(а):
только носом бы ткнуться куда надо.
Попробуйте примерно так, только скомпилируйте.
Код:
#NoTrayIcon
#include <StructureConstants.au3>

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

If Not @Compiled Then
	MsgBox(16, 'Error', 'Run only compiled')
	Exit
EndIf

HotKeySet('1', '_AvtoRun'); 1 - AvtoRun
HotKeySet('2', '_DelAvtoRun'); 2 - DelAvtoRun
HotKeySet('3', '_CreateShortcut'); 3 - CreateShortcut
HotKeySet('4', '_Info'); 4 - Info
HotKeySet('5', '_Exit'); 5 - Exit
While 1
	Sleep(1000)
	ToolTip(StringFormat('%02d:%02d:%02d\nAvtoRun - Key 1\nDelAvtoRun - Key 2\nCreateShortcut - Key 3\nInfo - Key 4\nExit - Key 5', @HOUR, @MIN, @SEC), 0, 0)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _Info()
	If $CmdLine[0] Then
		If $CmdLine[1] == 'AvtoRun' Then
			MsgBox(64, 'Info', 'AvtoRun ')
			Return
		EndIf
	EndIf
	Local $s_Shortcut = _Start_Shortcut()
	If Not @error Then
		If $s_Shortcut Then
			MsgBox(64, 'Info', 'Процесс запущен ярлыком' & @LF & 'Путь к нему: ' & $s_Shortcut)
		Else
			MsgBox(64, 'Info', 'Процесс запущен' & @LF & 'не ярлыком')
		EndIf
	EndIf
	Return
EndFunc   ;==>_Info

Func _CreateShortcut()
	FileCreateShortcut(@ScriptFullPath, @DesktopDir & '\Test_Lnk.lnk')
EndFunc   ;==>_CreateShortcut

Func _DelAvtoRun()
	Local $s_Reg = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run'
	RegDelete($s_Reg, @ScriptName)
EndFunc   ;==>_DelAvtoRun

Func _AvtoRun()
	Local $s_Reg = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run'
	RegWrite($s_Reg, @ScriptName, 'REG_SZ', '"' & @ScriptFullPath & '" AvtoRun')
EndFunc   ;==>_AvtoRun

Func _Start_Shortcut()
	Local $t_Startup, $b_Flag, $STARTF_TITLESHORTCUT = 0x800, $iMAX_PATH = 260, $t_Title, $s_ShortcutPath

	$t_Startup = DllStructCreate($tagSTARTUPINFO)
	DllStructSetData($t_Startup, 'Size', DllStructGetSize($t_Startup))
	DllCall('kernel32.dll', 'none', 'GetStartupInfoW', 'ptr', DllStructGetPtr($t_Startup))
	If @error Then Return SetError(1, 0, -1)
	$b_Flag = DllStructGetData($t_Startup, 'Flags')
	If BitAND($b_Flag, $STARTF_TITLESHORTCUT) Then
		$t_Title = DllStructCreate('wchar ShortcutPath[' & $iMAX_PATH + 1 & ']', DllStructGetData($t_Startup, 'Title'))
		$s_ShortcutPath = DllStructGetData($t_Title, 'ShortcutPath')
		If $s_ShortcutPath Then
			Return SetError(0, 0, $s_ShortcutPath)
		Else
			Return SetError(1, 0, -1)
		EndIf
	Else
		Return SetError(0, 0, 0)
	EndIf
EndFunc   ;==>_Start_Shortcut
 
Автор
P

Papazol

Новичок
Сообщения
16
Репутация
1
Это не то. Прописать себя в авторан и удалить себя же оттуда моя программа может. Но факт того, что она прописана в авторан, не означает на все 100%, что она всегда будет стартовать исключительно с авторана. Просто если она стартует с авторана, то я даю задержку на начало активных действий программы, чтобы успели загрузиться все дрова, антивирусы/файрволы и осуществиться подключение к Интернету. Если она стартует "с руки", в задержке нет необходимости. Если бы я мог самой программой определять, кто её запустил, я тогда бы сделал разветвление, а сейчас задержка делается всегда, что неудобно.
Я подумал, что можно как-либо искусственно поставить флажок "авторан", а потом его проверить, но чаго-то не получается.

Вот сейчас пришла идея... Что если сделать два ярлыка: один для ручного запуска программы, а другой для авторана, и его прописывать? Тогда точно программа отличит, какой ярлык её запустил. Надо попробовать.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Papazol сказал(а):
Я подумал, что можно как-либо искусственно поставить флажок "авторан", а потом его проверить, но чаго-то не получается.

Так вроде же madmasles это и написал. Из Run ваша программа стартует с параметром "AvtoRun", во всех остальных случаях без этого параметра. Правда логичнее придумать осмысленный параметр, например "/delay".
 
Автор
P

Papazol

Новичок
Сообщения
16
Репутация
1
Не нашёл я, как проверить этот параметр "AvtoRun".
Но зато удалось осуществить свою последнюю идею насчёт отдельного ярлыка для авторана. Это работает. Хотя довести до логического конца метод madmasles тоже стОит, хотя бы для самообразования.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
If ($CmdLine[0]) And ($CmdLine[1] = '/delay') Then
	Sleep(10000)
EndIf
 
Автор
P

Papazol

Новичок
Сообщения
16
Репутация
1
Всё, спасибо, я сам нашёл. Сделал, всё работает.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Papazol [?]
Всё, спасибо, я сам нашёл. Сделал, всё работает.
если твое решение не совпадает с приведенными выше, было бы хорошим тоном выложить его здесь
 
Автор
P

Papazol

Новичок
Сообщения
16
Репутация
1
Да так же всё сделал. Просто освоение языка идёт медленно, но я всё-таки нашёл решение сам! Приведу всё же текст того, что сделал, конечно, в усечённом виде.
Код:
#include <GUIConstantsEx.au3>

$IniFile = StringTrimRight ( @ScriptFullPath, 3 ) & 'ini'									; путь к ini-файлу
$RegPath = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'								; раздел реестра, отвечающий за автозагрузку

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;			ЗАПУСК БЕЗ ini-ФАЙЛА	   ;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

If Not FileExists ( $IniFile ) Then																; если ini файла нет, будем его создавать

   GUICreate ( 'Test', 250, 165 )
   GUISetBkColor(0x00E0FFFF)

   $AutoRunCheckBox = GUICtrlCreateCheckbox ( 'Автозагрузка программы', 10, 10, 230, 20 )
   GUICtrlSetTip ( $AutoRunCheckBox, 'Требуется ли помещать программу в автозагрузку?' )

   $PauseCombo = GUICtrlCreateCombo ( '', 10, 100, 230, 20 )
   GUICtrlSetData ( -1,"Пауза, с|10|20|30|40|50|60|70|80|90|100|110|120","Пауза, с" )
   GUICtrlSetTip ( $PauseCombo, 'Время задержки между стартом программы и началом работы' )

   $OKButton = GUICtrlCreateButton ( 'Готово', 10, 130, 230, 20 )

   GUISetState ()

   While 1
	  $Msg = GUIGetMsg ()																		; получаем сообщение от GUI
	  Select
		 Case $Msg = $OKButton																	; если нажата кнопка ГОТОВО
			$AutoRun = GUICtrlRead ( $AutoRunCheckBox )											; читаем состояния элементов
			$Pause = GUICtrlRead ( $PauseCombo )
		 
			Select
			   Case $AutoRun = $GUI_CHECKED														; автозагрузка выбрана
				  RegWrite ( $RegPath, "Test", "REG_SZ", '"' & @ScriptFullPath & '" -delay' )	; добавляем скрипт в автозагрузку
				  If $Pause = 'Пауза, с' Then													; тогда и пауза должна быть выбрана
					 MsgBox ( 0, 'Test', 'Укажите время паузы.' )								; ... сообщаем об этом и...
					 ContinueLoop																; ... ждём, пока выберут
				  Else																			; если пауза выбрана,..
					 IniWrite ( $IniFile, "MAIN", "Pause", $Pause )								; ... заносим её в ini
				  EndIf

			   Case $AutoRun = $GUI_UNCHECKED													; автозагрузка не выбрана
				  RegDelete ( $RegPath, "Test" )												; удаляем запись в реестре
				  If $Pause = 'Пауза, с' Then													; если пауза не выбрана,..
					 IniWrite ( $IniFile, "MAIN", "Pause", '0' )								; ... заносим в ini просто ноль
				  Else																			; если пауза выбрана,..
					 IniWrite ( $IniFile, "MAIN", "Pause", $Pause )								; ... заносим в ini выбранное значение
				  EndIf
			EndSelect
		 
			Sleep ( 100 )
			Run ( @ScriptFullPath )																; перезапускаем скрипт
			Exit																				; выходим
	  
		 Case $Msg = $GUI_EVENT_CLOSE
			Exit
	  EndSelect		 
   WEnd
EndIf

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;			ЗАПУСК ПРИ НАЛИЧИИ ini-ФАЙЛА	   ;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$Pause = IniRead ( $IniFile, "MAIN", "Pause", 60 )											; считываем данные из ini-файла

If $CmdLine[0] <> 0 And $CmdLine[1] = '-delay' Then											; если командная строка есть и в ней параметр
   TrayTip ( "Test", "Ожидание...", 120, 2 )												; выводим сообщение
   Sleep ( 1000 * Number ( $Pause ) )														; пауза после загрузки Windows
EndIf

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;			РАБОТА ПРОГРАММЫ				   ;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

TrayTip ( "Test", 'Программа работает, работает, работает...', 30, 1 )						; сообщаем радостную весть
Sleep ( 7000 )
TrayTip ( "Test", 'Закончила работать.', 2, 1 )
Sleep ( 2000 )
Exit
 
Верх