Problèmes lors de la tentative d’affichage d’une fenêtre de configuration pour mon économiseur d’écran (à partir d’une application graphique fonctionnant avec un niveau d’intégrité obligatoire élevé)

J’ai un vieux projet qui vient avec son propre économiseur d’écran. L’application graphique du projet dispose d’une option permettant de «Configurer l’économiseur d’écran» qui devrait ouvrir la fenêtre de configuration de mon économiseur d’écran (normalement accessible depuis un Panneau de configuration -> Affichage -> Personnalisation -> Économiseur d’écran -> Paramètres.)

Pour afficher la fenêtre de configuration, vous devez appeler le processus économiseur d’écran avec le paramètre /c , comme décrit ici . L’économiseur d’écran lui-même est placé dans le répertoire système, c’est-à-dire "C:\Windows\System32" .

Donc, pour émuler cela depuis mon application graphique (32 bits), je fais ce qui suit:

 //Error checks are omitted for brevity BOOL bResult = FALSE; TCHAR buffSysFldr[MAX_PATH]; buffSysFldr[0] = 0; ::GetSystemDirectory(buffSysFldr, SIZEOF(buffSysFldr)); //Make the path, which basically becomes: // "C:\Windows\System32\mysvr.scr" /c TCHAR buff[MAX_PATH]; buff[0] = 0; ::SsortingngCbPrintf(buff, sizeof(buff), L"\"%s\\mysvr.scr\" /c", buffSysFldr); STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; ZeroMemory(&si,sizeof(si)); ZeroMemory(&pi,sizeof(pi)); si.cb = sizeof(si); PVOID OldValue; Wow64DisableWow64FsRedirection(&OldValue); //And run it if(CreateProcess(NULL, buff, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { //Success bResult = TRUE; } Wow64RevertWow64FsRedirection(OldValue); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); 

Lorsque je le déploie sur la machine Windows 7, le code ci-dessus renvoie bResult = TRUE mais la fenêtre de configuration de mon économiseur d’écran ne s’affiche jamais.

Je l’ai essayé sur Windows 7 32 bits et 64 bits en pensant que la redirection Wow64 y était pour quelque chose, mais cela ne changeait toujours pas le résultat.

Une idée pourquoi ça ne marche pas?

PS Lorsque je copie et colle cette commande dans une invite de commande, tout se passe bien et affiche sans problème la fenêtre de configuration:

entrez la description de l'image ici

EDIT: Après un examen plus approfondi, il s’avère que le problème semble lié au fait que mes applications d’interface utilisateur graphique fonctionnent avec un niveau d’intégrité obligatoire élevé ou S-1-16-12288 , ce qui semble être la raison pour laquelle la fenêtre de configuration de l’écran de veille n’est pas montré. Si S-1-16-8192 mon application graphique avec son niveau d’intégrité moyen normal ou S-1-16-8192 , la fenêtre de configuration affiche OK.

Sinon, je peux voir que la méthode RegisterDialogClasses de mon économiseur d’écran est appelée OK, mais lorsque je renvoie VRAI, ScreenSaverConfigureDialog n’est jamais appelée.

Étant donné que le niveau d’intégrité a été introduit pour empêcher les processus de niveaux inférieurs d’envoyer des messages aux processus de niveaux supérieurs, le mécanisme de configuration de l’économiseur d’écran tente d’envoyer certains messages à mon application d’interface graphique (quelle que soit la raison non documentée), puis échoue et échoue également en mode silencieux. .

C’est donc le dernier. J’apprécierai tout commentaire de la part de quiconque sait comment résoudre ce problème (à part abaisser le niveau d’intégrité de mon application d’interface graphique, ce que je ne souhaite évidemment pas faire.)

Putain de documentation sur Microsoft (désolée, je viens de perdre toute la journée à essayer de la réparer).

Pour quiconque se heurte à cela – il s’avère qu’il faut l’appeler ainsi:

“C: \ Windows \ System32 \ mysvr.scr” / c: N

où N est un descripteur de fenêtre de la fenêtre parente exprimé sous forme d’entier. Pour le découvrir, vérifiez la ligne de commande de la fenêtre de configuration affichée via le Panneau de configuration (utilisez l’Explorateur de processus .)

Dans mon cas, étant donné que mon processus d’interface graphique fonctionne avec un niveau d’intégrité supérieur, procédez comme suit:

 HWND hWndToUse = ::GetDesktopWindow(); ::SsortingngCbPrintf(buff, sizeof(buff), L"\"%s\\mysvr.scr\" /c:%d", buffSysFldr, (int)hWndToUse); 

Et c’est tout!