Page 1 sur 1

[TUTO] Démarrer plusieurs programmes à l'ouverture d'Hypersp

Publié : 24 août 2014 - 18:25
par Bopz44
Salut, vous connaissez très certainement tous la fonction Exit de Hyperhq qui vous permet de démarrer un programme a l'ouverture de Hyperspin et de le fermer lorsque vous quittez le frontend. Le problème est que l'on ne peut pas y insérer qu'un seul programme, assez ambetant quand on veut utiliser Xpadder, HyperSearch ou d'autres programmes specifiques au bon fonctionnement d'Hyperspin.

Pour y remedier on va creer un script AutoHotkey qui indiquera les programmes a exécuter ou a quitter.

1°) Récupérer le programme AutoHotkey sur le site officiel ICI, et l'installer.

2°) Aller dans le dossier Hyperspin, créer un nouveau document texte, et renommez le ; par exemple START (choisissez le nom a lui donner) et surtout renommez l'extention en ".ahk" (sans les guillemets)

3°) Click droit sur votre fichier nouvellement crée et la de nouvelles options auront ete ajoutés par AutoHotkey dont 'Edit Script'. Editez donc le script en y entrant ce code :

Code : Tout sélectionner

#NoEnv
#SingleInstance force
SetBatchLines, -1
SetWorkingDir, %A_ScriptDir%

IniRead, origValue, % A_WorkingDir . "\Settings\Settings.ini", Main, Hyperlaunch_Path
IniWrite, % SubStr(A_ScriptFullPath, 1, 1) . SubStr(origValue, 2), % A_WorkingDir . "\Settings\Settings.ini", Main, Hyperlaunch_Path

Run, .\
4°) Toute la premiere partie du code sert a rendre hyperspin portable ca n'a rien a voir avec ce tuto mais autant le mettre avec ca mange pas de pain   :D  

Maintenant interessons nous a la derniere ligne : Run, .\
Run, est la commande qui va executer le programme, tandis que .\ est un chemin relatif indiquant la localisation de depart de votre script :

Si par exemple votre script se trouve dans : C:\Hyperspin\START.ahk
Et que le programme que vous voulez lancer dans : C:\Hyperspin\HyperLaunch\Module Extensions\HyperSearch\HyperSearch.exe
Alors votre chemin relatif sera : .\HyperLaunch\Module Extensions\HyperSearch\HyperSearch.exe

Maintenant a vous d'indiquer dans le script le chemin du programme desiré, pour en rajouter un autre suffit d'ajouter une nouvelle ligne de commande. Voila par exemple le mien :

Code : Tout sélectionner

Run, .\HyperLaunch\Profiles\Xpadder\HyperSpin\p1.xpadderprofile
Run, .\ZZ-UTILS\HyperSearch\HyperSearch.exe
Run, .\ZZ-UTILS\NoMousy1.5\KILL MOUSE.exe
Run, .\ZZ-UTILS\NoMousy1.5\KILL TASK.exe
5°) Passons au script de sortie, creer un nouveau script par exemple 'EXIT.ahk' l'editer et y entrer le code :

Code : Tout sélectionner

#NoTrayIcon
#NoEnv
#Persistent
#SingleInstance force

Process Close, Xpadder.exe

DetectHiddenWindows, On
SetWorkingDir %A_ScriptDir%



NoTrayOrphans()
ExitApp
Return

