ウインドウのフォーカスとキー入力の関係

[戻る]
DIO 2007/02/06(火) 20:30:40
WinXPpro VS2005 SDK

いつもお世話になってます。
早速ですが質問です。

表題の件、ウインドウのフォーカスと、
キー入力の受け付けについて質問です。

以下が大まかな流れです。

main()
{
  1.ウインドウクラスの登録
  2.CreateWindowでウインドウの作成(POPUPWINDOW)
  3.ShowWindow(SW_SHOW);
   SetWindowPos(・・・・,SWP_TOPMOST,・・・);
  4.FindWindowでハンドル取得
  5.最小化されているか判別
   1.最小化なし
    PrintWindowでウインドウイメージ取得
   2.最小化中
    ShowWindow(SW_RETSORE)で表示
    PrintWindowでウインドウイメージ取得
    ShowWindow(SW_MINIMZE)で最小化
  6.イメージを表示
 (7.SetFoucus)
}

最小化していないときは
作成したウインドウはフォーカスを持ち、選択しなくてもキー入力を受け付けます。

しかし、最小化中の処理を通ったあとは
別のウインドウ(この直前にトップだったウインドウ)が
フォーカスを持ち、キー入力を受け付けない状態になってしまいます。

そこで、最後に
SetFocusを加えて明示的にフォーカスを与えたのですが変化・改善せず、

タイマーを用いて周期的に(100msecごとにずっと)
SetFocusやSetWindowActiveなどを呼んでみても変化しませんでした。

ShowWindow(SW_RETSORE)の直前にSetFocusもやってみました。

ウインドウハンドルの取得や
関数の成功不成功はすべて確認しました。
渡しているウインドウハンドルも間違ってないと思います。

そこで質問なのですが、

1.
フォーカスを持たす = キー入力のメッセージが飛んでくる
と考えていたのですが、違うのでしょうか?

2.
それとも、POPUPWINDOW設定の特徴なのでしょうか?
(タスクバーにボタンを表示させないためこの設定にシテイマス)

3.
それとも、TOPMOST設定(Zオーダ)なども関係しているのでしょうか?

4.
その他見落としていそうな点

などございましたらご指摘ください。
よろしくお願いいたします。

DIO 2007/02/06(火) 20:33:00
補足

FindWindowは実際にはEnumWindowで
取得->表示のプロセスはループになっています。

Kerry 2007/02/06(火) 20:43:38
PrintWindowするウィンドウが他プロセスのウィンドウであるならば、
恐らく SetForegroundWindow を使うべきかと。

ただし、Windows 2000以降はアプリケーションがフォアグラウンド
ウィンドウを設定するのに幾つかの制限が加わりますので注意が必要です。
詳しくはヘルプを参照してください。

DIO 2007/02/06(火) 21:07:23
>Kerryさん

早速の返信ありがとうございます。

ところで、SetForegroundWindowは何の効果を狙ってするのでしょうか?
ルールということでしょうか?

PrintWindowするウィンドウを SetForegroundWindow 
すると、フォーカスやキー入力関係がどう動くのかを、もう少し
ご教授いただけませんでしょうか?

(念のためですがウインドウイメージの取得自体は出来ています)

Kerry 2007/02/06(火) 21:50:43
アプリケーションがバックグラウンドで動作しているときは、SetFocusを
実行しただけでは、ウィンドウはキー入力を得ることはできません。
この場合、アプリケーション(スレッド)をフォアグラウンドにしてやる
必要があります。そのためのAPIがSetForegroundWindowです。

> PrintWindowするウィンドウを SetForegroundWindow 

違います。ShowWindow(SW_RESTORE)などによって、フォアグラウンド
ウィンドウが変更されていると思われるので、最終的にキー入力を
受けたいアプリケーションのウィンドウに対して(SetFoucusを行う直前に)
フォアグラウンドウィンドウを設定する必要があるのではないか、ということです。

DIO 2007/02/07(水) 20:22:55
[[解決]]
Setforgroundで出来ました。
ありがとうございます。

キー入力を受けるのはフォアグラウンドのウインドウで
あるというところは理解できました。

が、フォーカスの意味がよくわかりません。

たとえば、フォアグラウンドのウインドウの中で
エディットボックスがあったらそこにフォーカスを渡すと
エディットボックスが受けますよね?

親から子の時はキー受付先の移動があるということ?
でしょうか?


フォーカスの役割みたいなものって何なのでしょうか?

PATIO 2007/02/09(金) 11:14:40
解決になっているのに質問が続いている。(--;

フォアグラウンドでなくてもそのウインドウ内の何処にフォーカスがあるかと言うのは
話が別なのではないでしょうか。
例えば、バックに回っているウインドウが再びフォアグラウンドに出てきた時に
特に変更されていなければ、フォーカスはバックにまわる直前の状態になっていませんか?
フォアグラウンドで無いウインドウでもフォーカスの状態はきちんと保持されています。
そして、フォーカスの状態はアプリがフォアグラウンドになった時に目に見える状態にな
ります。
バックのウインドウ上のフォーカスを変更しても内部で保持している状態が変化する
だけの話でこれが目に見える状態に反映されるのはアプリがフォアグラウンドになった時
と考えれば、整理がつくと思います。

DIO 2007/02/12(月) 20:23:58
すいません。
オマケの質問はまずいかと・・・

>PATIOさん
丁寧な回答ありがとうございます。
理解できたと思います。

1.
キー入力はフォアグラウンドのウインドウに行く。
2.
ウインドウの中のどこ(エディットボックスやメニューやウインドウ自体等)に
キー入力が行くかはウインドウの持っているフォーカスに依る
3.
ウインドウは自身のフォーカスを保持する
4.
フォアグラウンドとZオーダは無関係(通常はフォア=最善面)のことが多い

と理解しました。

古いスレッドには追加発言できません。