- PR -

[VB.NET]Windowsアプリケーションでの無入力監視

1
投稿者投稿内容
紅茶
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2006-02-07 12:01
紅茶と申します。いつも拝見させて頂いています。
さっそくですがお知恵をお借りしたく質問させて頂きます。

VB.NETによるWindowsアプリケーションにおいて、「一定の時間
何らかの操作がなかった場合初期画面に戻る。」という要件が
あります。この要件を実現するにあたり、タイマーコントロール
を使用して初期画面に戻るようにし、タイマーをマウスイベント
でリセットするようにしています。
しかしながら、この方法ではフォーム上に配置されたコントロール
のイベントを拾うことができずにタイマーがリセットされません。
すべてのコントロールに対してハンドラを登録すれば実現できそう
ではありますが、他にスマートなやり方はありませんでしょうか?
キーボード操作に関しては、KeyPreviewというプロパティがある
ようですが・・・



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

紅茶さんの書き込み (2006-02-07 12:01) より:

キーボード操作に関しては、KeyPreviewというプロパティがあるようですが・・・


今回の場合は、こちらが参考になるのかな。

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

マウスやキーボードに拘らず、メッセージ監視で良いと思いますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
紅茶
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2006-02-07 16:18
じゃんぬねっとさん
いつもご回答ありがとうございます。
またしても過去スレがあったようで;

結論から申しますと、子フォームから親フォームへ通知されるWMを
拾ってみたところ、やはり一部(WM_MOUSEMOVEでしょうか?)WMは
拾えないようです。しっかり確認したわけではありませんが一覧を
見た限りでは見当たらなかったです。よって、WMを使用するケース
でも継承コントールを作成しなければならないと判断したので、
スマートではありませんがハンドラを登録していくという形で解決
しました。(緊急更改のため辛いところですが;)
次回があればまた検討したいと思います。

ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-07 16:36
引用:

紅茶さんの書き込み (2006-02-07 16:18) より:

結論から申しますと、子フォームから親フォームへ通知されるWMを拾ってみたところ、


何故いきなり「子フォーム」「親フォーム」という文言が出てくるんですか?
先の投稿までは、そんな構成は感じ取れなかったのですが...

引用:

やはり一部(WM_MOUSEMOVEでしょうか?)WMは拾えないようです。
しっかり確認したわけではありませんが一覧を見た限りでは見当たらなかったです。


コントロールの上となると、WM_SETCURSOR 系統くらいになりますか。(多分)
ただ、Button フェイスなコントロールは、フォームは何も拾わないかも。

引用:

よって、WMを使用するケースでも継承コントールを作成しなければならないと判断したので、
スマートではありませんがハンドラを登録していくという形で解決しました。


うーん。

コード:

    Private Sub Form_Load(...) Handles MyBase.Load
        AddHandler Me.MouseMove, AddressOf AllControl_MouseMove
        AddMouseMoveEventHandler(Me)
    End Sub

    Private Sub AddMouseMoveEventHandler(ByVal hParent As Control)
        For Each hControl As Control In hParent.Controls
            If hControl.HasChildren = True Then
                AddMouseMoveEventHandler(hControl)
            End If

            AddHandler hControl.MouseMove, AddressOf AllControl_MouseMove
        Next hControl
    End Sub

    Private Sub AllControl_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
        Console.WriteLine("MouseMoved!!")
    End Sub


そこまでスマートでないこともないでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-02-07 16:40
いやいやいや、だからApplication.AddMessageFilterが最後であがっているでしょ。
これは、メッセージループでメッセージをディスパッチする前に取得するのでアプリケーションが取得したすべてのメッセージを捉えることが出来るはず(KeyPreviewは確かこれで実現されている)。
紅茶
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2006-02-07 18:20
>じゃんぬねっとさん

引用:

何故いきなり「子フォーム」「親フォーム」という文言が出てくるんですか?
先の投稿までは、そんな構成は感じ取れなかったのですが...



失礼致しました。「親フォーム」⇒「フォーム」、「子フォーム」⇒「コントロール」
と読み替えてください。当方、Windows GUI 開発が初めてなもので文言を混同させて
しまいました。申し訳ありません(汗)

引用:

そこまでスマートでないこともないでしょう。



当該アプリでは、コントロール下にもコントロールを持っていたり動的に生成
してる部分が多く見られたので ControlAdded と併せてハンドラ登録の再帰呼び出し
等が必要だったのです。(コード量的にはたいしたことはないですが)


>yaさん

Application.AddMessageFilterに関しては調べてみます。
ありがとうございます。

紅茶
会議室デビュー日: 2005/11/18
投稿数: 11
投稿日時: 2006-02-08 11:30
Application.AddMessageFilter使用して過去スレ通り下記のように実装することが
できました。

コード:
'フィルタを登録(アプリ内で最初に記述)
Application.AddMessageFilter(New TestFilter)

'フィルタ定義
Public Class TestFilter
    Implements IMessageFilter

    Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
        Const WM_MOUSEMOVE = &H200
        If m.Msg = WM_MOUSEMOVE Then
            ApplicationTimerReset()
        End If
    End Function
End Class



>じゃんぬねっとさん、yaさん
既知の質問にかかわらずご丁寧な対応に感謝です。
本当にありがとうございました。
1

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