NoTrayOrphans() {
TrayInfo:= TrayIcons(sExeName,"ahk_class Shell_TrayWnd","ToolbarWindow32" . GetTrayBar()) "`n"
. TrayIcons(sExeName,"ahk_class NotifyIconOverflowWindow","ToolbarWindow321")
Loop, Parse, TrayInfo, `n
{
ProcessName:= StrX(A_Loopfield, "| Process: ", " |")
ProcesshWnd:= StrX(A_Loopfield, "| hWnd: ", " |")
ProcessuID := StrX(A_Loopfield, "| uID: ", " |")
If !ProcessName ProcesshWnd
RemoveTrayIcon(ProcesshWnd, ProcessuID)
}
}
RemoveTrayIcon(hWnd, uID, nMsg = 0, hIcon = 0, nRemove = 2) {
NumPut(VarSetCapacity(ni,444,0), ni)
NumPut(hWnd , ni, 4)
NumPut(uID , ni, 8)
NumPut(1|2|4, ni,12)
NumPut(nMsg , ni,16)
NumPut(hIcon, ni,20)
Return DllCall("shell32\Shell_NotifyIconA", "Uint", nRemove, "Uint", ni)
}
TrayIcons(sExeName,traywindow,control) {
DetectHiddenWindows, On
WinGet, pidTaskbar, PID, %traywindow%
hProc:= DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pProc:= DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
SendMessage, 0x418, 0, 0, %control%, %traywindow%
Loop, %ErrorLevel%
{
SendMessage, 0x417, A_Index-1, pProc, %control%, %traywindow%
VarSetCapacity(btn,32,0), VarSetCapacity(nfo,32,0)
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", btn, "Uint", 32, "Uint", 0)
iBitmap := NumGet(btn, 0)
idn := NumGet(btn, 4)
Statyle := NumGet(btn, 8)
If dwData := NumGet(btn,12)
iString := NumGet(btn,16)
Else dwData := NumGet(btn,16,"int64"), iString:=NumGet(btn,24,"int64")
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", nfo, "Uint", 32, "Uint", 0)
If NumGet(btn,12)
hWnd := NumGet(nfo, 0)
, uID := NumGet(nfo, 4)
, nMsg := NumGet(nfo, 8)
, hIcon := NumGet(nfo,20)
Else hWnd := NumGet(nfo, 0,"int64"), uID:=NumGet(nfo, 8), nMsg:=NumGet(nfo,12), hIcon := NumGet(nfo,24)
WinGet, pid, PID, ahk_id %hWnd%
WinGet, sProcess, ProcessName, ahk_id %hWnd%
WinGetClass, sClass, ahk_id %hWnd%
If !sExeName || (sExeName = sProcess) || (sExeName = pid)
VarSetCapacity(sTooltip,128), VarSetCapacity(wTooltip,128*2)
, DllCall("ReadProcessMemory", "Uint", hProc, "Uint", iString, "Uint", wTooltip, "Uint", 128*2, "Uint", 0)
, DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "str", wTooltip, "int", -1, "str", sTooltip, "int", 128, "Uint", 0, "Uint", 0)
, sTrayIcons .= "idx: " . A_Index-1 . " | idn: " . idn . " | Pid: " . pid . " | uID: " . uID . " | MessageID: " . nMsg . " | hWnd: " . hWnd . " | Class: " . sClass . " | Process: " . sProcess . " | Icon: " . hIcon . " | Tooltip: " . wTooltip . "`n"
}
DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
return sTrayIcons
}
GetTrayBar() {
ControlGet, hParent, hWnd,, TrayNotifyWnd1 , ahk_class Shell_TrayWnd
ControlGet, hChild , hWnd,, ToolbarWindow321, ahk_id %hParent%
Loop {
ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
If Not hWnd
Break
Else If hWnd = %hChild%
{
idxTB := A_Index
Break
}
}
Return idxTB
}

StrX( H,BS="",ES="",Tr=1,ByRef OS=1) {
return,(SP := InStr(H,BS,0,OS)) (L := InStr(H,ES,0,SP+StrLen(BS))) (OS := L + StrLen(ES)) ? SubStr(H,SP := Tr ? SP + StrLen(BS) : SP ,(Tr ? L : L + StrLen(ES))-SP) : ""
}
Comme vous pouvez le voir ce code est beaucoup plus conséquent et pour une bonne raison :
Il y a souvent des bugs de rafraichissements lorsque certains programmes sont quittés avec AutoHotkey, en fait Windows les quitte proprement mais n'a pas le temps de rafraichir l'icone du programme dans la task bar en bas a droite, et vous seriez obliger de passer dessus avec votre souris pour qu'il disparaisse (pas très propre).
Ce script va faire le taff ni vu ni connu ;)

Intéressons nous donc a la ligne : Process Close,
Process Close, est la commande qui indique a AutoHotkey quel programme il doit fermer, suffit donc de rajouter le nom du prorgramme dans mon cas :

Code : Tout sélectionner

