C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.70089 の関連記事表示

<< 0 >>
■70089  起動元アプリをアクティブにする。
□投稿者/ C#研究者 -(2014/02/24(Mon) 17:29:48)

    分類:[C#] 

    実行環境 Windows7 32bit
    開発環境 Windows7 32bit VisualStudio C#2010

    C#でフォームから別プロセスを立ち上げたときに起動元のフォームは非アクティブになってしまいます。
    起動元のアプリを再びアクティブにしたいのですが、どのようにすればよろしいでしょうか。
親記事 /過去ログ120より / 関連記事表示
削除チェック/

■70105  Re[1]: 起動元アプリをアクティブにする。
□投稿者/ tocs -(2014/02/24(Mon) 21:29:27)
>
    やりたいことからすると、FormのTopMost = TRUEでいいかと。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70106  Re[2]: 起動元アプリをアクティブにする。
□投稿者/ Azulean -(2014/02/24(Mon) 22:55:52)
    No70089 (C#研究者 さん) に返信
    > C#でフォームから別プロセスを立ち上げたときに起動元のフォームは非アクティブになってしまいます。
    > 起動元のアプリを再びアクティブにしたいのですが、どのようにすればよろしいでしょうか。

    Win32 API を使うことになるかもしれませんね。


    http://msdn.microsoft.com/ja-jp/library/cc422072.aspx
    最後の引数に SW_SHOWNOACTIVATE など、アクティブ状態を変化させないものを選ぶとか。


    No70105 (tocs さん) に返信
    > やりたいことからすると、FormのTopMost = TRUEでいいかと。

    「アクティブであることと」、「前面にあること」は、実際には違います。
    前面にあるけど入力フォーカスがないということがあり得るためです。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70107  Re[3]: 起動元アプリをアクティブにする。
□投稿者/ 魔界の仮面弁士 -(2014/02/24(Mon) 23:23:11)
    No70106 (Azulean さん) に返信
    > Win32 API を使うことになるかもしれませんね。
    > 例
    > http://msdn.microsoft.com/ja-jp/library/cc422072.aspx
    > 最後の引数に SW_SHOWNOACTIVATE など、アクティブ状態を変化させないものを選ぶとか。

    SW パラメータだけであれば、WshShell.Run メソッドでも指定できます。
    http://msdn.microsoft.com/ja-jp/library/cc364421.aspx

    dynamic wshShell = Activator.CreateInstance(Type.GetTypeFromProgID("WScript.Shell"));
    wshShell.Run("WindowsFormsApplication1.exe", 8);


    COM クラスの利用に抵抗がある場合は、Microsoft.VisualBasic.Interaction.Shell メソッドも利用できます。
    http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.interaction.shell.aspx



    なお起動するアプリによっては、指定した起動パラメータを無視するように
    実装されているケースもありますので、実際に実環境で試してみてください。
    (この点は、ProcessStartInfo を使った場合も同じことです)
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70110  Re[4]: 起動元アプリをアクティブにする。
□投稿者/ tocs -(2014/02/25(Tue) 00:31:29)
>
    No70106 (Azulean さん) に返信
    >「アクティブであることと」、「前面にあること」は、実際には違います。
    > 前面にあるけど入力フォーカスがないということがあり得るためです。

    おっしゃるとおりですね。すみません、考慮不足でした。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70125  Re[5]: 起動元アプリをアクティブにする。
□投稿者/ C#研究者 -(2014/02/25(Tue) 18:45:17)
    WshShell.Run メソッドで起動は出来ましたが、アクティブを抑えることはできませんでした。
    ソフトウェアキーボード(フリーツール)を立ち上げた後、
    カーソルが入力フォームから外れて入力できなくなるので困っております。

    別プログラムのアクティブを抑える以外にも何か方法があるのでしょうか。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70132  Re[6]: 起動元アプリをアクティブにする。
□投稿者/ ホワイトタイガー猫 -(2014/02/25(Tue) 20:10:13)
    2014/02/26(Wed) 19:34:14 編集(投稿者)

    フォームのActivateメソッドを呼び出せば任意のタイミングでアクティブになるのではないでしょうか?

    Form.Activate メソッド
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.activate(v=vs.110).aspx
    Form.Deactivate イベント
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.deactivate(v=vs.110).aspx

    フォーカスが外れたのであれば、対象のコントロールのFocusメソッドでいかがでしょうか?

    Control.Focus メソッド
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.focus(v=vs.110).aspx

    別プログラムの実行によってすぐに非アクティブ状態になるとは限りませんから、少し時間を置くような処理も追加すると良いかもしれません。

    別プログラムというのがご自身で作ったものでしたら、プロセス間通信を利用すれば両者のプログラムの間でオブジェクトや命令(デリゲート)を共有することができます。
    プロセス間通信の手段については.Net Frameworkに複数用意されてます。例えばこちら
    http://programmers.high-way.info/cs/ipc.html


    あ、なるほど。すみません単純な質問かと勘違いしていました。
    ウィンドウが点滅状態にならないように必ずアクティブにしたい、ということでしょうか。
    10年前くらいに似たような経験がありますが、その時はAttachThreadInputを使用していた覚えがあります。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70133  Re[7]: 起動元アプリをアクティブにする。
□投稿者/ 魔界の仮面弁士 -(2014/02/25(Tue) 20:20:03)
    No70132 (ホワイトタイガー猫 さん) に返信
    > フォームのActivateメソッドを呼び出せば任意のタイミングでアクティブになるのではないでしょうか?

    アプリ内でのアクティブ制御には使えても、
    アプリ間でのアクティブ制御には使えないはず。

    提示頂いた URL にも
      アクティブなアプリケーションではないフォームの場合は、
      そのフォームのウィンドウ キャプションが点滅します。
    とありますよね。
    他のアプリがアクティブであった場合に、それを奪うことができるわけではありません。


    ZOrder の話と入力フォーカスの話が混じるのでややこしいところですが、
    参考までに、起動したアプリの画面切り替えについての話題を紹介しておきます。
    http://social.msdn.microsoft.com/Forums/ja-jp/9ded5a24-ee3f-41ea-92b6-4df60a07117e/
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70211  Re[8]: 起動元アプリをアクティブにする。
□投稿者/ 甕星 -(2014/03/02(Sun) 05:34:22)
    No70133 (魔界の仮面弁士 さん) に返信
    > アプリ内でのアクティブ制御には使えても、
    > アプリ間でのアクティブ制御には使えないはず。
    >
    > 提示頂いた URL にも
    >   アクティブなアプリケーションではないフォームの場合は、
    >   そのフォームのウィンドウ キャプションが点滅します。

    SetForegroundWindow(http://msdn.microsoft.com/ja-jp/library/cc411039.aspx)というAPIを使います。

    ただし、アプリ間でのアクティブ制御を行えるのは、アプリ間でアクティブなプロセスだけです。
    普通に子プロセスを起動すると、アプリ間でアクティブ制御を行なう権限が子プロセスに異動してしまうので、
    子プロセス側でSetForegroundWindowを呼び出して、アクティブなウィンドウを制御すれば良いと言うことになります。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70134  Re[1]: 起動元アプリをアクティブにする。
□投稿者/ 粍ン -(2014/02/25(Tue) 21:09:36)
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70152  Re[2]: 起動元アプリをアクティブにする。
□投稿者/ C#研究者 -(2014/02/26(Wed) 16:57:11)
    皆様ありがとうございます。

    何度もアクティブ状態にすると他のウインドウの動作に影響がありそうなので、
    別の手段を講じることにします。


    回答ありがとうございました。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70167  Re[3]: 起動元アプリをアクティブにする。
□投稿者/ tocs -(2014/02/26(Wed) 21:44:31)
>
    No70134 (粍ン さん) に返信

    > これを起動元に置き換えればいいだけだったり?
    > http://jeanne.wankuma.com/tips/csharp/process/activewindow.html

    気になったのでやってみました、これだけではダメみたいです。
    Process.StartからSleep(500)とかしてからこれするといけるようです。
    別プロセスが立ち上がってウィンドウが前面に出るまでタイムラグがあるんでしょうね。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/

■70216  Re[4]: 起動元アプリをアクティブにする。
□投稿者/ C#研究者 -(2014/03/03(Mon) 18:03:04)
    なるほどSetForegroundWindowですか。
    表示対象フォームは自作することになったので内部でアクティブになる処理を埋め込むことにしましたが、
    今後もこのような事態はありそうなので、活用させていただきます。ありがとうございます。

    やはり別のアプリを動かすのは難しいですね。
    皆様ありがとうございます。
記事No.70089 のレス /過去ログ120より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -