2012-04-04 24 views
1

AllowSetForegroundWindow(ASFW_ANY)への呼び出しを元に戻す方法はありますか?AllowSetForegroundWindow()呼び出しを元に戻す/リセットする

全体像は:

  • 私は一度に実行している私のexeファイルの単一のプロセスをしたいです。
  • これを達成するには、プロセスが既に存在する場合は、名前付きパイプ&を使用してプロセスが互いに通信します。そのウィンドウは前面に配置する必要があります。
  • これを行うには、最新のプロセスで既存のプロセスIDをAllowSetForegroundWindow()に設定する必要があります。
    • 私は私は何をするつもりがある、(私の怠惰のために申し訳ありません)プロセスIDを取得する必要はありません:いくつかのエラーが発生しただけの場合にはASFW_ANY 2. 1.コールAllowSetForegroundWindow()は、AllowSetForegroundWindow()への呼び出しを取り消します他の人が私のプロセスから焦点を奪うことはできません。簡単な言葉で

、私は他のプロセスは、特定の時間ウィンドウに、私からフォーカスを盗むためにできるようにしたい...

いずれかが先に同様の問題に直面して、任意の回避策を見つけましたか?

また、

+0

あなたは 'AllowSetForegroundWindow'呼び出しを完全に取り除くことができます。既存のプロセスがフォーカスを取りたい場合は、最新のプロセスを要求します。要求がない場合、最新のプロセスは何もしません。 –

+0

@RaymondChen私はそれを手に入れませんでした...もしリクエストが来たら、最新のプロセスはどうすればいいのですか? –

+1

あなたは、2つのプロセス(AとBと呼んでいる)がすでに互いに通信しているとし、Bが 'SetForegroundWindow'を呼びたい場合に' AllowSetForegroundWindow'を呼び出しているとします。代わりに、ちょうどBが私にこのウィンドウで 'SetForegroundWindow'と呼んでください。 –

答えて

2

According to the documentation ...あなたが任意のより良い提案/代替手段を持っているなら、私に知らせてください、(おそらく「任意の」を含む)ターゲット・プロセスは次回にあなたからあなたをフォーカスを盗むために能力を失うことになりますAllowSetForegroundWindowに電話してください。

つまり、一度に1つの権限しかアクティブにできないように思えます。

存在しないIDまたはおそらく独自のプロセスIDを使用して呼び出しを許可する必要があります。これは理論ですが、私はそれをテストしていません。

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

+0

パラメータとしてNULLを設定しようとしましたが、うまくいかなかった...自分のプロセスIDで試してみると、更新されます... –

+0

私のパイプ通信は少し制限されています。パラメータとしてのプロセスIDが期待どおりに動作しています...ありがとう!! :) –

0

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

グローバル名付きミューテックスは、アプリケーションの起動時に作成できます。他のすべてのインスタンスは、このmutexをsetと見なし、ただちに終了します。 CreateMutexに関する詳しい情報については徹底的

// 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); 

とそのパラメータはdocumentationを参照してください:ここでの迅速かつ汚いです。

+0

これが主な目的ですが、プロセスが異なるデスクトップ(つまり異なるユーザースペース)にある場合、アプリケーションロジックが複雑になります。その理由で、私は名前付きパイプを使用し始めました。 –

+0

'Global'の代わりに' Local'を前置すると、現在のセッションの他のプロセスだけが見ることができ、デスクトップを越えて見ることができません。他のデスクトップのインスタンスは認識されず、影響を受けません。 – irobot

+0

私はなぜ複雑に言ったのか説明しましょう: - 私はグローバルレベルで単一プロセスに制限したいが、わずかに異なる方法で制限したい。 - 実行可能ファイルがユーザーBの領域で実行されている場合、ユーザーAがプロセスを起動するものとします。したがって、Aのプロセスは、Bのプロセスに終了を要求する。場合によっては、新しいプロセスを既存のプロセスから制御したいと考えています。 –

関連する問題