Process Close, Irotate.exe
Process Close, HyperSearch.exe
Process Close, Xpadder.exe
Process Close, KILL MOUSE.exe
Process Close, KILL TASK.exe
6°) Voila plus qu'a tester les scripts et les compiler, double click sur START.ahk, la logiquement les programmes que vous avez indiquer dans votre script se lancent ; double click sur EXIT.ahk, la logiquement les programmes lancés devraient se fermer.

Une fois satisfait faites un click droit sur votre script et clicker sur 'Compile Script' ca va vous creer un executable exe donc vous pouvez meme desinstaller autohotkey si vous voulez mais je vous conseille de le garder tant cet outil est utile :p

Il ne vous suffit plus qu'a indiquer dans votre fichier settings.ini le chemin de vos executable, dans mon cas je veux concerver la portabilité de Hyperspin j'ai donc mis mes 2 executables dans le meme dossier que mon Hyperspin.exe, du coup ma config ressemble a ca et tout roule impec ;) :

Code : Tout sélectionner

[Startup Program]
Executable=START.exe
Paramaters=
Working_Directory=
WinState=NORMAL
[Exit Program]
Executable=EXIT.exe
Paramaters=
Working_Directory=
WinState=NORMAL
Si vous avez des questions des remarques n'hésitez pas ;)

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyperspin

Publié : 24 août 2014 - 19:00
par camarade35
Joli Tuto, merci.

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 01 déc. 2014 - 07:02
par lankou910
bonjour

je viens essais c'est super astuce tres pratique mais car il y a toujour un mais
je n'arrive pas a le fais fonctionner.

de ce que j ai vus il manque des petite chose.Ici et la...
mon module
#NoTrayIcon
#NoEnv
#Persistent
#SingleInstance force

Process Close,

DetectHiddenWindows, On
SetWorkingDir %A_ScriptDir%



NoTrayOrphans()
ExitApp
Return

NoTrayOrphans() {
TrayInfo:= TrayIcons(sExeName,"ahk_class Shell_TrayWnd","ToolbarWindow32" . GetTrayBar()) "`n"
. TrayIcons(sExeName,"ahk_class NotifyIconOverflowWindow","ToolbarWindow321")
Loop, Parse, TrayInfo, `n
{
ProcessName:= StrX(A_Loopfield, "| Process: ", " |")
ProcesshWnd:= StrX(A_Loopfield, "| hWnd: ", " |")
ProcessuID := StrX(A_Loopfield, "| uID: ", " |")
If !ProcessName ProcesshWnd
RemoveTrayIcon(ProcesshWnd, ProcessuID)
}
}
RemoveTrayIcon(hWnd, uID, nMsg = 0, hIcon = 0, nRemove = 2) {
NumPut(VarSetCapacity(ni,444,0), ni)
NumPut(hWnd , ni, 4)
NumPut(uID , ni, ici il faut metre quoi?????
NumPut(1|2|4, ni,12)
NumPut(nMsg , ni,16)
NumPut(hIcon, ni,20)
Return DllCall("shell32\Shell_NotifyIconA", "Uint", nRemove, "Uint", ni)
}
TrayIcons(sExeName,traywindow,control) {
DetectHiddenWindows, On
WinGet, pidTaskbar, PID, %traywindow%
hProc:= DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pProc:= DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
SendMessage, 0x418, 0, 0, %control%, %traywindow%
Loop, %ErrorLevel%
{
SendMessage, 0x417, A_Index-1, pProc, %control%, %traywindow%
VarSetCapacity(btn,32,0), VarSetCapacity(nfo,32,0)
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", btn, "Uint", 32, "Uint", 0)
iBitmap := NumGet(btn, 0)
idn := NumGet(btn, 4)
Statyle := NumGet(btn, meme question
If dwData := NumGet(btn,12)
iString := NumGet(btn,16)
Else dwData := NumGet(btn,16,"int64"), iString:=NumGet(btn,24,"int64")
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", nfo, "Uint", 32, "Uint", 0)
If NumGet(btn,12)
hWnd := NumGet(nfo, 0)
, uID := NumGet(nfo, 4)
, nMsg := NumGet(nfo, et toujour la meme question on mes quoi????
, hIcon := NumGet(nfo,20)
Else hWnd := NumGet(nfo, 0,"int64"), uID:=NumGet(nfo, 8), nMsg:=NumGet(nfo,12), hIcon := NumGet(nfo,24)
WinGet, pid, PID, ahk_id %hWnd%
WinGet, sProcess, ProcessName, ahk_id %hWnd%
WinGetClass, sClass, ahk_id %hWnd%
If !sExeName || (sExeName = sProcess) || (sExeName = pid)
VarSetCapacity(sTooltip,128), VarSetCapacity(wTooltip,128*2)
, DllCall("ReadProcessMemory", "Uint", hProc, "Uint", iString, "Uint", wTooltip, "Uint", 128*2, "Uint", 0)
, DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "str", wTooltip, "int", -1, "str", sTooltip, "int", 128, "Uint", 0, "Uint", 0)
, sTrayIcons .= "idx: " . A_Index-1 . " | idn: " . idn . " | Pid: " . pid . " | uID: " . uID . " | MessageID: " . nMsg . " | hWnd: " . hWnd . " | Class: " . sClass . " | Process: " . sProcess . " | Icon: " . hIcon . " | Tooltip: " . wTooltip . "`n"
}
DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
return sTrayIcons
}
GetTrayBar() {
ControlGet, hParent, hWnd,, TrayNotifyWnd1 , ahk_class Shell_TrayWnd
ControlGet, hChild , hWnd,, ToolbarWindow321, ahk_id %hParent%
Loop {
ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
If Not hWnd
Break
Else If hWnd = %hChild%
{
idxTB := A_Index
Break
}
}
Return idxTB
}

