Outils pour utilisateurs

Outils du site


tutos:software:launcher:rocketlauncher:demarrer_plusieurs_programmes_ouverture_hypersp

Démarrer plusieurs programmes à l'ouverture d'Hyperspin

Tutoriel original : Bopz44 du 24/08/2014

Salut, vous connaissez très certainement tous la fonction “Exit” de Hyperhq qui vous permet de démarrer un programme a l'ouverture d'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 spécifiques nécessaires au bon fonctionnement d'Hyperspin.

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

Récupérez le programme AutoHotkey sur le site officiel ICI, et installez le.

Allez dans le dossier Hyperspin, créez un nouveau document texte, et renommez le ; par exemple “START” (choisissez le nom à lui donner) et surtout renommez l'extention en “.ahk” (sans les guillemets).

Clic-droit sur votre fichier nouvellement créé et là de nouvelles options auront ete ajoutés par AutoHotkey dont “Edit Script”. Editez le en y entrant ce code :

#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, .\

Toute la premiere partie du code sert à rendre hyperspin portable. Ca n'a rien à voir avec ce tuto, mais autant le mettre avec, ça mange pas de pain

Maintenant intéressons nous à la derniere ligne : “Run, .\”.

“Run” est la commande qui va executer le programme, tandis que “.\” est un chemin relatif indiquant la localisation de départ de votre script.

Si par exemple votre script se trouve dans “C:\Hyperspin\START.ahk” et que le programme que vous voulez lancer est dans “C:\Hyperspin\HyperLaunch\Module Extensions\HyperSearch\HyperSearch.exe”, alors votre chemin relatif sera : “.\HyperLaunch\Module Extensions\HyperSearch\HyperSearch.exe”.

Maintenant, à 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 :

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

Passons au script de sortie, pour ce faire créez un nouveau script (par exemple “EXIT.ahk”), éditez-le et entrez-y le code :

#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, ce, 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 rafraîchir l'icone du programme dans la task bar en bas a droite, et vous seriez obligés de passer dessus avec votre souris pour qu'il disparaisse (pas très propre).

Ce script va donc faire le taff ni vu ni connu !

Intéressons nous donc à la ligne “Process Close”.

“Process Close” est la commande qui indique à AutoHotkey quel programme doit être fermé. Il suffit donc d'ajouter le nom du programme, ce qui donnera dans mon cas :

Process Close, Irotate.exe
Process Close, HyperSearch.exe
Process Close, Xpadder.exe
Process Close, KILL MOUSE.exe
Process Close, KILL TASK.exe

Voila, il ne reste plus qu'à plus qu'à tester les scripts et les compiler.

Faites un double-clic sur “START.ahk”, logiquement les programmes que vous avez indiqué dans votre script se lancent.

Faites de même sur “EXIT.ahk” et normalement les programmes lancés devraient se fermer.

Une fois satisfait, faites un clic-droit sur votre script et choisissez “Compile Script”.

Cela va vous créer un executable “exe”, donc vous pouvez même désinstaller autohotkey si vous voulez, mais je vous conseille de le garder tant cet outil est utile !

Il ne vous reste plus qu'à indiquer dans votre fichier “settings.ini” le chemin de vos executables.

Dans mon cas, je veux conserver la portabilité d'Hyperspin, j'ai donc mis mes 2 executables dans le même dossier que mon “Hyperspin.exe”, du coup ma config ressemble à ça et tout roule impec :

[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 !

tutos/software/launcher/rocketlauncher/demarrer_plusieurs_programmes_ouverture_hypersp.txt · Dernière modification: 2017/02/10 18:18 de nabubokon