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

右上ボタン(閉じる等)長押しするとタイマーが停止する。

環境/言語:[Windows7 VB.net and VB6]
分類:[.NET]

いつもお世話になっております。

フォームにタイマーを置いて、数字を加算するプログラムを作成してみました。

このソフトの右上にある、閉じるボタンや最大化ボタンを長押しするとタイマーが加算せず、停止してしまいます。(.net、6でも)
ボタンを有効にしたままで、解決方法はありますでしょうか?

宜しくお願いします。
■No30858に返信(みそしるさんの記事)
> フォームにタイマーを置いて、数字を加算するプログラムを作成してみました。
> このソフトの右上にある、閉じるボタンや最大化ボタンを長押しするとタイマーが加算せず、停止してしまいます。(.net、6でも)
> ボタンを有効にしたままで、解決方法はありますでしょうか?

(案1) 長押し操作をしないでください、長押しされた場合の動作は
 保証しておりません―――という画面仕様にする。

(案2)「タイマーを開始した時刻」からの『経過時間』を調べることで、
 数字をいくつ加算するかを決定させる。(画面上は停止して見えるが、
 マウスを離した時に、更新されていなかったカウント分が一気に進む)

(案3) UI スレッドの Timer は使わず、ワーカースレッドで制御する。
 (ただし、画面に結果が反映されるのはマウス操作後になる可能性が高い)

(案4) タイトルバーを自作し、マウス押下時にすぐに ReleaseCaptuer する。
魔界の仮面弁士さん お返事ありがとうございました。解決できそうです。



閉じるボタンや最大化ボタンを長押した場合に、長押しをキャンセルする方法はありますでしょうか?
■No30860に返信(みそしるさんの記事)
> 閉じるボタンや最大化ボタンを長押した場合に、長押しをキャンセルする方法はありますでしょうか?

どうでしょうね、まっとうな方法は思いつかないです。
MouseUp 時ではなく MouseDown 時に反応させるぐらいならできそうですが…。


Public Class Form1
    'Private Declare Function ReleaseCapture Lib "user32" () As Boolean
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Text = CStr(Microsoft.VisualBasic.Timer)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Const WM_NCLBUTTONDOWN As Integer = &HA1
        Const HTCLOSE As Integer = &H14
        Const HTMINBUTTON As Integer = &H8

        If m.Msg = WM_NCLBUTTONDOWN Then
            If m.WParam = New IntPtr(HTCLOSE) Then
                Me.Close()
            ElseIf m.WParam = New IntPtr(HTMINBUTTON) Then
                Me.WindowState = FormWindowState.Minimized
            ElseIf …
                    …
            Else
                MyBase.WndProc(m)
            End If
        Else
            MyBase.WndProc(m)
        End If
    End Sub

End Class
魔界の仮面弁士様 ありがとうございました。

お教えいただいた内容を踏まえ、わかりましたらこちらに記述します。

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