Ceci est une ancienne révision du document !
Démarrer plusieurs programmes à l'ouverture d'Hypersp
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 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 :
#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 :
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 :
#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 :
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 ;) :
[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 ;)