Page 1 sur 1
[RESOLU] Affichage d'une fenetre de choix pendant l'installation
Posté : 20 janv. 2025 - 16:08
par Mikael S
Bonjour,
Pour une action très spécifique, j'ai besoin d'afficher une fenêtre de choix pour sélectionner une action à effectuer durant l'installation du paquet du côté de la machine qui reçoit l'installation.
J'utilise jusqu'à présent waptguihelper.grid_dialog. Toutefois, cela marche bien avec pyscripter mais forcement, car c'est ma session. Via une installation de paquet depuis la console, cela ne passe plus.
Je connais l'astuce pour les exécutables avec get_active_sessions puis start_interactive_process. Mais la grid_dialog n'a pas de paramètre de session.
A-t-on un moyen pour générer cette console pour la session active et de récupérer le choix fait ?
Cordialement,
Re: Affichage d'une fenetre de choix pendant l'installation
Posté : 20 janv. 2025 - 16:39
par sfonteneau
Bonjour
On peu demander a la session d'executer :
Code : Tout sélectionner
waptpython -c "import json;import waptguihelper;waptguihelper.grid_dialog('hello',json.dumps({'hello':'hello'}))"
Problème je ne crois pas que le code actuel puisse récupérer la valeur de sortie. Faudrait qu'on creuse le sujet ça serais une option intéressante
Re: Affichage d'une fenetre de choix pendant l'installation
Posté : 24 janv. 2025 - 13:10
par Mikael S
Effectivement, c'est sans retour.
J'ai tenté de regarder en faisant un print pour récupérer l'output, mais ce n'est pas aussi simple avec la fonction win32process.CreateProcess a première vue.
Je vais sans doute écrire ça dans un fichier et le lire dans le programme principal. Pour l'instant, je ne vois pas plus simple
Re: Affichage d'une fenetre de choix pendant l'installation
Posté : 24 janv. 2025 - 14:06
par sfonteneau
J'ai regarder j'ai un truc qui marche
Code : Tout sélectionner
# -*- coding: utf-8 -*-
from setuphelpers import *
import os
import win32api
import win32con
import win32process
import win32security
import win32ts
import win32profile
import win32pipe
import win32file
try:
from waptenterprise.waptservice.enterprise import get_active_sessions
except:
from waptservice.enterprise import get_active_sessions
def start_interactive_process2(app_filename, cmdline=None, session_id=None, hide=True, minimize=False):
if session_id is None:
session_id = win32ts.WTSGetActiveConsoleSessionId()
if session_id == 0xffffffff:
return None
CREATE_BREAKAWAY_FROM_JOB = 0x1000000
priority = win32con.NORMAL_PRIORITY_CLASS | win32con.CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB
startup = win32process.STARTUPINFO()
startup.lpDesktop = None
startup.dwFlags = win32con.STARTF_USESTDHANDLES | win32con.STARTF_USESHOWWINDOW
startup.wShowWindow = win32con.SW_HIDE
token = win32ts.WTSQueryUserToken(session_id)
saAttr = win32security.SECURITY_ATTRIBUTES()
saAttr.bInheritHandle = True
read_pipe, write_pipe = win32pipe.CreatePipe(saAttr, 0)
win32api.SetHandleInformation(read_pipe, win32con.HANDLE_FLAG_INHERIT, 0)
startup.hStdOutput = write_pipe
startup.hStdError = write_pipe
startup.hStdInput = win32api.GetStdHandle(win32api.STD_INPUT_HANDLE)
if cmdline is None:
cmd = f'"{app_filename}"'
else:
cmd = f'"{app_filename}" {cmdline}'
working_directory = "C:\\Windows\\System32"
environment = win32profile.CreateEnvironmentBlock(token, False)
new_token = win32security.DuplicateTokenEx(token, win32security.SecurityDelegation, win32security.TOKEN_ALL_ACCESS, win32security.TokenPrimary)
process_info = win32process.CreateProcessAsUser(
new_token,
None,
f'cmd.exe /c {cmd}',
None, None,
True,
priority,
environment,
working_directory,
startup
)
win32api.CloseHandle(token)
win32api.CloseHandle(new_token)
win32file.CloseHandle(write_pipe)
output = b""
while True:
try:
chunk = win32file.ReadFile(read_pipe, 4096)[1]
if not chunk:
break
output += chunk
except Exception:
break
win32file.CloseHandle(read_pipe)
return output.decode("utf-8", errors="ignore")
def install():
list_session = get_active_sessions()
for s in list_session:
output = start_interactive_process2('''waptpythonw -c "import json;import waptguihelper;print(waptguihelper.grid_dialog('hello',json.dumps({'hello':'hello'})))"''',session_id=s)
print(output)
Par contre a toi de gérer la boucle while pour éviter de faire en attente infinie
Re: Affichage d'une fenetre de choix pendant l'installation
Posté : 04 févr. 2025 - 10:22
par Mikael S
Ok, ça passe. Ça a été un peu complexe de passer tous les arguments avec les quote et de récupérer les valeurs surtout que c'est une liste de valeur que j'envoie.
Mais pour ceux que ça intéresse, voila une partie du code
Code : Tout sélectionner
titre = "'Choix'"
json_list_backup = json.dumps(list_choix).replace('"', "'")
command_line = f'import json;import waptguihelper;print(waptguihelper.grid_dialog({titre},{json_list}, waptguihelper.GRT_SELECTED))'
list_session = get_active_sessions()
for s in list_session:
selected_backup = ast.literal_eval(start_interactive_process2(f'waptpythonw -c "{command_line}"', session_id=s))
Par contre, pour la boucle, ça me semble ok. Je ne vois pas dans quel scénario cela peut poser souci.
Re: Affichage d'une fenetre de choix pendant l'installation
Posté : 04 févr. 2025 - 11:59
par dcardon
Bonjour Mikaël,
merci pour le retour

, je passe le topic en RESOLU.
Denis