Automatisation sous windows 10

Bonjour a tous,

J’utilise mon pc pour regarder des films sur ma tv, et j’aimerais créer une automatisation pour un mode « film » qui, dans l’ordre exécuterai ces commandes

1 - modifier la config d’affichage du panneau des paramètres de Windows pour l’option « étendre ces affichages »
2 - Basculer la sortie son, également dans panneau des paramètres de Windows, vers la sortie ampli.
3 - Lancer vlc
4 - Ouvrir mon dossier Film
5 - Lancer un logiciel qui gère mon système Ambilight-clone, piloté par le pc.

Et un Mode « Boulot » qui ferait les actions inverses.

Fut une époque, pour d’autres raisons, j avais bidouiller un peu sur AutoIt, mais je ne suis pas sur que ce soit adapté, il faudrait que les fenêtres soit toujours au mêmes endroits par exemple.

Qu’en pensez vous? Que me conseilleriez vous?

Merci

À vue de nez, c’est un boulot pour Autohotkey, ça.

Les points 3, 4 et 5 sont triviaux (voir la commande Run).

Pour le point n°1, le dernier post de ce fil pourrait correspondre à ce que tu veux faire. Y’a sans doute moyen de faire sans Monitor Profile Switcher, mais la solution a le mérite d’être simple.

Pour la sortie son, ça semble possible aussi.

2 « J'aime »

Merci pour ta réponse rapide et détaillée, mais ça m’a l’air bien barbu tout ça, je vais m’y pencher.
Merci en tous cas.

1 « J'aime »

Je te proposerais bien un .bat mais on va me dire que c’est de la necrophilie.

9 « J'aime »

Si t’as besoin d’un coup de main, PM moi. Mon code AHK est souvent très sale, mais il marche. Je dois pouvoir te bricoler un truc vite fait. C’est la partie audio qui nécessiterait de tâtonner le plus de mon côté.

Une fois qu’on aura trouvé comment faire les points 1 et 2 en AHK pur, tu pourras t’en faire un .exe et roulez jeunesse.

J’ai pas encore eu l’occasion de tester, mais Microsoft a récemment décider de rendre Power Automate Desktop gratuit. En théorie ca devrait marcher aussi: Automate tasks with Power Automate Desktop for Windows 10—no additional cost | Power Automate Blog (microsoft.com)

2 « J'aime »

Alors autoit permet tout à fait de faire le boulot sans que les fenêtres soient à la même place.

Hello, j’ai enfin eu un peu de temps pour me re-pencher sur ce petit projet, + de 2 mois après…

J’ai choisi Autohotkey. J’ai réussi a lui faire lancer vlc et mon logiciel… pas trop dur… et a modifier un peu un script pour qu’il change ma sortie audio en fonction de ma config.

J’ aimerais faire un script que je puisse lancer en double cliquant dessus et pas par un raccourcis clavier, apparemment il suffit de supprimer le raccourcis et les:: mais ça fonctionne pour les commandes simple comme RUN, mais pas pour le script élaboré que j ai modifié.

et 2eme soucis quand je rajoute les lignes de commandes RUN au début, la partie changement de sortie ne fonctionne plus…

Si @GuillaumePan ou autres ont la solution…

Et si je dois créer un post séparé ou continuer en privée, dites le moi.

l’original adapté qui fonctionne :

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.


; http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/
Devices := {}
IMMDeviceEnumerator := ComObjCreate("{BCDE0395-E52F-467C-8E3D-C4579291692E}", "{A95664D2-9614-4F35-A746-DE8DB63617E6}")

; IMMDeviceEnumerator::EnumAudioEndpoints
; eRender = 0, eCapture, eAll
; 0x1 = DEVICE_STATE_ACTIVE
DllCall(NumGet(NumGet(IMMDeviceEnumerator+0)+3*A_PtrSize), "UPtr", IMMDeviceEnumerator, "UInt", 0, "UInt", 0x1, "UPtrP", IMMDeviceCollection, "UInt")
ObjRelease(IMMDeviceEnumerator)

