Page 1 sur 1
[R] Parent: Déterminer comment est appellé le prog
Posté : lun. 08 juil. 2013 14:37
par fred39
Bonjour,
Comment Déterminer la méthode d'appel d'un programme?
Je voudrais faire en sorte que si mon programme est appelé par double clic, ou un clic + "enter"; les logs de celui-ci s'affichent dans une msgbox.
Mais si il est appelé par un batch ou autre programme (script de login par exemple=), Consolewrite() alimenterait mon fichier de log.
exemple:
mon_programme.exe >>mon_log.txt.
Je ne sais pas comment déterminer celà.
$cmdline[0], ou $cmdlineraw ne renvoient rien dans les 2 cas.
Si quelqu'un a une solution....
ou une piste...

Merci
Fred
Re: [..] Parent: Déterminer comment est appellé le prog
Posté : lun. 08 juil. 2013 14:48
par TopXm
Hello
Justement, tu pourrais passer un paramètre à ton programme lors d'un appel en batch, par exemple :
A ce moment là tu aurais
Et tu traites dans ton code selon le paramètre passé

Re: [..] Parent: Déterminer comment est appellé le prog
Posté : lun. 08 juil. 2013 15:11
par fred39
Merci TopXm pour ta réponse.
J'avais bien pensé à ça,
Le hic, c'est que je ne suis pas forcément maitre du script appelant.
En fait, il faudrait plutôt que je puisse faire:
if mon_programme.exe est appelé par un double clic then
msgbox (.....)
Else
Consolewrite(....)
endif

Re: [..] Parent: Déterminer comment est appellé le prog
Posté : lun. 08 juil. 2013 20:21
par alex1205
J'ai fait un code a l'arrache :
Code : Tout sélectionner
#include <Array.au3>
If IsArray($CMDLine) And $CMDLine[0] > 1 Then
;CMD
_ArrayDisplay($CMDLine)
Else
;Double Clic
MsgBox(0, "AUTOIT3", "ouvert avec double clic")
EndIf
;par exemple, dans cmd, faire monprog.exe /silencieux /install
;ca va afficher (dans _ArrayDisplay)
;[0] 1
;[1] /silencieux
;[2] /install
Re: [..] Parent: Déterminer comment est appellé le prog
Posté : lun. 08 juil. 2013 23:48
par fred39
Merci Alex 1205.
Le hic, c'est que les chevrons >> qui permettraient de loguer les retours de consolewrite dans un fichier de log laissent $cmdline[0] à 0.
Exemple: si j'appelle mon programme de la manière suivante:
mon_programme.exe >>mon_log.txt
dans ce cas $cmdline[0] reste à 0
Est-il possible de déterminer si le programme est exécuté suite à un double clic?
Re: [..] Parent: Déterminer comment est appellé le prog
Posté : mar. 09 juil. 2013 01:36
par jchd
Est-il possible de déterminer si le programme est exécuté suite à un double clic?
Pas facile ça, il faudrait être dalife à la place du calife.
Par contre, si le process parent est cmd.exe, alors l'appli a été lancée par un batch.
Re: [..] Parent: Déterminer comment est appellé le prog
Posté : mar. 09 juil. 2013 10:36
par jguinch
Salut
Comme l'a dit jchd, c'est pas simple.
Ce qui est possible de faire facilement, c'est effectivement détecter le process parent, ce qui pourra t'aider à savoir si le prog a été lancé dans l'explorer, un script ou autre :
► Afficher le texte
Code : Tout sélectionner
$parentPid = _ProcessGetParent(@AutoItPID)
$parentProcess = _ProcessGetNameFromPID($parentPid)
If $parentProcess = "explorer.exe" Then
MsgBox(0, "", "Le programme a été lancé depuis l'explorer")
ElseIf $parentProcess = "cmd.exe" Then
MsgBox(0, "", "Le programme a été lancé par un script")
Else
MsgBox(0, "", "Le programme a été lancé par " & $parentProcess)
EndIf
Func _ProcessGetParent($i_pid)
Local Const $TH32CS_SNAPPROCESS = 0x00000002
Local $a_tool_help = DllCall("Kernel32.dll", "long", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPPROCESS, "int", 0)
If IsArray($a_tool_help) = 0 Or $a_tool_help[0] = -1 Then Return SetError(1, 0, $i_pid)
Local $tagPROCESSENTRY32 = _
DllStructCreate _
( _
"dword dwsize;" & _
"dword cntUsage;" & _
"dword th32ProcessID;" & _
"uint th32DefaultHeapID;" & _
"dword th32ModuleID;" & _
"dword cntThreads;" & _
"dword th32ParentProcessID;" & _
"long pcPriClassBase;" & _
"dword dwFlags;" & _
"char szExeFile[260]" _
)
DllStructSetData($tagPROCESSENTRY32, 1, DllStructGetSize($tagPROCESSENTRY32))
Local $p_PROCESSENTRY32 = DllStructGetPtr($tagPROCESSENTRY32)
Local $a_pfirst = DllCall("Kernel32.dll", "int", "Process32First", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)
If IsArray($a_pfirst) = 0 Then Return SetError(2, 0, $i_pid)
Local $a_pnext, $i_return = 0
If DllStructGetData($tagPROCESSENTRY32, "th32ProcessID") = $i_pid Then
$i_return = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")
DllCall("Kernel32.dll", "int", "CloseHandle", "long", $a_tool_help[0])
If $i_return Then Return $i_return
Return $i_pid
EndIf
While 1
$a_pnext = DLLCall("Kernel32.dll", "int", "Process32Next", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)
If IsArray($a_pnext) And $a_pnext[0] = 0 Then ExitLoop
If DllStructGetData($tagPROCESSENTRY32, "th32ProcessID") = $i_pid Then
$i_return = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")
If $i_return Then ExitLoop
$i_return = $i_pid
ExitLoop
EndIf
WEnd
If $i_return = "" Then $i_return = $i_pid
DllCall("Kernel32.dll", "int", "CloseHandle", "long", $a_tool_help[0])
Return $i_return
EndFunc
Func _ProcessGetNameFromPID($iPid)
$aList = ProcessList()
If @error Then Return 0
For $i = 1 To $aList[0][0]
If $aList[$i][1] = $iPid Then Return $aList[$i][0]
Next
Return 0
EndFunc
Maintenant, pour savoir si le lancement a été effectué par double clic ou entrée, il faudrait un autre script qui surveille en permanence, mais là tu vas me dire que c'est pas possible...
Juste pour mieux comprendre, quel est le l'intérêt de faire cette différence ?
Re: [R] Parent: Déterminer comment est appellé le prog
Posté : mar. 09 juil. 2013 11:04
par fred39
Bonjour,
merci à Jchd, et Jguinch.
C'est juste ce qu'il me faut.
le parent process.
Pour répondre à ta question Jguinch,
l'intérêt de cette différence est:
On fait pas mal d'outils en autoit, pour installer des logiciels, ou diverses autres actions.
Ces outils loguent les erreurs ou autres infos.
Si un outil est lancé par une action de l'utilisateur: (parent explorer) j'utiliserai une message box.
Si l'outils est appelé lors d'un script de login, je log différemment, avec consolewrite par exemple.
Bonne journée.

Re: [R] Parent: Déterminer comment est appellé le prog
Posté : mar. 09 juil. 2013 13:43
par jguinch
content d'avoir pu t'aider voisin !
