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

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

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

Form上でキーを押した時Formを最前面にするには?

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

■92014 / inTopicNo.1)  Form上でキーを押した時Formを最前面にするには?
  
□投稿者/ 多雨ロス (1回)-(2019/08/17(Sat) 21:42:25)

分類:[.NET 全般] 

複数のFormをもったアプリケーションをVB.NETを使って作成しているのですが、
アクティブではない(最前面ではない)ウインドウの上にマウスカーソルを合わせると
そのウインドウがアクティブになるようにするにはどうしたら良いですか?

バックグランドでDoループを回し、
カーソルの位置座標を常に取得しつつ
それぞれのFormの座標の中に入ったら、そのFormを最前面化するしかないですか?



あるいは、アクティブではないウインドウの上で
Shiftキーなど何かキーを押した時に、最前面化するだけなら
もっと簡単にできますか?


引用返信 編集キー/
■92016 / inTopicNo.2)  Re[1]: Form上でキーを押した時Formを最前面にするには?
□投稿者/ 魔界の仮面弁士 (2310回)-(2019/08/17(Sat) 22:23:00)
No92014 (多雨ロス さん) に返信
> アクティブではない(最前面ではない)ウインドウの上にマウスカーソルを合わせると
> そのウインドウがアクティブになるようにするにはどうしたら良いですか?

ウィンドウというのは、いわゆる Form に限定した話でしょうか。
それとも、TextBox や ComboBox などのウィンドウも含めたアクティブ化の切り替えでしょうか。
また、それは他のアプリも含めての切り替えなのでしょうか?

自アプリ内だけであれば、MDI でも SDI でも何とかなりそうですが、
他アプリのアクティブ化状態まで奪うのだとすると、それはそれで問題がありそうな予感。
(たとえば、漢字変換処理中にマウスカーソルが移動して、入力メッセージが阻害されたりとか)

それと、アクティブ状態であるかどうかと、そのウィンドウが最前面にあるかどうかは別の話です。


> バックグランドでDoループを回し、
Do ループでの監視は基本的に NG です。(本来のメッセージループを阻害してしまうため)
代わりに、こんな方法は如何でしょうか。

案1) Timer の Interval を 0.1〜0.2 秒程度の間隔とし、Cursor.Position を取得する。

案2) Application の Idle イベントで Cursor.Position を取得する。

案3) DirectInput を利用して、マウス入力をイベント通知的に受け取る。


※座標配下のウィンドウを調べる方法や、それがアクティブ化どうかを判断したり、
 アクティブ状態にする方法は実装できるものとして。


> あるいは、アクティブではないウインドウの上で
> Shiftキーなど何かキーを押した時に、最前面化するだけなら
> もっと簡単にできますか?

(案1) 対象となる全てのウィンドウで KeyDown/KeyUp イベントをハンドリングする。

(案2) Timer 監視で、System.Windows.Input.Keyboard.IsKeyDown() メソッド等で入力判定

(案3) Application の Idle イベントで以下同文

(案4) DirectInput を利用して、キーボード入力をイベント通知的に受け取る
引用返信 編集キー/
■92017 / inTopicNo.3)  Re[2]: Form上でキーを押した時Formを最前面にするには?
□投稿者/ 多雨ロス (2回)-(2019/08/17(Sat) 23:25:12)
> ウィンドウというのは、いわゆる Form に限定した話でしょうか。
> それとも、TextBox や ComboBox などのウィンドウも含めたアクティブ化の切り替えでしょうか。
> また、それは他のアプリも含めての切り替えなのでしょうか?

> 自アプリ内だけであれば、MDI でも SDI でも何とかなりそうですが、


ウインドウはFormに限定した話です。
そして自アプリ内だけの話です。

どのようにすれば宜しいでしょうか?


> Do ループでの監視は基本的に NG です。(本来のメッセージループを阻害してしまうため)

これはなぜですか?

実は別のプログラムでキーボードやジョイスティックが押されたかをリアルタイムでモニタリングするために
Doループを使ったプログラムを作成してあるのですが、
そちらは特に問題なく動作しています。

本来のメッセージループとは一体何のことでしょうか?


引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