0

ここで行き止まりになりそうです。次のことを行うプロジェクトがあります。

  • ただ実行して通知領域にとどまる
  • ユーザーがマウスの中ボタンを押すと、フォームが表示されます
  • ユーザーはフォームから何でも選択でき、満足できます。

これはうまく機能していますが、機能していないのは、フォームが表示されてもアクティブにならないことです。

app.manifest を に変更する前は、正常にrequireAdmin動作していました。フォームが表示されるたびに、ブームがアクティブになりました。

しかし、フォームを管理者として実行しているので、フォームを使用して他のアプリケーションの 1 つを制御できるようにする必要があるため (管理者としても実行されます)、フォームは正常に表示されますが、アクティブになりません。 .

私は試しました: - TopMost = trueForm_Load メソッドの内部 - Form_LoadSetForegroundWindowのフォームハンドルで呼び出す - Form_Load のShowDialog両方を呼び出し、フォームが構築されたときにも試しました。Activate- Form_Load およびフォームの作成時に呼び出す

これが私のレイアウトです:

  • プログラムが実行され、マニフェストにより UAC 権限が必要になり、ユーザーが同意し、開始されます
  • 通知アイコンのみが表示され、実行中であることを示す素敵な小さなバブルが表示されます
  • Program.cs は、キーボード/マウス フックを監視します。
  • マウスの中ボタン、またはキーボード フックのいずれかがトリガーされると、新しいフォーム オブジェクトが作成されます。
  • フォームが表示される場所を設定します
  • そして最後にフォームを表示します。

繰り返しますが、UAC がなくrequireAdmin、app.manifest の内部では、これは正常に機能します。しかし、管理者として実行されると、いいえ、前に留まることはありません。

SetForegroundWindowMS がウィンドウの新しいバージョン (Vista、7、8) で要件をより厳しくしたことは知っていますが、このフォームを一番上のアクティブなウィンドウ (コンテキスト メニューなど) として表示できるようにする必要があります。

どうすればそれを適切に行うことができますか?

4

1 に答える 1

1

プログラムを2つに分割できます。管理者以外の人がトレイに座って中央のボタンを監視する必要がある半分と、マウスボタンが押されたときに起動する管理者権限が必要な半分です。昇格していない半分は、必要に応じて電話をかけることができSetForegroundWindowますAllowSetForegroundWindow

毎回UACプロンプトを回避したい場合は、CoCreateInstanceAsAdminメソッドを介してCOM標高オブジェクトをキャッシュし、それを繰り返し使用できます。

于 2012-09-06T10:17:09.817 に答える