none
C#でAppActivateを使用して別プロセスのアプリケーションをアクティブに出来ない RRS feed

  • 質問

  • C#にVBコンポーネントを追加しAppActivateの使用したのですが、タイトルに書いた通りの
    現象が起こりました。

    実行環境は以下の様になります。
    ビルド環境
      Windows7
      Visual Studio 2008(C#)
    実行環境
      Vista

    当方が行おうとしている処理をまとめると以下の様になります。
      1. 自アプリから別アプリを起動する
      2. 自アプリから起動した別アプリを前面に表示する
    (補足 2.の処理で、常に手前に表示することは意図していない)

    この2.の処理を、別アプリをアクティブにすることで実現しようと考え、AppActivateを使用したのですが
    アクティブに出来ませんでした。
    (補足:AppActivateのパラメータには、対象となる別アプリのプロセスIDを渡しています)

    以前(実行環境がXP時)は、SetForegroundWindow関数を使用し2.の処理を実現していました。
    Vista移行後、SetForegroundWindow関数が正常に動作しなくなり、この対応としてAppActivateの使用を
    考えたのですが、結果は先述した通りです。
    また、2.の処理でSetWindowPostを使用する事を考えたのですが、常に手前に表示されてしまい
    意図した処理とならないため使用できませんでした。


    2.の処理を実現するためにAppActivateをC#で使用する事は不可能でしょうか?
    また、AppActivate使用以外に2.の処理を実現する方法をご存知でしたらご教授ください。
    よろしくお願い致します。
    2010年2月26日 2:14

回答

  • >AppActivate使用以外に2.の処理を実現する方法
    以下の方法で試してみてください。

    1.SetActiveWindow > SetForegroundWindow
    2.AttachThreadInput > SetForegroundWindow
    3.AttachThreadInput  > SetActiveWindow > SetForegroundWindow
    4.AllowSetForegroundWindow > 1. or 2. or 3.

    いずれもAPIです。

    また、その別アプリがLockSetForegroundWindowでLockしていた場合、
    意図したとおりの動作になるか確認が必要です。
    • 回答としてマーク 菊地俊介 2010年3月8日 9:35
    2010年2月27日 6:37
  • AppActivateは、AttachThreadInput(GetForegroundWindowThreadID())してSetForegroundWindowの流れと認識しています。
    単独のSetForegroundWindowは、Windows98/2000から無邪気な使用が禁止されているわけですから、Vistaからうまくいかないというなら、昇格したプロセスがフォアグランドになっているとき、昇格していないC#アプリからのAttachThreadInputが弾かれるとかそんな話ではないでしょうか。 
    個人的には、ほかのアプリから、フォアグランドを奪取するような仕様自体、いかがなものか、とおもいます。

    jzkey
    • 回答としてマーク 菊地俊介 2010年3月8日 9:35
    2010年3月1日 10:15

すべての返信

  • >AppActivate使用以外に2.の処理を実現する方法
    以下の方法で試してみてください。

    1.SetActiveWindow > SetForegroundWindow
    2.AttachThreadInput > SetForegroundWindow
    3.AttachThreadInput  > SetActiveWindow > SetForegroundWindow
    4.AllowSetForegroundWindow > 1. or 2. or 3.

    いずれもAPIです。

    また、その別アプリがLockSetForegroundWindowでLockしていた場合、
    意図したとおりの動作になるか確認が必要です。
    • 回答としてマーク 菊地俊介 2010年3月8日 9:35
    2010年2月27日 6:37
  • AppActivateは、AttachThreadInput(GetForegroundWindowThreadID())してSetForegroundWindowの流れと認識しています。
    単独のSetForegroundWindowは、Windows98/2000から無邪気な使用が禁止されているわけですから、Vistaからうまくいかないというなら、昇格したプロセスがフォアグランドになっているとき、昇格していないC#アプリからのAttachThreadInputが弾かれるとかそんな話ではないでしょうか。 
    個人的には、ほかのアプリから、フォアグランドを奪取するような仕様自体、いかがなものか、とおもいます。

    jzkey
    • 回答としてマーク 菊地俊介 2010年3月8日 9:35
    2010年3月1日 10:15
  • 皆様、こんにちは。

    kozz さん、jzkey さん、回答ありがとうございます。

    I.N さん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?

    有用な情報と思われたため、kozz さん、jzkey さんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    2010年3月8日 9:37