特定のウィンドウのイベントを無効にするには

解決


タロー  2008-02-19 19:17:44  No: 144456  IP: 192.*.*.*

VB2005で開発を行っています。

ボタンをクリックして更新や、印刷の処理を実行する場合に、フォームとその子コントロールのイベントを無効にする方法はないでしょうか?

フォームの Enabled を False にするとコントロールの表示がグレーになるのを避けたいのですが...
また、印刷プレビューなどでモードレスの別ウィンドウを表示するので表示されている間は操作させたくないのです。(別ウィンドウは VB 以外で作成された DLL で作成されるのでモーダルで開けないのです...)

Application.AddMessageFilter なども試したのですが対象フォーム以外のイベントも無効になってしまうのでダメでした。

よろしくお願いします。

編集 削除
やじゅ  2008-02-19 19:55:54  No: 144457  IP: 192.*.*.*

WndProcメソッドのオーバーライドして、クリック等の処理を
処理の間は無効にすればいいかもね。

WndProcメソッドのオーバーライドの例
http://jeanne.wankuma.com/tips/form/moveable.html

編集 削除
タロー  2008-02-20 09:24:36  No: 144458  IP: 192.*.*.*

ありがとうございます。

WndProc も試したのですが、子コントロールのイベントはコントロール側でオーバーライドしないといけないですよね?
コントロールの数が多い場合を考えるとフォーム出の対応で制御できないかと思ったのですが...

そんな便利な方法はないのでしょうか?

編集 削除
やじゅ  2008-02-20 11:19:37  No: 144459  IP: 192.*.*.*

>WndProc も試したのですが、子コントロールのイベントはコントロール側で>オーバーライドしないといけないですよね?

そうなんですかね?
親がメッセージを受け取ってから子にメッセージを送るから
親側で制御可能かと思っているのですが・・・

編集 削除
タロー  2008-02-20 11:50:11  No: 144460  IP: 192.*.*.*

もう一度以下のコードで確認してみました。

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Const WM_KEYDOWN As Integer = &H100
    Const WM_LBUTTONDOWN As Integer = &H201
    Const WM_LBUTTONDBLCLK As Integer = &H203
    Const WM_RBUTTONDOWN As Integer = &H204
    Const WM_RBUTTONDBLCLK As Integer = &H206

    Select Case m.Msg
        Case WM_KEYDOWN, WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN, WM_RBUTTONDBLCLK
            Return
    End Select

    MyBase.WndProc(m)
End Sub

フォームの Click イベントは発生しなくなりますがコントロールの Click イベントは発生します。KeyDown イベントについても同様でした。

編集 削除
YuO  2008-02-20 12:29:00  No: 144461  IP: 192.*.*.*

Windows Messageは対象のウィンドウプロシージャが直接処理します。
そのため,フォームのウィンドウプロシージャでどうこうしようと,ボタンの処理に影響を与えることはありません。

手っ取り早いのはボタンをカスタムコントロールにしてしまうことでしょう。

編集 削除
YuO  2008-02-20 12:30:16  No: 144462  IP: 192.*.*.*

誤) Windows Message
正) Window Message

編集 削除
タロー  2008-03-17 15:58:49  No: 144463  IP: 192.*.*.*

SetWindowLong API で GWL_STYLE に WS_DISABLED を指定するとこで対応できました。

編集 削除