WELCOME UNIVERSE ROMs

jeudi 14 mai 2020

HyperHQ


Start multiple programs when Hyperspin opens

Hi, you most certainly know the “Exit” function of Hyperhq which allows you to start a program when you open Hyperspin and close it when you exit the frontend.

The problem is that you can only insert one program, annoying enough when you want to use Xpadder, HyperSearch or other specific programs necessary for the proper functioning of Hyperspin.

To remedy this, we will create an AutoHotkey script which will indicate the programs to be executed or quit.

Get the AutoHotkey program from the official website https://www.autohotkey.com/, and install it.

Go to the Hyperspin folder, create a new text document, and rename it; for example “START” (choose the name to give it) and above all rename the extension to “.ahk” (without quotes).

Right-click on your newly created file and there new options will have been added by AutoHotkey including “Edit Script”. Edit it by entering this code:

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

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 embêtant quand on veut utiliser Xpadder, HyperSearch ou d'autres programmes spécifiques nécessaires au bon fonctionnement d'Hyperspin.
Pour y remédier, on va créer un script AutoHotkey qui indiquera les programmes a exécuter ou a quitter.
Récupérez le programme AutoHotkey sur le site officiel https://www.autohotkey.com/, 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’extension en “.ahk” (sans les guillemets).
Clic-droit sur votre fichier nouvellement créé et là de nouvelles options auront été ajoutés par AutoHotkey dont “Edit Script”. Éditez 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, .\
The entire first part of the code is used to make hyperspin portable. It has nothing to do with this tutorial, but as much to put it with, it eats no bread

Now let's look at the last line: “Run,. \”.

“Run” is the command that will execute the program, while “. \” Is a relative path indicating the starting location of your script.

If for example your script is in “C: \ Hyperspin \ START.ahk” and the program you want to launch is in “C: \ Hyperspin \ HyperLaunch \ Module Extensions \ HyperSearch \ HyperSearch.exe”, then your relative path will be: “. \ HyperLaunch \ Module Extensions \ HyperSearch \ HyperSearch.exe”.

Now it's up to you to indicate in the script the path of the desired program. To add another one, just add a new command line. Here for example mine:

Toute la première partie du code sert à rendre hyperspin portable. Çà n'a rien à voir avec ce tutoriel, mais autant le mettre avec, ça mange pas de pain 
Maintenant intéressons nous à la dernière ligne : “Run, .\”.
“Run” est la commande qui va exécuter 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
Let's go to the output script, to do this create a new script (for example “EXIT.ahk”), edit it and enter the code:

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) : ""
}
As you can see, this code is much larger and, for good reason, there are often refresh bugs when certain programs are quit with AutoHotkey.

In fact Windows leaves them cleanly, but does not have time to refresh the program icon in the task bar at the bottom right, and you would have to pass over it with your mouse so that it disappears (not very clean) .

This script will therefore make the work neither seen nor known!

So let's take a look at the “Process Close” line.

“Process Close” is the command that tells AutoHotkey which program should be closed. So just add the name of the program, which in my case will give


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 rafraîchissements 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 travaille 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
it only remains to test the scripts and compile them.

Double-click on “START.ahk”, logically the programs you have indicated in your script will launch.

Do the same on “EXIT.ahk” and normally the programs launched should close.

Once satisfied, right-click on your script and choose “Compile Script”.

This will create an “exe” executable for you, so you can even uninstall autohotkey if you want, but I advise you to keep it as this tool is useful!

All you have to do is indicate in your “settings.ini” file the path of your executables.

In my case, I want to keep the portability of Hyperspin, so I put my 2 executables in the same folder as my “Hyperspin.exe”, suddenly my config looks like this and everything runs flawless


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 exécutable “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 exécutables.
Dans mon cas, je veux conserver la portabilité d'Hyperspin, j'ai donc mis mes 2 exécutables dans le même dossier que mon “Hyperspin.exe”, du coup ma config ressemble à ça et tout roule impeccable  :
[Startup Program]
Executable=START.exe
Paramaters=
Working_Directory=
WinState=NORMAL
[Exit Program]
Executable=EXIT.exe
Paramaters=
Working_Directory=
WinState=NORMAL