StrX( H,BS="",ES="",Tr=1,ByRef OS=1) {
return,(SP := InStr(H,BS,0,OS)) (L := InStr(H,ES,0,SP+StrLen(BS))) (OS := L + StrLen(ES)) ? SubStr(H,SP := Tr ? SP + StrLen(BS) : SP ,(Tr ? L : L + StrLen(ES))-SP) : ""
}
donc vu qu'il manque des info ,sa ne fonctionne pas ......
Image

la question est "c'est comme sa marche ce bousin" ^^

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 01 déc. 2014 - 09:47
par Bopz44
Deja il ne manque rien dans le code.
Ensuite si tu avais bien lu le tuto tu verrais qu'il faut creer 2 SCRIPTS
Et pas tout copier dans un seul...

Bref relis attentivement

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 01 déc. 2014 - 19:08
par lankou910
bonsoir

oui j'ai bien compris qu'il fallait un script un start et un exit comme le tuto.....
j'ai bien lu le tuto le premier script "start" fonctionne a merveille
mais la deuxième partis ne fonctionne pas cher moi je donne même un capture écran de l'erreur....

Image

si je met la parenthèse demander voici l'erreur

Image

et encore merci.

Edit:Je viens de voir le premier sujet ici viewtopic.php?f=40&t=4807

il y as bien des incohérence car celui sur l'autre poste fonctionne parfaitement......
le voici
le module
#NoTrayIcon
#NoEnv
#Persistent
#SingleInstance force

Process Close, Xpadder.exe

DetectHiddenWindows, On
SetWorkingDir %A_ScriptDir%



NoTrayOrphans()
ExitApp
Return

