それにも関わらず、処理中に、無効化したボタンを連打すると、処理が終わった後に、
連打した分がまた実行されてしまいます。
時間が掛かる処理は、Sleep関数で代用しています。
wait,awaitだと再現できません。
#uselib "kernel32.dll" #func Sleep "Sleep" sptr button gosub "連打する",*a id_button = stat stop *a logmes "start" objenable id_button,0 wait 1 // 無効化待ち Sleep 2000 // なにかしらの処理時間 objenable id_button,1 logmes "end \n" return
これの対策として、前回の処理からの経過時間が一定以下ならスキップするというのを思いついたのですが、
その「一定以下」が環境(処理性能)によって変わってしまうので、完璧ではないような気がします。
#uselib "kernel32.dll" #func Sleep "Sleep" sptr #uselib "winmm.dll" #func timeGetTime "timeGetTime" button gosub "連打する",*a id_button = stat stop *a // 前回の処理から10ms以下しか経っていない場合return if (timeGetTime()-last_time)<=10 { logmes "return" last_time = timeGetTime() return } logmes "start" objenable id_button,0 wait 1 Sleep 2000 objenable id_button,1 logmes "end \n" last_time = timeGetTime() return
なので、今度は下記ページを参考にして、
http://zecl.hatenablog.com/entry/20081101/p1#f1
C#が分からないながら勘でそれっぽいものを作ってみたのですが、うまく動きません。
Buttonを作る、とあるのでやり方が違うのかもしれませんが、よく分かりませんでした。
#uselib "kernel32.dll" #func Sleep "Sleep" sptr #uselib "user32.dll" #func PeekMessage "PeekMessageA" sptr,sptr,sptr,sptr,sptr #func DispatchMessage "DispatchMessageA" sptr button gosub "連打する",*a id_button = stat stop *a logmes "start" objenable id_button,0 wait 1 // 無効化待ち Sleep 500 // なにかしらの処理時間 objenable id_button,1 // 保留されているメッセージを削除する dim MSG,7 PeekMessage varptr(MSG), 0, 0, 0, 0x0001;PM_REMOVE logmes strf("メッセージ: %#x", MSG.1) switch MSG.1 case 0x202; WM_LBUTTONUP case 0x2A3; WM_MOUSELEAVE case 0xF; WM_PAINT DispatchMessage varptr(MSG) swbreak swend logmes "end \n" return
なにか良いやり方はないでしょうか?
ご教示お願いします。