HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0725
葡萄色マウスボタンの長押し判定6解決


葡萄色

リンク

2015/7/25(Sat) 23:42:55|NO.70236

こんばんは。
タイトル通り、マウスボタンが長押しされた際に、割り込み処理をしたいと思っています。
しかし、そのようなウィンドウメッセージは用意されていないため、自前で判定する必要があります。
そこで、ダブルクリックの速さをGetDoubleClickTime関数で取得し、マウスボタンが押された時と離された時の時間の差が、それを下回れば長押しされたと判定できるのでは?
と考え、以下のようなプログラムを組みました。

#uselib "user32" #cfunc GetDoubleClickTime "GetDoubleClickTime" #define WM_LBUTTONDOWN $201 #define WM_LBUTTONUP $202 dctime = GetDoubleClickTime() oncmd *ld, WM_LBUTTONDOWN oncmd *lu, WM_LBUTTONUP stop *ld ldtime = (gettime(6) * 1000) + gettime(7) mes ldtime stop *lu lutime = (gettime(6) * 1000) + gettime(7) if lutime - ldtime > dctime { mes "長押し" } else : mes "クリック" stop
結果から言うと、このプログラムは想定通りの動作をしませんでした。
oncmdでWM_LBUTTONDOWNとWM_LBUTTONUPの割り込みを一緒に設定するとWM_LBUTTONDOWNが無視されるようです。
しかし、もし仮に想定通りの動作をしたとしても、スマートなプログラムではないので、良い方法があれば教えてください。
よろしくお願いします。



この記事に返信する


totori

リンク

2015/7/26(Sun) 00:01:15|NO.70237

手元の環境だと動くけどなぁ。
ただ、クリック押下時が59秒で、離した時が0秒のケースだと動かなかったので、
timeGetTime()に差し替えました。


#uselib "user32" #cfunc GetDoubleClickTime "GetDoubleClickTime" #uselib "winmm" #cfunc timeGetTime "timeGetTime" #define WM_LBUTTONDOWN $201 #define WM_LBUTTONUP $202 dctime = GetDoubleClickTime() oncmd *ld, WM_LBUTTONDOWN oncmd *lu, WM_LBUTTONUP stop *ld ldtime = timeGetTime() mes ldtime stop *lu lutime = timeGetTime() if lutime - ldtime > dctime { mes "長押し" } else : mes "クリック" stop



掘木

リンク

2015/7/26(Sun) 00:02:26|NO.70238

こちらの環境では、割り込み方式をgotoからgosubに変えて作り変えるとそれっぽく動きましたよ。



葡萄色

リンク

2015/7/26(Sun) 09:00:39|NO.70239

>クリック押下時が59秒で、離した時が0秒のケースだと動かなかった
確かに。完全に頭回ってなかった。。。

>gotoからgosubに変えて作り変えるとそれっぽく動きました
試してみたところ、こちらでも動きました。
どういう違いがあるんでしょうね。

しかし、やはり時間測ってダブルクリックの時間と比較するやり方しか無いのでしょうか。。。



窓月らら

リンク

2015/7/26(Sun) 10:33:48|NO.70240

GetDoubleClickTime() はいらないと思うの。

#uselib "winmm" #cfunc timeGetTime "timeGetTime" #define WM_LBUTTONDOWN $201 #define WM_LBUTTONUP $202 oncmd gosub *ld, WM_LBUTTONDOWN oncmd gosub *lu, WM_LBUTTONUP stop *ld ldtime = timeGetTime() mes ldtime return *lu lutime = timeGetTime() i=lutime-ldtime // 0.5秒以上の間隔があれば長押し if i>500 { mes "長押し "+i } else { mes "クリック "+i } return



葡萄色

リンク

2015/7/26(Sun) 11:39:05|NO.70241

>>窓月ららさん
それだと、仮にダブルクリックの速度が500ms以上に設定されていて、なおかつダブルクリックの割り込みも設定している場合、500ms以上の長押しの後もう一度クリックした時、ダブルクリックと判定されませんか。



葡萄色

リンク

2015/7/27(Mon) 01:29:25|NO.70253

完全の余地は無さそうですね。
回答して下さったお三方、ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.