====== 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 {{http://wiki.hfsplay.fr/lib/plugins/ckgedit/ckeditor/plugins/smiley/images/teeth_smile.png?nolink&23x23}} 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 ! {{http://wiki.hfsplay.fr/lib/plugins/ckgedit/ckeditor/plugins/smiley/images/regular_smile.png?nolink&23x23}} 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 ! {{http://wiki.hfsplay.fr/lib/plugins/ckgedit/ckeditor/plugins/smiley/images/wink_smile.png?nolink&23x23}} 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 {{http://wiki.hfsplay.fr/lib/plugins/ckgedit/ckeditor/plugins/smiley/images/regular_smile.png?nolink&23x23}} : [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 ! {{http://wiki.hfsplay.fr/lib/plugins/ckgedit/ckeditor/plugins/smiley/images/teeth_smile.png?nolink&23x23}}