6 votes

La fonction ShowWindow ne fonctionne pas lorsque l'application cible est exécutée en tant qu'administrateur

J'écris un programme qui affiche/masque la fenêtre d'une application cible. Je l'ai testé plus tôt et j'ai remarqué quelque chose d'étrange. Si je lance l'application cible en tant qu'administrateur (clic droit->Propriétés, onglet "Compatibilité", "Exécuter ce programme en tant qu'administrateur"), cela ne fonctionne pas.

Pour démontrer, j'ai écrit une simple application GUI appelée "TargetApplication" et ensuite j'ai écrit le code suivant pour tester l'affichage/masquage de cette application :

class Program
{
  static void Main(string[] args)
  {
    IntPtr windowPtr = FindWindow(null, "TargetApplication");
    ShowWindow(windowPtr, 0); // 0 = Hide            
    Console.WriteLine("The window is now hidden. Press Enter to restore");
    Console.ReadLine();
    ShowWindow(windowPtr, 9); // 9 = Restore
    Console.WriteLine("The window is now restored. Press Enter to exit.");            
    Console.ReadLine();
  }

  [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
  static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

  [DllImport("user32.dll")]
  static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}

Si je lance l'application fenêtrée sans droits d'administrateur, cela ne fonctionne pas.

Quelqu'un pourrait-il tester cela pour moi ? J'ai téléchargé les fichiers .exe des deux applications ici :

TestShowWindow Télécharger

Tout ce que vous avez à faire est de les télécharger et d'exécuter TestApplication.exe puis TestShowWindow.exe. Vous constaterez qu'en modifiant TestApplication.exe pour qu'il soit exécuté en tant qu'administrateur, ShowWindow ne fonctionne plus.

Bien sûr, si vous n'avez pas confiance dans le téléchargement de mon matériel, vous pouvez toujours compiler mon code et le tester sur n'importe quelle application cible de Windows dont vous pouvez changer le mode de compatibilité.

P.S. Je ne suis pas sûr que cela fasse une différence mais j'utilise Windows 8 Pro. 64 bits.

8voto

Hans Passant Points 475940

C'est à dessein. C'est le jumeau moins connu de l'UAC, appelé UIPI ou l'isolation des privilèges de l'interface utilisateur. Un programme non élevé ne peut pas réquisitionner un programme élevé. Étant donné les capacités de l'automatisation de l'interface utilisateur, il s'agit d'une contre-mesure évidente pour empêcher les programmes de détourner les capacités d'un processus élevé. Une violation de la sécurité appelée attaque par éclats .

Les solutions de contournement consistent à fournir un manifeste avec uiAccess = true pour un programme stocké dans c : \windows ou c : \program et fourni avec un certificat. Et pour le programme cible d'appeler ChangeWindowMessageFilter pour autoriser l'envoi de certains messages. Dans votre cas, cela devrait être WM_SHOWWINDOW.

1voto

Erik Welander Points 33

Si cela ne vous dérange pas que la fenêtre se comporte comme si vous l'aviez minimisée dans la barre des tâches, vous pouvez, en général, afficher et cacher Windows des processus élevés en affichant WM_SYSCOMMAND avec un wParam de SC_RESTORE ou SC_MINIMIZE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X