6

いくつかのターゲットアプリケーションのウィンドウを表示/非表示にするプログラムを書いています。私は以前にそれをテストしていて、何か奇妙なことに気づきました。ターゲットアプリケーションを管理者として実行した場合(右クリック-> [プロパティ]、[互換性]タブ、[このプログラムを管理者として実行])、機能しません。

実例を示すために、「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違いがあるかどうかはわかりませんが、Windows8Proを実行しています。64ビット。

4

2 に答える 2

8

これは仕様によるものです。これは、 UIPIまたはユーザーインターフェイス特権の分離と呼ばれる、あまり知られていないUACの双子です。昇格されていないプログラムは、昇格されたプログラムを指揮することはできません。UIオートメーションの機能を考えると、これは、プログラムが昇格したプロセスの機能を乗っ取るのを防ぐための明らかな対抗策です。シャッター攻撃と呼ばれるセキュリティ違反。

回避策は、c:\ windowsまたはc:\ programファイルに保存され、証明書が提供されているプログラムに対してuiAccess=trueのマニフェストを提供することです。また、ターゲットプログラムがChangeWindowMessageFilterを呼び出して、特定のメッセージを送信できるようにします。あなたの場合、それはWM_SHOWWINDOWであるはずです。

于 2012-11-20T12:30:50.107 に答える
1

ウィンドウをタスクバーに最小化したように動作してもかまわない場合は、通常、SC_RESTOREまたはSC_MINIMIZEのwParamを使用してWM_SYSCOMMANDを投稿することにより、昇格されたプロセスからウィンドウを表示および非表示にできます。

于 2013-08-23T08:04:19.413 に答える