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

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

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

No.69673 の関連記事表示

<< 0 >>
■69673  メインウィンドウの判断はどうやって行うの?
□投稿者/ C#初心者 -(2014/01/19(Sun) 11:54:00)

    分類:[C#] 

    C#でアプリケーションを作成し、そのアプリケーションを実行する。
    その他のアプリケーションも実行する。

    ここで、複数のウィンドウが開かれているとします。
    そして、任意に複数のウィンドウで操作しているとします。

    1分後に現在、操作しているウィンドウ(メインウィンドウ)
    がC#で作成しているウィンドウなのか
    それとも他のアプリケーションで開いているウィンドウなのか
    を判断し、メインとなっているウィンドウのタイトルを
    C#で作成したアプリケーションのテキストボックスに表示したいです。

    尚、C#で作成したアプリケーションはForm1で作成し、
    表示するテキストボックスはTextbox1.Textとします。


    これを行いたい理由は、
    あるタイミングでメインのウィンドウがC#で作成したアプリケーション以外
    の場合に、メインのウィンドウをC#で作成したアプリケーションに
    強制的に戻したいためです。

    どなたかアドバイスのほどお願いします。

    簡易的でもよいので
    ソースを添付していただけると更に助かります。
親記事 /過去ログ119より / 関連記事表示
削除チェック/

■69674  Re[1]: メインウィンドウの判断はどうやって行うの?
□投稿者/ オショウ -(2014/01/19(Sun) 13:30:41)
    No69673 (C#初心者 さん) に返信
    > これを行いたい理由は、
    > あるタイミングでメインのウィンドウがC#で作成したアプリケーション以外
    > の場合に、メインのウィンドウをC#で作成したアプリケーションに
    > 強制的に戻したいためです。
    >
    > どなたかアドバイスのほどお願いします。

      簡単に・・・とすると、基本、ウィンドウやコントロールには
      フォーカスを得た場合とフォーカスが無くなった場合のイベント
      があります。

      他のウィンドウで作業と言うことは、そのメインたるウィンドウ
      はそれ以前にフォーカスをロストしたことになり、イベントが発
      生したはずです。

      よって、フォーカスがロストした以降で、何かの通信手段で表に
      なるよう知らせることができれば、メインウィンドウの方で、自
      身がフォーカスを再取得するように動作させれば、欲しい機能と
      なると思います。

      ただ、フォーカスをロストした後、何を以って表に持ってこさせ
      るか?と言う判断をどうするかです。
      一般的には、スクリーンセーバーのように何もイベントが無くな
      ってしまい、所定の時間経過した場合に何らかのイベントを発生
      させて、メインウィンドウを表にさせる。と言う動作でしょうか

      しかしながら、全てのアプリに何らかの連携する機能を組み込ま
      ないといけないので、自分で作ったものでは無いアプリにも・・・
      となると使えませんネ!

      メインのアプリだけに細工するならば、スクリーンセーバーモド
      キの機能を組み込んで、所定時間、デスクトップにイベントが発
      生しなくなったら、自分自身のメインウィンドウを表にさせる。
      と言うような動きなら、メインのプログラムだけで済むかと思い
      ます。

      残るは、本当にスクリンセーバー作って、メインのアプリに知ら
      せる方式とすることでしょうか。通知方法は、API のPostMessage
      でよいかと。メインのアプリは、WndProcをオーバーライドすれば
      PostMessageされたWM_USER+αのメッセージが受け取れるので。

    ※ 最終的には、簡単にはいかないか・・・

    以上。参考まで
記事No.69673 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69676  Re[2]: メインウィンドウの判断はどうやって行うの?
□投稿者/ C#初心者 -(2014/01/19(Sun) 22:21:27)
    No69674 (オショウ さん) に返信
    > ■No69673 (C#初心者 さん) に返信
    >>これを行いたい理由は、
    >>あるタイミングでメインのウィンドウがC#で作成したアプリケーション以外
    >>の場合に、メインのウィンドウをC#で作成したアプリケーションに
    >>強制的に戻したいためです。
    >>
    >>どなたかアドバイスのほどお願いします。
    >
    >   簡単に・・・とすると、基本、ウィンドウやコントロールには
    >   フォーカスを得た場合とフォーカスが無くなった場合のイベント
    >   があります。
    >
    >   他のウィンドウで作業と言うことは、そのメインたるウィンドウ
    >   はそれ以前にフォーカスをロストしたことになり、イベントが発
    >   生したはずです。
    >
    >   よって、フォーカスがロストした以降で、何かの通信手段で表に
    >   なるよう知らせることができれば、メインウィンドウの方で、自
    >   身がフォーカスを再取得するように動作させれば、欲しい機能と
    >   なると思います。
    >
    >   ただ、フォーカスをロストした後、何を以って表に持ってこさせ
    >   るか?と言う判断をどうするかです。
    >   一般的には、スクリーンセーバーのように何もイベントが無くな
    >   ってしまい、所定の時間経過した場合に何らかのイベントを発生
    >   させて、メインウィンドウを表にさせる。と言う動作でしょうか
    >
    >   しかしながら、全てのアプリに何らかの連携する機能を組み込ま
    >   ないといけないので、自分で作ったものでは無いアプリにも・・・
    >   となると使えませんネ!
    >
    >   メインのアプリだけに細工するならば、スクリーンセーバーモド
    >   キの機能を組み込んで、所定時間、デスクトップにイベントが発
    >   生しなくなったら、自分自身のメインウィンドウを表にさせる。
    >   と言うような動きなら、メインのプログラムだけで済むかと思い
    >   ます。
    >
    >   残るは、本当にスクリンセーバー作って、メインのアプリに知ら
    >   せる方式とすることでしょうか。通知方法は、API のPostMessage
    >   でよいかと。メインのアプリは、WndProcをオーバーライドすれば
    >   PostMessageされたWM_USER+αのメッセージが受け取れるので。
    >
    > ※ 最終的には、簡単にはいかないか・・・
    >
    > 以上。参考まで

    アドバイスありがとうございます。
記事No.69673 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69675  Re[1]: メインウィンドウの判断はどうやって行うの?
□投稿者/ Azulean -(2014/01/19(Sun) 20:50:57)
    2014/01/19(Sun) 20:57:04 編集(投稿者)

    No69673 (C#初心者 さん) に返信
    > 1分後に現在、操作しているウィンドウ(メインウィンドウ)

    これはメインウィンドウと呼びません。
    アクティブウィンドウとか、フォーカスを持ったウィンドウという表現になるでしょうか。


    > メインとなっているウィンドウのタイトルを
    > C#で作成したアプリケーションのテキストボックスに表示したいです。
    >
    > 尚、C#で作成したアプリケーションはForm1で作成し、
    > 表示するテキストボックスはTextbox1.Textとします。

    この部分と、次の部分の関係がよくわかりません。
    テキストボックスに表示することと、アクティブウィンドウを変更することには関係性がないためです。

    > これを行いたい理由は、
    > あるタイミングでメインのウィンドウがC#で作成したアプリケーション以外
    > の場合に、メインのウィンドウをC#で作成したアプリケーションに
    > 強制的に戻したいためです。


    最近の Windows では、アクティブではなくなった、裏に回った状態からプログラムが勝手にアクティブウィンドウを変更することはできません。
    そういう風に Windows が制限しています。表に出ようとしてもタスクバーで点滅するぐらいになります。
    これが導入された背景は、文字列の入力などの操作中に勝手に表に出てきてユーザー操作を阻害してしまうことがあったからだと思われます。


    SetForegroundWindow がアクティブにウィンドウにする API になりますが、ここの Remarks に条件が書いています。(英語)
    どういった条件であれば勝手に表に出てこれるのか、読んでみてください。
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539


    逆に、アクティブウィンドウを取得するのは GetForegroundWindow です。これで得られたウィンドウハンドルから GetWindowText をやればウィンドウタイトルをとれたはず…。
記事No.69673 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69677  Re[2]: メインウィンドウの判断はどうやって行うの?
□投稿者/ C#初心者 -(2014/01/19(Sun) 22:23:09)
    No69675 (Azulean さん) に返信
    > 2014/01/19(Sun) 20:57:04 編集(投稿者)
    >
    > ■No69673 (C#初心者 さん) に返信
    >>1分後に現在、操作しているウィンドウ(メインウィンドウ)
    >
    > これはメインウィンドウと呼びません。
    > アクティブウィンドウとか、フォーカスを持ったウィンドウという表現になるでしょうか。
    >
    >
    >>メインとなっているウィンドウのタイトルを
    >>C#で作成したアプリケーションのテキストボックスに表示したいです。
    >>
    >>尚、C#で作成したアプリケーションはForm1で作成し、
    >>表示するテキストボックスはTextbox1.Textとします。
    >
    > この部分と、次の部分の関係がよくわかりません。
    > テキストボックスに表示することと、アクティブウィンドウを変更することには関係性がないためです。
    >
    >>これを行いたい理由は、
    >>あるタイミングでメインのウィンドウがC#で作成したアプリケーション以外
    >>の場合に、メインのウィンドウをC#で作成したアプリケーションに
    >>強制的に戻したいためです。
    >
    >
    > 最近の Windows では、アクティブではなくなった、裏に回った状態からプログラムが勝手にアクティブウィンドウを変更することはできません。
    > そういう風に Windows が制限しています。表に出ようとしてもタスクバーで点滅するぐらいになります。
    > これが導入された背景は、文字列の入力などの操作中に勝手に表に出てきてユーザー操作を阻害してしまうことがあったからだと思われます。
    >
    >
    > SetForegroundWindow がアクティブにウィンドウにする API になりますが、ここの Remarks に条件が書いています。(英語)
    > どういった条件であれば勝手に表に出てこれるのか、読んでみてください。
    > http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539
    >
    >
    > 逆に、アクティブウィンドウを取得するのは GetForegroundWindow です。これで得られたウィンドウハンドルから GetWindowText をやればウィンドウタイトルをとれたはず…。

    GetForegroundWindow();
    SetForegroundWindow(hWnd);
    すると、上手く出来る事が分かりました。

    ありがとうございます。
記事No.69673 のレス /過去ログ119より / 関連記事表示
削除チェック/

■69679  Re[3]: メインウィンドウの判断はどうやって行うの?
□投稿者/ Azulean -(2014/01/19(Sun) 23:04:46)
    No69677 (C#初心者 さん) に返信
    > GetForegroundWindow();
    > SetForegroundWindow(hWnd);
    > すると、上手く出来る事が分かりました。

    先の SetForegroundWindow の Remarks は読まれましたか?
    「デバッグしているとき」は特例的に前に表示できますので、非デバッグ(exe を直接実行するなど)状態でも動作確認しておいてください。
記事No.69673 のレス /過去ログ119より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -