DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MDICrient領域でMOUSE_MOVEを拾いたい

環境/言語:[WIN2000 or XP VB.NET2003 Framework1.1]
分類:[.NET]


MDIフォームの親フォームのMDICrient領域で
MOUSE_MOVEを拾いたいのですがどのようにすればいいのか分かりません

MDICrientのWinPrc()をオーバーライドしてMOUSE_MOVEを拾えたらと思ったのですが
MSDNではMDICrientのメンバは直接アクセスできないとのことでした。
SetWindowLongを使用しMDIFormのサブクラス化 というのがヒントのように感じているのですが、SetWindowLongの仕様方法がわかりません。

何をやりたいのかと言うと MDIで作成したアプリケーションにスクリーンセイバーのような無操作状態を監視してロックをかける機能を作りたいのです。

フォームには1秒タイマで変数をカウントアップしていき
マウスムーブにてカウンタをクリアと言うような仕組みを考えております。

分からないだらけで申し訳ありませんが
ご教授いただけないでしょうか
宜しくお願い致します
MDIClientはForm上のコントロールとして扱われるので、

For Each ctrl As Control In Me.Controls
If ctrl.GetType() Is GetType(MdiClient) Then
'このctrlはMdiClientです
End If
Next

という方法で取得できます(privateメンバであるGetMdiClient()を面倒な手続きを経て呼び出す方法もありますが、こちらはおすすめしません)。
それから、WndProcをオーバーライドしなくてもMdiClientはControlクラスの派生クラスなのでMouseMoveイベントを使用してはどうでしょう。

ところで、マウスが移動したかどうかが重要ならば使用が推奨されないMdiClientやSetWindowLongの使用のように将来の変更に対して問題が残りそうな方法ではなく、CursorクラスのCurrentプロパティを使用して現在のマウスカーソルを取得し、Positionプロパティをタイマーのカウントの時に以前の状態と比較して使うというのはどうでしょうか。

Private prevPosition As Point = Point.Empty

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Me.prevPosition.Equals(Cursor.Current.Position) Then
'マウスは同じ位置なのでカウントする
Else
'マウスが移動したので新たな位置を記録してカウントをリセットする
Me.prevPosition = Cursor.Current.Position
End If
End Sub
Codingslaveさん
ありがとうございます

> ところで、マウスが移動したかどうかが重要ならば使用が推奨されないMdiClientやSetWindowLongの使用のように将来の変更に対して問題が残りそうな方法ではなく、CursorクラスのCurrentプロパティを使用して現在のマウスカーソルを取得し、Positionプロパティをタイマーのカウントの時に以前の状態と比較して使うというのはどうでしょうか。

MdiClientやSetWindowLongが用が推奨されないことを知りませんでした
Positionプロパティを使用する方向で試してみます。
家の環境には、.NETが無いので
明日会社で行ってみます。
結果は、明日報告いたします。
申し訳ありません。
今日会社で
CursorクラスのCurrentプロパティを使用した方法を
試してみました。
お客様も満足で OKをもらえました
本当にありがとうございました。
では、また...

今度は、回答側に立てるように技術を身に付けたいと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板