小ワザ/HSPのループ構造の中で単クリックと重クリックを取得する
最終更新日 : 2010-08-23 (月) 01:51:39
Win32APIを使わずともシングルクリックとダブルクリックを判別して取得する事は可能である。
ただし、この方法はループ構造中でないと使えない難点がある。
実装用モジュール †
適当に作成 by 木村
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
-
|
|
-
|
-
|
|
!
|
|
!
|
!
| #module md_click_checker
#define CHECK_TIME 100
#define COPY_SIZE (CHECK_TIME-1)*4
#define NOW 0
#define NO_CLICK 0
#define DRAGGING 1
#define DELAY_CHECK 2
#define SINGLE_CLICK 4
#define DOUBLE_CLICK 8
#define ctype KEY_DATE(%1) click_record(%1,key_code)
#deffunc init_click_checker
dim click_record, CHECK_TIME, 500
return
#deffunc click_checker int key_code, int delay_time, \
local stock, local br, local ret_stat, local clicked
dim stock, CHECK_TIME-1
memcpy stock, KEY_DATE(0), COPY_SIZE, 0, 0
memcpy KEY_DATE(1), stock, COPY_SIZE, 0, 0
getkey br, 1
KEY_DATE(NOW) = br
if KEY_DATE(NOW) = 1 : return DRAGGING
repeat delay_time
if KEY_DATE(cnt) = 1 : ret_stat = DELAY_CHECK : break
loop
if ret_stat = DELAY_CHECK : return DELAY_CHECK
ret_stat = NO_CLICK
if KEY_DATE(delay_time) = 1 {
ret_stat = SINGLE_CLICK
repeat CHECK_TIME-delay_time, delay_time
if KEY_DATE(cnt) = 0 {
repeat delay_time, cnt
if (KEY_DATE(cnt)=0) & (KEY_DATE(cnt+1)=1) {
ret_stat = DOUBLE_CLICK
break
}
loop
break
}
loop
}
return ret_stat
#global
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
-
|
|
-
|
-
|
|
!
|
|
!
|
!
| #module md_click_checker
#define CHECK_TIME 100
#define COPY_SIZE (CHECK_TIME-1)*4
#define NOW 0
#define NO_CLICK 0
#define DRAGGING 1
#define DELAY_CHECK 2
#define SINGLE_CLICK 4
#define DOUBLE_CLICK 8
#define ctype KEY_DATE(%1) click_record(%1,key_code)
#deffunc init_click_checker
dim click_record, CHECK_TIME, 500
return
#deffunc click_checker int key_code, int delay_time, \
local stock, local br, local ret_stat, local clicked
dim stock, CHECK_TIME-1
memcpy stock, KEY_DATE(0), COPY_SIZE, 0, 0
memcpy KEY_DATE(1), stock, COPY_SIZE, 0, 0
getkey br, key_code
KEY_DATE(NOW) = br
if KEY_DATE(NOW) = 1 : return DRAGGING
repeat delay_time
if KEY_DATE(cnt) = 1 : ret_stat = DELAY_CHECK : break
loop
if ret_stat = DELAY_CHECK : return DELAY_CHECK
ret_stat = NO_CLICK
if KEY_DATE(delay_time) = 1 {
ret_stat = SINGLE_CLICK
repeat CHECK_TIME-delay_time, delay_time
if KEY_DATE(cnt) = 0 {
repeat delay_time, cnt
if (KEY_DATE(cnt)=0) & (KEY_DATE(cnt+1)=1) {
ret_stat = DOUBLE_CLICK
break
}
loop
break
}
loop
}
return ret_stat
#global
init_click_checker
repeat
click_checker 1, 6
switch stat
case 4 : mes "シングルクリック" : swbreak
case 8 : mes "ダブルクリック" : swbreak
swend
wait 2
loop
|
click_checker命令は毎ループ毎にキーの入力状態を確認し、そのデータからクリック状態を判別する命令である。
第1引数には状態を確認したいキーコードを入力する。
キーコードはgetkey命令で用いられる値を参照する事。
今回は左クリックの判断をしたかったので1としたが、右クリックを求める為に2を入れたり、キーボードのキーコードを入れる事も可能である。
第2引数は短クリックか重クリックかを判別する為の猶予フレーム数を入力する。
今回の6であれば、6フレームの間は入力を待ち、6フレームの間入力が無かった場合にようやくクリック状態を返す、と言う意味となる。
フレーム数が大きければ、ゆっくりとした重クリックにも対応できる。
しかし、大き過ぎると早めの単クリック2回が重クリックに誤読される可能性もあるので、ループのwaitやユーザーの事を加味して値を決める必要がある。
クリックの状態はシステム変数statに返される。
4が単クリック、8が重クリックであるが、それ以外にも1はドラッグ中、2は猶予フレーム中である事を意味している。