- PR -

keyPreviewはあって、mousePreviewはない??

1
投稿者投稿内容
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-10 17:59
マウスのイベントをフォームで一括してもらう方法はありませんでしょうか?

Window message を直接調べる方法以外にあれば助かります。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-10-10 18:14
こんにちは。.NET素人のTdnr_Symです。

引用:

ジブさんの書き込み (2005-10-10 17:59) より:
マウスのイベントをフォームで一括してもらう方法はありませんでしょうか?

Window message を直接調べる方法以外にあれば助かります。




Window message を直接調べる方法でスイマセン。

WindowProcをオーバーライドして、
WM_MOUSEFIRST(0x0200)からWM_MOUSELAST(0x020D)までのメッセージをフックすれば可能だと思います。

WM_MOUSELASTはOSのバージョンによって値が変わる可能性があるので注意が必要です。


[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2005-10-10 18:15 ]
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-10 19:49
Tdnr_Symさん、ありがとうございます。

WindowProcのオーバーライドは最後の手段としてとっておきたいと思っています。

とりあえず、一気に子コントロールにイベントハンドラをaddhandlerして、しのいでいます。

子の子のコントロールにも仕込もうかと思ったのですが
どうも美しくないので、なにかよい方法がありそうで
MousePreviewを探していたのです。

どうも、ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-11 08:46
こんにちは、じゃんぬ です。

引用:

ジブさんの書き込み (2005-10-10 19:49) より:

どうも美しくないので、なにかよい方法がありそうで
MousePreviewを探していたのです。


Framework で用意されているものでも、中身が美しくないものが存在します。
でも、外からでは美しく見えますよね? なぜでしょうか?

つまり、MousePreview みたいなプロパティを実装して、
イベントを追加定義して、そこでやれば美しく見えるのではないでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-19 21:50
じゃんぬねっとさん。返事がおそくなって申し訳ありませんでした。

忙殺されて未解決のままになっている案件がいくつかまだ残っているのですが
本件もとりあえずしのいでいる状態という感覚で、自分なりに整理がついておりません。

さて。

引用:

つまり、MousePreview みたいなプロパティを実装して、
イベントを追加定義して、そこでやれば美しく見えるのではないでしょうか?



確かにそういう実装の現実はよくあることですし、
ひとつひとつこつこつとプログラムを書き上げていくことは
私にはそれが理にかなったものであれば「美しい」ものであると考えています。

子の子にまでイベントハンドラを仕込むということは
管理上好ましい仕様になっていないということを意味していて
プログラム的にはきっと楽なんだろうけれど、根本的になにかおかしい
理論的になにか間違っているんじゃなかろうかということがなんとなく引っかかっている
そんなような気持ちの悪さが「美しくない」という表現になったのかなと思います。

おそらく、Windows message を拾うのが一番「スマート」なように思えます。

なぜにKeyPreviewはあるのにMousePreviewがないのか、少し考えてみたいと思います。

その必要性がないのかもしれません。

今はあまり時間がとれません。そのうちまた、考えをまとめて書くかもしれません。

いろいろ、ありがとうございました。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-20 08:50
引用:

ジブさんの書き込み (2005-10-19 21:50) より:

おそらく、Windows message を拾うのが一番「スマート」なように思えます。


ですから、これを拾った時にイベントを Raise するという意味で、

> つまり、MousePreview みたいなプロパティを実装して、
> イベントを追加定義して、そこでやれば美しく見えるのではないでしょうか?

と書きました。

引用:

なぜにKeyPreviewはあるのにMousePreviewがないのか、少し考えてみたいと思います。
その必要性がないのかもしれません。


これには同意です。
Windows の GUI 的に必要ないからですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-01 23:29
こんにちは。

懸案事項が多くて、返信していないのがたくさんあるかもしれません。
ごめんなさい。

さて、

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25643&forum=7&4

を見つけて、そういえばと思い出して返信するしだいです。

WndProcをオーバーライドしてもメッセージがこないとなると
私の想定していた手法は無理ということになりそうです。

やはりUI的に何かが間違っているのだろうと思うしかないのですが
なにが間違っているのかがよくわからないままになってしまいました。

なぜMousePreViewってないのでしょうか?

ないほうがよいものなのでしょうか?

とりあえず、なくてもしのげているからあまり気にしてはいないのですが
しのげるからいらないというものでもない気がしますし。。。

未だにわからないままです。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-11-02 00:08
こんばんは。

再び.NET素人の発言で恐縮なのですが…

引用:

ジブさんの書き込み (2005-11-01 23:29) より:

WndProcをオーバーライドしてもメッセージがこないとなると
私の想定していた手法は無理ということになりそうです。



WndProcをオーバーライドしてもメッセージが取れないんだったら、

メッセージフィルタ(IMessageFilter)を噛まして、メッセージを監視したらいいのではないのでしょうか?
これですと、あるUIスレッドのメッセージキューに対して、
そのスレッドに属する各コントロール(ウィンドウ)にメッセージがディスパッチされる前に
メッセージをフックすることができます。

コード:
class MouseMessageFilter : IMessageFilter
{
	public bool PreFilterMessage(ref Message m) 
	{
		if (0x0200 <= m.Msg && m.Msg <= 0x020D)
		{
			System.Diagnostics.Debug.WriteLine("mouse messages : " + m.Msg);
		}
		return false;
	}
}

[STAThread]
static void Main() 
{
	Application.AddMessageFilter(new MouseMessageFilter());
	Application.Run(new Form1());
}



どうでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)