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

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

C# と VB.NET の入門サイト

Re[3]: メインウィンドウの判断はどうやって行うの?


(過去ログ 119 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

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

分類:[C#] 

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

アドバイスありがとうございます。
引用返信 編集キー/
■69677 / inTopicNo.5)  Re[2]: メインウィンドウの判断はどうやって行うの?
□投稿者/ C#初心者 (20回)-(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);
すると、上手く出来る事が分かりました。

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

先の SetForegroundWindow の Remarks は読まれましたか?
「デバッグしているとき」は特例的に前に表示できますので、非デバッグ(exe を直接実行するなど)状態でも動作確認しておいてください。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -