我正在编写一个显示/隐藏某个目标应用程序窗口的程序。我之前正在测试它并发现一些奇怪的东西。如果我以管理员身份运行目标应用程序(右键单击 - >属性,“兼容性”选项卡,“以管理员身份运行此程序”),它将无效。
为了演示我编写了一个名为“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文件:
您所要做的就是下载它们并运行TestApplication.exe然后运行TestShowWindow.exe。您会发现通过将TestApplication.exe更改为以管理员身份运行会导致ShowWindow不再起作用。
当然,如果你不相信下载我的东西,你总是可以编译我的代码并在Windows中的任何目标应用程序上测试它,你可以改变其兼容性模式。
P.S。我不确定它是否有所作为,但我正在运行Windows 8 Pro。 64位。
答案 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来显示和隐藏升级进程中的窗口。