; IMMDeviceCollection::GetCount
DllCall(NumGet(NumGet(IMMDeviceCollection+0)+3*A_PtrSize), "UPtr", IMMDeviceCollection, "UIntP", Count, "UInt")
Loop % (Count)
{
    ; IMMDeviceCollection::Item
    DllCall(NumGet(NumGet(IMMDeviceCollection+0)+4*A_PtrSize), "UPtr", IMMDeviceCollection, "UInt", A_Index-1, "UPtrP", IMMDevice, "UInt")

    ; IMMDevice::GetId
    DllCall(NumGet(NumGet(IMMDevice+0)+5*A_PtrSize), "UPtr", IMMDevice, "UPtrP", pBuffer, "UInt")
    DeviceID := StrGet(pBuffer, "UTF-16"), DllCall("Ole32.dll\CoTaskMemFree", "UPtr", pBuffer)

    ; IMMDevice::OpenPropertyStore
    ; 0x0 = STGM_READ
    DllCall(NumGet(NumGet(IMMDevice+0)+4*A_PtrSize), "UPtr", IMMDevice, "UInt", 0x0, "UPtrP", IPropertyStore, "UInt")
    ObjRelease(IMMDevice)

    ; IPropertyStore::GetValue
    VarSetCapacity(PROPVARIANT, A_PtrSize == 4 ? 16 : 24)
    VarSetCapacity(PROPERTYKEY, 20)
    DllCall("Ole32.dll\CLSIDFromString", "Str", "{A45C254E-DF1C-4EFD-8020-67D146A850E0}", "UPtr", &PROPERTYKEY)
    NumPut(14, &PROPERTYKEY + 16, "UInt")
    DllCall(NumGet(NumGet(IPropertyStore+0)+5*A_PtrSize), "UPtr", IPropertyStore, "UPtr", &PROPERTYKEY, "UPtr", &PROPVARIANT, "UInt")
    DeviceName := StrGet(NumGet(&PROPVARIANT + 8), "UTF-16")    ; LPWSTR PROPVARIANT.pwszVal
    DllCall("Ole32.dll\CoTaskMemFree", "UPtr", NumGet(&PROPVARIANT + 8))    ; LPWSTR PROPVARIANT.pwszVal
    ObjRelease(IPropertyStore)

    ObjRawSet(Devices, DeviceName, DeviceID)
}
ObjRelease(IMMDeviceCollection)
Return

F1:: SetDefaultEndpoint( GetDeviceID(Devices, "Ampli 5.1") )
F2:: SetDefaultEndpoint( GetDeviceID(Devices, "Ordi (HDMI)") )

SetDefaultEndpoint(DeviceID)
{
    IPolicyConfig := ComObjCreate("{870af99c-171d-4f9e-af0d-e63df40c2bc9}", "{F8679F50-850A-41CF-9C72-430F290290C8}")
    DllCall(NumGet(NumGet(IPolicyConfig+0)+13*A_PtrSize), "UPtr", IPolicyConfig, "UPtr", &DeviceID, "UInt", 0, "UInt")
    ObjRelease(IPolicyConfig)
}

GetDeviceID(Devices, Name)
{
    For DeviceName, DeviceID in Devices
        If (InStr(DeviceName, Name))
            Return DeviceID
}

La version qui devrait contenir tout ce que je veux qu il fasse mais qui ne fonctionne plus :

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

Run, C:\Program Files (x86)\AmbiBox\AmbiBox.exe
Run, C:\Program Files\VideoLAN\VLC\vlc.exe
return


; http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/
Devices := {}
IMMDeviceEnumerator := ComObjCreate("{BCDE0395-E52F-467C-8E3D-C4579291692E}", "{A95664D2-9614-4F35-A746-DE8DB63617E6}")

; IMMDeviceEnumerator::EnumAudioEndpoints
; eRender = 0, eCapture, eAll
; 0x1 = DEVICE_STATE_ACTIVE
DllCall(NumGet(NumGet(IMMDeviceEnumerator+0)+3*A_PtrSize), "UPtr", IMMDeviceEnumerator, "UInt", 0, "UInt", 0x1, "UPtrP", IMMDeviceCollection, "UInt")
ObjRelease(IMMDeviceEnumerator)

