当目标应用程序以管理员身份运行时,ShowWindow功能不起作用

时间:2012-11-20 07:21:47

标签: c# windows-8 administrator showwindow

我正在编写一个显示/隐藏某个目标应用程序窗口的程序。我之前正在测试它并发现一些奇怪的东西。如果我以管理员身份运行目标应用程序(右键单击 - >属性,“兼容性”选项卡,“以管理员身份运行此程序”),它将无效。

为了演示我编写了一个名为“TargetApplication”的简单GUI应用程序,然后我编写了以下代码来测试显示/隐藏此应用程序:

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);
}

如果我在没有管理员权限的情况下启动窗口化应用程序,则它无效。

有人会介意为我测试这个吗?我在这里为这两个应用程序上传了.exe文件:

TestShowWindow Download

您所要做的就是下载它们并运行TestApplication.exe然后运行TestShowWindow.exe。您会发现通过将TestApplication.exe更改为以管理员身份运行会导致ShowWindow不再起作用。

当然,如果你不相信下载我的东西,你总是可以编译我的代码并在Windows中的任何目标应用程序上测试它,你可以改变其兼容性模式。

P.S。我不确定它是否有所作为,但我正在运行Windows 8 Pro。 64位。

2 个答案:

答案 0 :(得分:7)

这是设计的。它是UAC中鲜为人知的双胞胎,称为UIPI或用户界面权限隔离。一个未提升的计划不能征服一个升级的计划。鉴于UI自动化的功能,这是一个明显的对策,可以阻止程序劫持升级过程的功能。安全违规行为称为shatter attack

变通方法是为存储在c:\ windows或c:\ program文件中的程序提供uiAccess = true的清单,并提供证书。并且目标程序调用ChangeWindowMessageFilter以允许发送某些消息。在你的情况下,应该是WM_SHOWWINDOW。

答案 1 :(得分:0)

如果您不介意像您一样将窗口最小化到任务栏;通常,您可以通过使用SC_RESTORE或SC_MINIMIZE的wParam发布WM_SYSCOMMAND来显示和隐藏升级进程中的窗口。