コントロールのフォーカスが横取りされた場合の対応

このQ&Aのポイント
  • VC++(6.0)/MFCにてアプリを開発しています。ユーザがリストボックス等をマウスにてスクロール中に、バックグラウンド処理でモーダルダイアログを表示すると、マウスダウン中に突然フォーカスが失われるため操作中のコントロールに対しマウスアップメッセージが送信されずモーダルダイアログ側へフォーカスが強制的に移動してしまいます。この問題を解決するための方法について知りたいです。
  • 現在、コントロール単位でオーバーライドしてLostFocus等のイベントで処理していますが、画面上の全てのコントロールに適応可能な「フォーカスが失われたよ」的な処理の実装について教えてください。
  • 操作中のコントロールは、マウスアップイベントが送信されていないために奇妙な動きをすることがあります。どのようにすれば画面上の全てのコントロールに適応可能なフォーカスが失われたときの処理を実装できるのか教えてください。
回答を見る
  • ベストアンサー

コントロールのフォーカスが横取りされた場合の対応

VC++(6.0)/MFCにてアプリを開発しています。 メイン画面上にリストボックス・リストビュー・ボタンの各コントロールを配置し、 ユーザがいつでも操作できるようになっています。 そこで、ユーザがリストボックス等をマウスにてスクロール中に、バックグラウンド 処理でモーダルダイアログを表示すると、マウスダウン中に突然フォーカスが失われ るため操作中のコントロールに対しマウスアップメッセージが送信されずモーダルダ イアログ側へフォーカスが強制的に移動してしまいます。 操作中のコントロールは、マウスアップイベントが送信されていないため、奇妙な動 きをするようになります。 この場合、画面上の全てのコントロールに適応可能な「フォーカスが失われたよ」的 な処理を実装したいのですが、どのようにすればよいのでしょうか。 現在は、コントロール単位でオーバーライドしてLostFocus等で処理しています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

参考にしてください。あしからず 勘違いしている人が実に多いのでいつも驚きますが まずSetFocus()等に関連する「フォーカス」とは キーボードの入力権なのであって、そもそもマウスとは 関係ありません。マニュアルを確認してください。 マウスメッセージをロストするのは他のウインドウが マウスをキャプチャしたり、アクティブになったり するからであって、キーボードフォーカスを 失ったからではありません。従ってこの場合対処すべきメッセージは WM_CAPTURECHANGEDやWM_ACTIVATEなのです。これらのハンドラで 処理の中止を行うと解決するかもしれません。 整理すると処理すべき、又は、いきなり失う可能性のある エッセンシャルには、 1.キーボード入力権(キーボードフォーカス) 2.マウスメッセージ占有権(マウスキャプチャ) 3.前面占有権(アクティベート) があるといえます。それぞれ得た場合と失った場合の処理が 必要な場合があると言えます。

se-tama
質問者

お礼

Situgyosyaさん 勉強不足でした。 今まで無理矢理いろんなことをしていたことを後悔しています。 もう少し本筋を勉強しなおすようにします。 エッセンシャルについては大変参考になりました。 ありがとうございます。