NoTrayOrphans() {
TrayInfo:= TrayIcons(sExeName,"ahk_class Shell_TrayWnd","ToolbarWindow32" . GetTrayBar()) "`n"
. TrayIcons(sExeName,"ahk_class NotifyIconOverflowWindow","ToolbarWindow321")
Loop, Parse, TrayInfo, `n
{
ProcessName:= StrX(A_Loopfield, "| Process: ", " |")
ProcesshWnd:= StrX(A_Loopfield, "| hWnd: ", " |")
ProcessuID := StrX(A_Loopfield, "| uID: ", " |")
If !ProcessName ProcesshWnd
RemoveTrayIcon(ProcesshWnd, ProcessuID)
}
}
RemoveTrayIcon(hWnd, uID, nMsg = 0, hIcon = 0, nRemove = 2) {
NumPut(VarSetCapacity(ni,444,0), ni)
NumPut(hWnd , ni, 4)
NumPut(uID , ni, 8)
NumPut(1|2|4, ni,12)
NumPut(nMsg , ni,16)
NumPut(hIcon, ni,20)
Return DllCall("shell32\Shell_NotifyIconA", "Uint", nRemove, "Uint", ni)
}
TrayIcons(sExeName,traywindow,control) {
DetectHiddenWindows, On
WinGet, pidTaskbar, PID, %traywindow%
hProc:= DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pProc:= DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
SendMessage, 0x418, 0, 0, %control%, %traywindow%
Loop, %ErrorLevel%
{
SendMessage, 0x417, A_Index-1, pProc, %control%, %traywindow%
VarSetCapacity(btn,32,0), VarSetCapacity(nfo,32,0)
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", btn, "Uint", 32, "Uint", 0)
iBitmap := NumGet(btn, 0)
idn := NumGet(btn, 4)
Statyle := NumGet(btn, 8)
If dwData := NumGet(btn,12)
iString := NumGet(btn,16)
Else dwData := NumGet(btn,16,"int64"), iString:=NumGet(btn,24,"int64")
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", nfo, "Uint", 32, "Uint", 0)
If NumGet(btn,12)
hWnd := NumGet(nfo, 0)
, uID := NumGet(nfo, 4)
, nMsg := NumGet(nfo, 8)
, hIcon := NumGet(nfo,20)
Else hWnd := NumGet(nfo, 0,"int64"), uID:=NumGet(nfo, 8), nMsg:=NumGet(nfo,12), hIcon := NumGet(nfo,24)
WinGet, pid, PID, ahk_id %hWnd%
WinGet, sProcess, ProcessName, ahk_id %hWnd%
WinGetClass, sClass, ahk_id %hWnd%
If !sExeName || (sExeName = sProcess) || (sExeName = pid)
VarSetCapacity(sTooltip,128), VarSetCapacity(wTooltip,128*2)
, DllCall("ReadProcessMemory", "Uint", hProc, "Uint", iString, "Uint", wTooltip, "Uint", 128*2, "Uint", 0)
, DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "str", wTooltip, "int", -1, "str", sTooltip, "int", 128, "Uint", 0, "Uint", 0)
, sTrayIcons .= "idx: " . A_Index-1 . " | idn: " . idn . " | Pid: " . pid . " | uID: " . uID . " | MessageID: " . nMsg . " | hWnd: " . hWnd . " | Class: " . sClass . " | Process: " . sProcess . " | Icon: " . hIcon . " | Tooltip: " . wTooltip . "`n"
}
DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
return sTrayIcons
}
GetTrayBar() {
ControlGet, hParent, hWnd,, TrayNotifyWnd1 , ahk_class Shell_TrayWnd
ControlGet, hChild , hWnd,, ToolbarWindow321, ahk_id %hParent%
Loop {
ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
If Not hWnd
Break
Else If hWnd = %hChild%
{
idxTB := A_Index
Break
}
}
Return idxTB
}

StrX( H,BS="",ES="",Tr=1,ByRef OS=1) {
return,(SP := InStr(H,BS,0,OS)) (L := InStr(H,ES,0,SP+StrLen(BS))) (OS := L + StrLen(ES)) ? SubStr(H,SP := Tr ? SP + StrLen(BS) : SP ,(Tr ? L : L + StrLen(ES))-SP) : ""
}
chercher les trois erreurs ^^

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 05 août 2016 - 15:38
par lanner
Bonjour,
[Désolé de déterrer ce topic]
La configuration du settings.ini ressemble à quoi ?
Un peu embrouillé sur les balises la... il serait plus clair de mettre les scripts exacts sur une base et un explicatif en parallèle
merci

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 05 août 2016 - 15:48
par moustic
:mrgreen: T'es jamais content toi :lol:

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 05 août 2016 - 15:57
par lanner
Désolé :) c'est mon vieille âge...
Je viens d'une autre planète de forums ou les tutos sont plus "formatés" pour une lecture lambda.

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 05 août 2016 - 18:39
par camarade35
On s'excuse mais malheureusement, nous avons migré deux fois de suite et l'évolution PHPBB a causé quelques soucis, mais si tu es chaud pour refaire la mise en page (des topics que tu ne trouves pas à ton goût), on s'empressera d'éditer en conséquences ;)

Re: [TUTO] Demarrer plusieurs programmes a l'ouverture d'Hyp

Publié : 07 août 2016 - 22:41
par lanner
Pas de soucis je peu faire de la mise en page , le soir je ne fait rien de spécial :)