; IMMDeviceCollection::GetCount
DllCall(NumGet(NumGet(IMMDeviceCollection+0)+3*A_PtrSize), "UPtr", IMMDeviceCollection, "UIntP", Count, "UInt")
Loop % (Count)
{
    ; IMMDeviceCollection::Item
    DllCall(NumGet(NumGet(IMMDeviceCollection+0)+4*A_PtrSize), "UPtr", IMMDeviceCollection, "UInt", A_Index-1, "UPtrP", IMMDevice, "UInt")

    ; IMMDevice::GetId
    DllCall(NumGet(NumGet(IMMDevice+0)+5*A_PtrSize), "UPtr", IMMDevice, "UPtrP", pBuffer, "UInt")
    DeviceID := StrGet(pBuffer, "UTF-16"), DllCall("Ole32.dll\CoTaskMemFree", "UPtr", pBuffer)

    ; IMMDevice::OpenPropertyStore
    ; 0x0 = STGM_READ
    DllCall(NumGet(NumGet(IMMDevice+0)+4*A_PtrSize), "UPtr", IMMDevice, "UInt", 0x0, "UPtrP", IPropertyStore, "UInt")
    ObjRelease(IMMDevice)

    ; IPropertyStore::GetValue
    VarSetCapacity(PROPVARIANT, A_PtrSize == 4 ? 16 : 24)
    VarSetCapacity(PROPERTYKEY, 20)
    DllCall("Ole32.dll\CLSIDFromString", "Str", "{A45C254E-DF1C-4EFD-8020-67D146A850E0}", "UPtr", &PROPERTYKEY)
    NumPut(14, &PROPERTYKEY + 16, "UInt")
    DllCall(NumGet(NumGet(IPropertyStore+0)+5*A_PtrSize), "UPtr", IPropertyStore, "UPtr", &PROPERTYKEY, "UPtr", &PROPVARIANT, "UInt")
    DeviceName := StrGet(NumGet(&PROPVARIANT + 8), "UTF-16")    ; LPWSTR PROPVARIANT.pwszVal
    DllCall("Ole32.dll\CoTaskMemFree", "UPtr", NumGet(&PROPVARIANT + 8))    ; LPWSTR PROPVARIANT.pwszVal
    ObjRelease(IPropertyStore)

    ObjRawSet(Devices, DeviceName, DeviceID)
}
ObjRelease(IMMDeviceCollection)
Return

SetDefaultEndpoint( GetDeviceID(Devices, "Ampli 5.1") )

SetDefaultEndpoint(DeviceID)
{
    IPolicyConfig := ComObjCreate("{870af99c-171d-4f9e-af0d-e63df40c2bc9}", "{F8679F50-850A-41CF-9C72-430F290290C8}")
    DllCall(NumGet(NumGet(IPolicyConfig+0)+13*A_PtrSize), "UPtr", IPolicyConfig, "UPtr", &DeviceID, "UInt", 0, "UInt")
    ObjRelease(IPolicyConfig)
}

GetDeviceID(Devices, Name)
{
    For DeviceName, DeviceID in Devices
        If (InStr(DeviceName, Name))
            Return DeviceID
}

Pas à la maison et pas d’ordi sous la main pour tester, mais essaie de bouger le

SetDefaultEndpoint( GetDeviceID(Devices, « Ampli 5.1 ») )

en début de script (section auto-execute). Puisqu’il n’est plus relié à une hotkey, j’aurais tendance à le coller là-dedans.

Ça donnerait quelque chose comme ça :

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

SetDefaultEndpoint( GetDeviceID(Devices, "Ampli 5.1") )
Run, C:\Program Files (x86)\AmbiBox\AmbiBox.exe
Run, C:\Program Files\VideoLAN\VLC\vlc.exe
return

(la suite du script ne change pas, sauf pour la ligne SetDefaultEndpoint que tu viens de déplacer, donc)

Sans garantie de succès, je ne me souviens pas si les fonctions marquent la fin de la section auto-execute ou non. Je sais que c’est le cas pour la première hotkey/hotstring, mais les fonctions ? Pas sûr.

Edit : et je vais peut-être dire une connerie, mais le return ne semble servir à rien ici. Tu dois pouvoir le virer.