ShowWindow函数不工作当目标应用程序以管理员身份运行(ShowWindow Function

2019-08-03 00:03发布

我写一个程序,显示/隐藏了一些目标应用程序的窗口。 我早前测试出来,并发现了一些奇怪的。 如果我运行的目标应用为管理员(右键单击 - >属性,“兼容性”选项卡,“运行此程序作为管理员”),这是行不通的。

为了证明我写了名为“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下载

所有你需要做的就是将它们下载并运行TestApplication.exe然后运行TestShowWindow.exe。 你会发现,通过改变TestApplication.exe以管理员身份运行造成的ShowWindow不再工作。

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

PS我不知道这是否有差别,但我运行Windows 8专业版。 64位。

Answer 1:

这是由设计。 它是UAC鲜为人知双,称为UIPI或用户界面特权隔离。 的未升高的程序不能征用升高的一个。 鉴于UI自动化的能力,这是一个明显的应对措施,以劫持提升进程的能力阻止程序。 安全性违例称为粉碎攻击

解决方法是提供具有uiAccess =真清单用于保存在c的程序:\ windows或c:\程序文件和设置有一个证书。 而对于目标程序调用ChangeWindowMessageFilter以允许发送的某些消息。 在你的情况应该是WM_SHOWWINDOW。



Answer 2:

如果你不介意的作用就像你把它最小化到任务栏窗口; 你可以,一般,显示和与SC_RESTORE或SC_MINIMIZE的wParam中发布WM_SYSCOMMAND隐藏提升进程的窗口。



文章来源: ShowWindow Function Doesn't Work When Target Application Is Run As Administrator