1

への呼び出しを元に戻す方法はありAllowSetForegroundWindow(ASFW_ANY)ますか?

大きな絵:

  • 一度に実行するexeの単一のプロセスが必要です。
  • これを実現するには、プロセスは名前付きパイプを使用して相互に通信し、プロセスが既に存在する場合は、そのウィンドウを前面に表示する必要があります。
  • これを行うには、最新のプロセスAllowSetForegroundWindow()に既存のプロセス ID を設定する必要があります。
    • プロセス ID を取得したくないので (私の怠惰で申し訳ありません)、次のように計画していますAllowSetForegroundWindow()AllowSetForegroundWindow()私のプロセスから。

簡単に言えば、特定の時間枠でのみ、他のプロセスが私からフォーカスを盗むことを許可したい...

以前に同様の問題に直面し、回避策を見つけた人はいますか?

また、より良い提案/代替案があれば教えてください...

4

2 に答える 2

2

ドキュメントによると、ターゲット プロセス (おそらく "any" を含む) は、次に を呼び出したときにフォーカスを盗むことができなくなりますAllowSetForegroundWindow

言い換えれば、一度にアクティブにできる許可は 1 つだけのように思えます。

したがって、存在しないID、またはおそらく独自のプロセスIDで呼び出すことにより、許可を取り消すことができるはずです。これは理論ですが、私はテストしていません。

個人的には、名前付きパイプを介してターゲット プロセス ID を送信するだけです。

于 2012-04-04T14:58:17.903 に答える
0

あなたの主な要件は、アプリケーションのインスタンスを一度に 1 つだけ実行することだと理解しています。あなたが説明する他のすべてがこの要件に従属するだけであり、より大きなスキームの一部ではない場合、それを達成するためのより簡単な方法があります.

アプリケーションの起動時にグローバルな名前付きミューテックスを作成できます。他のすべてのインスタンスは、このミューテックスが設定されていると見なし、すぐに終了します。ここにそれの簡単で汚いがあります:

// Multiple instances detection
HANDLE my_mutex = ::CreateMutex(NULL, FALSE, "Global\\MyCuteFluffyMutex" );

int create_mutex_error = ::GetLastError();
bool already_running =
          ( my_mutex && ( create_mutex_error == ERROR_ALREADY_EXISTS ))
       || ( create_mutex_error == ERROR_ACCESS_DENIED );

if ( !already_running ) {
  // Run my application
}

::CloseHandle(my_mutex);

CreateMutexとそのパラメーターに関するより詳細な情報については、ドキュメントを参照してください。

于 2012-04-04T15:12:07.783 に答える