関連するQ&A

  • VB6 ユーザーコントロールのフォーカス無効

    現在VB6 SP5にて、テンキーのようなユーザーコントロールを作成しています。 コマンドボタンを配置し、押された場合にキーボードの入力をエミュレートするような作りにしています。 問題は、作成したコントロールをフォームに貼り付けて使用する場合に、マウスでクリックしたキーに応じて、現在フォーカスのあるテキストボックスなどに入力したいのですが、ユーザーコントロールのコマンドボタンにフォーカスが移ってしまい、うまくいきません。 ユーザーコントロールのCanGetFocusプロパティをFalseに設定しようとすると、「フォーカスを取得できないコントロール上に配置された子コントロールは、フォーカスを取得することができません。」とエラーが表示されてFalseにできません。 フォーカスを無効にし、このような機能を実現するには何か良い方法ありますでしょうか?

  • フォーカスを移動させない方法

    エクセル2003のユーザーフォームにリストボックス1、リストボックス2、テキストボックス1、コマンドボタン1(シート転送用)を作成しました。(タブオーダーはこの順になってます。) 転送用ボタンは最後にクリックしますが、前3個のコントロールの操作の順番はどれでも可能にしたいと思います。ただしテキストボックスは入力の都度クリックしなくてよいようにフォーカスを常駐させたいのです。どなたか簡単な方法を教えてください。

  • フォーカスを移動させない方法

    エクセル2003のユーザーフォームにリストボックス1、リストボックス2、テキストボックス1、コマンドボタン1(シート転送用)を作成しました。(タブオーダーはこの順になってます。) 転送用ボタンは最後にクリックしますが、前3個のコントロールの操作の順番はどれでも可能にしたいと思います。ただしテキストボックスは入力の都度クリックしなくてよいようにフォーカスを常駐させたいのです。どなたか簡単な方法を教えてください。

  • ASP.NET 動的コントロールのフォーカス移動

    ASP.NET(VB)で開発しています。 Page_init時に生成されるテキストボックス1、2(動的コントロール)を表示します。 テキストボックス1のテキストチェンジイベント時に テキストボックス2にフォーカスが移動するようにしたいです。 テキストチェンジでPostBackが発生し、サーバ側でテキストボックス2.Focus() と記述しているのですが、動作は、テキストボックス2に フォーカスが移らず、画面上のどこにもフォーカスがあたっていない状態になってしまいます。 動的コントロールへ、PostBack時にフォーカス移動させるにはどうしたら良いか お願いいたします。

  • Tabコントロールに貼り付けたダイアログ内のフォーカス移動について

    Tabコントロールを使ったソフトを製作中です。 各Tab内のダイアログは、CHILDフラグの付いたウインドウをリソースで作っておき、CreateDialog関数で作成し、TCN_SELCHANGEメッセージを拾ってShowWindowでどのダイアログを見せるかを切り替えています。 マウス操作は問題ないのですが、キーボードのタブキーによるフォーカスの移動がうまくできません。子ダイアログ内の各コントロールを移動させたいのですが、どこにフォーカスがあっても、1回タブキーを押すとTabコントロールにフォーカスが移り、それ以降どこにも移動しないという状態です。 何かメッセージをうまく処理していないのでしょうか?解決策があればご教授お願いします。

  • Web画面でのフォーカスの制御

    <Web画面におけるフォーカスの制御について> VBでよく使うLostFocusのような、データが入力されたあとでの処理をするような機能がWeb画面作成のプログラムでは、あるのでしょうか?

  • 別プロセスのコントロールにフォーカスをあてたい

    VC++5.0 または VC++6.0 の環境で、MFC を使ってダイアログベースの EXEを造っています。 (OS は NT4.0 または 2000 です) 以下のことをしたいと思っています。 ・プロセスA、Bがあります。 ・プロセスAがプロセスBをフォアグランドにします。 →SetForegroundWindow() します。 ・プロセスAがプロセスBのボタンやエディットボックスなどのコントロールに フォーカスをあてる。 で、この最後のフォーカスをあてる処理は実現可能でしょうか? 自分のプロセス内のコントロールに対しては、SetFocus() で フォーカスをあてられたのですが、別プロセスではフォーカスを あてることができませんでした。 識者の方、ご教授願います。

  • MDIの子フォームでフォーカスアウトを制御したい

    MDIの子フォームでフォーカスアウトを制御したい VB2005で開発を行っています。 ・MDIの子フォームA、Bが存在します。 ・子フォームA、Bともに、表示されています。 ・子フォームAにはテキストコントロールAA、ABの2つが存在します。 ・テキストコントロールAAのLostFocus()に、テキストコントロールAA.Focus()が  記されています。 この状態で、子フォームAのテキストコントロールAAからABへフォーカスが移った時、 コントロールAAのLostFocus()で制御するのはうまくいきます。 が、子フォームAのテキストコントロールAAから子フォームBへフォーカスが移った時、 コントロールAAのLostFocus()が動作しますが、無限ループっぽい動きに陥ったり、 子フォームAにフォーカスが設定されません。 子フォームを最小化させたり、全然関係のないアプリケーションやデスクトップに フォーカスを遷移したあとにフォーカスを戻してみても同じような現象になります。 イメージとしては、フォーカスアウトでエラーになったんだから、フォーカスを移し たくないです。 Private Sub ControlAA_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)  If "".Equals(ControlAA.Text) Then   MessageBox.Show("hoge")   ControlAA.Focus()   Return  End If End Sub フォーカスアウト時に項目チェックなどをやる関係で、どうしてもLostFocus()上で 処理をやらなければならないと思われるのですが、フォーカスアウトされた時のオペ レーションの違いに限らず上手く制御させる方法はありませんでしょうか? 調べてはみましたが、MDIの概念でそもそもそういうことするなというような事らしいですが、 フォーカスアウト時に検索処理が走るというような仕様の為、どうしても解決させたいです。

  • フォーカスの移動について

    複数のソフトを使っている時、 キー操作などでフォーカスが使用中の ソフトからはずれてしまった場合、 今はマウスでそのソフトの画面をクリックして フォーカスを戻しています。 これをマウスを使わないでフォーカスを 戻す方法がありますか?

  • フォーカスがどこか行ってしまう

    Windows2000、VB6.0、ActiveReport2.0で開発をしております。 メニュー画面から処理画面を起動(メニュー画面は開いたまま)し、 処理画面から実行押下にて実行処理&印刷をするプログラムになっています。 印刷はある条件を満たさなかった場合、帳票側でキャンセル処理(Me.Cancel)をしています。 処理が印刷が終わったら(実行処理していても)フォーカスを処理画面のテキストボックスに移動させるようにしています。しかし、印刷がキャンセル処理された場合にフォーカスがどこか行ってしまいます。 何か対処法などありますでしょうか?

専門家に質問してみよう