目次
- 1 ホットキーの設定/解除
- 2 ホットキーの呼び出しと文字入力を同時に行う方法
- 3 修飾子キー単独で検知
- 4 修飾子キーの左右判定
- 5 仮想キー一覧
- 6 プログラム実行例
- 6.1 画像をクリップボードにコピーする
- 6.2 アイドル時間を取得
- 6.3 マウスカーソル下のウィンドウの情報を吹き出しに表示
- 6.4 特定のキーを連打する
- 6.5 現在のカーソル位置を吹き出しに表示
- 6.6 プログラム実行時からの経過時間を表示(ESCで終了)
- 6.7 メールの受信を検知(Outlook)
- 6.8 マウスカーソル下のスクロールバー情報を取得
- 6.9 Yahoo!ファイナンスから米ドル・ユーロ・豪ドルのレートを取得
- 6.10 ファイルを開いているプロセスを調べる
- 6.11 キーボードからの入力を1文字ずつずらす
- 6.12 マウス位置の色を取得
- 6.13 キャレット(カーソル)位置を取得
- 6.14 CLKITEMで操作できる項目を取得
- 7 参考文献
ホットキーを設定します。設定したホットキーを入力することによりプロシージャを呼び出すことができます。
「VK」は「Virtual Key」の略で仮想キー、「MOD」は「MODifier key」の略で修飾子キーを意味します。
修飾子キーを複数指定する場合はORで繋げます。
HOTKEY_VKはキーコード(数値)なので、文字に変換する場合は「CHR(HOTKEY_VK)」と記述します。
HOTKEY_MODから指定したキーが押されたかを判断するには 、「HOTKEY_MOD AND 修飾子キー」が0か0以外かで判断できます。「HOTKEY_MOD AND MOD_CONTROL」が0でなければCtrlが押されたということになります。
- 構文
- Boolean = SETHOTKEY( キーコード, 修飾子キー, Procedure名 )
- 引数
- キーコード (#sethotkey)必須
- 使用するキーコード
- 修飾子キー (#sethotkey)省略可
- (省略可、複数指定化)
MOD_ALT(Alt)
MOD_CONTROL(Ctrl)
MOD_SHIFT(Shift)
MOD_WIN(Win) - Procedure名 (String)省略可
- UWSC側の呼び出される Procedure名、省略された場合にはホットキーの解除
- 戻り値
- TRUE
- 成功
- FALSE
- 失敗
Procedure内にて変数 HOTKEY_VKにキーコード、HOTKEY_MODに修飾子キーが格納されている。
ホットキーの設定/解除
// ESCキーでforceQuit関数を呼び出す
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
// ESCキーで呼び出せるようにしたforceQuit関数を解除
SETHOTKEY(VK_ESC, EMPTYPARAM)
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
すべてのホットキーを解除
SETHOTKEY関数は第三引数を省略するとホットキーの解除ができます。keyは1から255の範囲と901、modiferはMOD_ALT、MOD_CONTROL、MOD_SHIFT、MOD_WINの1,2,4,8と2のべき乗なのでPOWER関数を使いすべてのキーの組み合わせを多重ループで回し解除します。
FOR key = 1 TO 255
FOR modifier = 0 TO 3
SETHOTKEY(key, POWER(2, modifier))
NEXT
NEXT
key = 901
FOR modifier = 0 TO 3
SETHOTKEY(key, POWER(2, modifier))
NEXT
ホットキーの呼び出しと文字入力を同時に行う方法
ホットキーでプロシージャを呼び出された際、その文字は入力されなくなります。プロシージャの呼び出した際にその文字も入力したい場合、呼び出したプロシージャ内に「KBD(HOTKEY_VK)」と記述することで文字入力ができるようになります。
以下はA〜Zにホットキーを設定し、keyInput関数を呼び出すプログラム。例えばキーボードでAと打つとプロシージャが呼び出されるがAが文字として入力はされませんが、KBD関数を使うことでプロシージャを呼び出しつつ文字も入力できるようにします。
以下のプログラムをKBD関数ありとなしで実行しメモ帳で文字入力をしてみると違いがわかると思います。
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
FOR key = VK_A TO VK_Z
SETHOTKEY(key, EMPTYPARAM, "keyInput")
NEXT
WHILE TRUE
SLEEP(0.001)
WEND
PROCEDURE keyInput()
KBD(HOTKEY_VK)
FEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
修飾子キー単独で検知
SETHOTKEY関数の第一引数にEMPTYPARAMを指定することで、修飾子キーのみでホットキーを設定することができます。
呼び出されたプロシージャ内の特殊変数HOTKEY_MODに修飾子キーが格納されているので、検知されたキーの判定に使うことができます。
SETHOTKEY(EMPTYPARAM, MOD_ALT, "keyInput") // 1
SETHOTKEY(EMPTYPARAM, MOD_CONTROL, "keyInput") // 2
SETHOTKEY(EMPTYPARAM, MOD_SHIFT, "keyInput") // 4
SETHOTKEY(EMPTYPARAM, MOD_WIN, "keyInput") // 8
WHILE TRUE
SLEEP(0.001)
WEND
PROCEDURE keyInput()
PRINT HOTKEY_MOD
FEND
修飾子キーの左右判定
SETHOTKEY関数の修飾子キー(MOD_*)では左右を区別することはできないので、呼び出された関数の中でGETKEYSTATE関数を使い左右の判定をします。
左Alt・右Alt が押されたとき。
SETHOTKEY(EMPTYPARAM, MOD_ALT, "Alt")
WHILE TRUE
SLEEP(0.001)
WEND
PROCEDURE Alt()
SELECT TRUE
CASE GETKEYSTATE(VK_LALT)
PRINT "左Alt"
CASE GETKEYSTATE(VK_RALT)
PRINT "右Alt"
SELEND
FEND
左Ctrl・右Ctrlが押されたとき。
SETHOTKEY(EMPTYPARAM, MOD_CONTROL, "Ctrl")
WHILE TRUE
SLEEP(0.001)
WEND
PROCEDURE Ctrl()
SELECT TRUE
CASE GETKEYSTATE(VK_LCTRL)
PRINT "左Ctrl"
CASE GETKEYSTATE(VK_RCTRL)
PRINT "右Ctrl"
SELEND
FEND
左Shift・右Shiftが押されたとき。
SETHOTKEY(EMPTYPARAM, MOD_SHIFT, "Shift")
WHILE TRUE
SLEEP(0.001)
WEND
PROCEDURE Shift()
SELECT TRUE
CASE GETKEYSTATE(VK_LSHIFT)
PRINT "左Shift"
CASE GETKEYSTATE(VK_RSHIFT)
PRINT "右Shift"
SELEND
FEND
仮想キー一覧
値 | 定数名 | 説明 | キー | Shift |
---|---|---|---|---|
1 | VK_LBUTTON | マウスの左ボタン | ||
2 | VK_RBUTTON | マウスの右ボタン | ||
3 | VK_CANCEL | コントロール・ブレイク処理(定義なし) | ||
4 | VK_MBUTTON | マウスの中央ボタン(3ボタンマウス) | ||
5 | VK_XBUTTON1 | マウスの第1拡張ボタン(定義なし) | ||
6 | VK_XBUTTON2 | マウスの第2拡張ボタン(定義なし) | ||
7 | ||||
8 | VK_BACK | Backspaceキー | Backspace | |
9 | VK_TAB | Tabキー | Tab | |
10 | 予約済 | |||
11 | 予約済 | |||
12 | VK_CLEAR | Clearキー | Clear | |
13 | VK_RETURN | Enterキー | Enter | |
13 | VK_ENTER | Enterキー | Enter | |
14 | 予約済 | |||
15 | 予約済 | |||
16 | VK_SHIFT | Shiftキー | Shift | |
17 | VK_CTRL | Ctrlキー | Ctrl | |
17 | VK_CONTROL | Ctrlキー | Ctrl | |
18 | VK_ALT | Altキー | Alt | |
18 | VK_MENU | Altキー | Alt | |
19 | VK_PAUSE | Pauseキー | Pause | |
20 | VK_CAPITAL | CapsLockキー | CapsLock | |
21 | VK_KANA | IME かなモード | ||
22 | 未定義 | |||
23 | VK_JUNJA | IME Junjaモード | ||
24 | VK_FINAL | IME ファイナルモード | ||
25 | VK_KANJI | IME 漢字モード | ||
26 | 未定義 | |||
27 | VK_ESC | Escキー | Esc | |
27 | VK_ESCAPE | Escキー | Esc | |
28 | VK_CONVERT | IME 変換 | 変換 | |
29 | VK_NONCONVERT | IME 無変換 | 無変換 | |
30 | VK_ACCEPT | IME 使用可能 | ||
31 | VK_MODECHANGE | IME モード変換要求 | ||
32 | VK_SPACE | スペースキー | Space | |
33 | VK_PRIOR | PageUpキー | PageUp | |
34 | VK_NEXT | PageDownキー | PageDown | |
35 | VK_END | Endキー | End | |
36 | VK_HOME | Homeキー | Home | |
37 | VK_LEFT | ←キー | ← | |
38 | VK_UP | ↑キー | ↑ | |
39 | VK_RIGHT | →キー | → | |
40 | VK_DOWN | ↓キー | ↓ | |
41 | VK_SELECT | Selectキー | ||
42 | VK_PRINT | Printキー | ||
43 | VK_EXECUTE | Executeキー | ||
44 | VK_SNAPSHOT | PrintScreenキー | PrintScree | |
45 | VK_INSERT | Insertキー | Insert | |
46 | VK_DELETE | Deleteキー | Delete | |
47 | VK_HELP | Helpキー | ||
48 | VK_0 | 0キー | 0 | |
49 | VK_1 | 1キー | 1 | ! |
50 | VK_2 | 2キー | 2 | " |
51 | VK_3 | 3キー | 3 | # |
52 | VK_4 | 4キー | 4 | $ |
53 | VK_5 | 5キー | 5 | % |
54 | VK_6 | 6キー | 6 | & |
55 | VK_7 | 7キー | 7 | ' |
56 | VK_8 | 8キー | 8 | ( |
57 | VK_9 | 9キー | 9 | ) |
58 | 未定義 | |||
59 | 未定義 | |||
60 | 未定義 | |||
61 | 未定義 | |||
62 | 未定義 | |||
63 | 未定義 | |||
64 | 未定義 | |||
65 | VK_A | Aキー | a | A |
66 | VK_B | Bキー | b | B |
67 | VK_C | Cキー | c | C |
68 | VK_D | Dキー | d | D |
69 | VK_E | Eキー | e | E |
70 | VK_F | Fキー | f | F |
71 | VK_G | Gキー | g | G |
72 | VK_H | Hキー | h | H |
73 | VK_I | Iキー | i | I |
74 | VK_J | Jキー | j | J |
75 | VK_K | Kキー | k | K |
76 | VK_L | Lキー | l | L |
77 | VK_M | Mキー | m | M |
78 | VK_N | Nキー | n | N |
79 | VK_O | Oキー | o | O |
80 | VK_P | Pキー | p | P |
81 | VK_Q | Qキー | q | Q |
82 | VK_R | Rキー | r | R |
83 | VK_S | Sキー | s | S |
84 | VK_T | Tキー | t | T |
85 | VK_U | Uキー | u | U |
86 | VK_V | Vキー | v | V |
87 | VK_W | Wキー | w | W |
88 | VK_X | Xキー | x | X |
89 | VK_Y | Yキー | y | Y |
90 | VK_Z | Zキー | z | Z |
91 | VK_WIN | Windowsキー | 左 | |
92 | VK_START | Windowsキー | 左 | |
92 | VK_RWIN | 右Windowsキー | 右 | |
93 | VK_APPS | アプリケーションキー | ||
94 | 予約済 | |||
95 | VK_SLEEP | コンピュータスリープキー | ||
96 | VK_NUMPAD0 | テンキーの0キー | テンキーの0 | Insert |
97 | VK_NUMPAD1 | テンキーの1キー | テンキーの1 | End |
98 | VK_NUMPAD2 | テンキーの2キー | テンキーの2 | ↓ |
99 | VK_NUMPAD3 | テンキーの3キー | テンキーの3 | PageDown |
100 | VK_NUMPAD4 | テンキーの4キー | テンキーの4 | ← |
101 | VK_NUMPAD5 | テンキーの5キー | テンキーの5 | |
102 | VK_NUMPAD6 | テンキーの6キー | テンキーの6 | → |
103 | VK_NUMPAD7 | テンキーの7キー | テンキーの7 | Home |
104 | VK_NUMPAD8 | テンキーの8キー | テンキーの8 | ↑ |
105 | VK_NUMPAD9 | テンキーの9キー | テンキーの9 | PageUp |
106 | VK_MULTIPLY | テンキーの*キー | テンキーの* | |
107 | VK_ADD | テンキーの+キー | テンキーの+ | |
108 | VK_SEPARATOR | 区切り記号キー | ||
109 | VK_SUBTRACT | 減算記号キー | テンキーの- | |
110 | VK_DECIMAL | 小数点キー | テンキーの. | Delete |
111 | VK_DIVIDE | 除算記号キー | テンキーの/ | |
112 | VK_F1 | F1キー | F1 | |
113 | VK_F2 | F2キー | F2 | |
114 | VK_F3 | F3キー | F3 | |
115 | VK_F4 | F4キー | F4 | |
116 | VK_F5 | F5キー | F5 | |
117 | VK_F6 | F6キー | F6 | |
118 | VK_F7 | F7キー | F7 | |
119 | VK_F8 | F8キー | F8 | |
120 | VK_F9 | F9キー | F9 | |
121 | VK_F10 | F10キー | F10 | |
122 | VK_F11 | F11キー | F11 | |
123 | VK_F12 | F12キー | F12 | |
124 | VK_F13 | VK_F13 | F13 | |
125 | VK_F14 | VK_F14 | F14 | |
126 | VK_F15 | VK_F15 | F15 | |
127 | VK_F16 | VK_F16 | F16 | |
128 | VK_F17 | VK_F17 | F17 | |
129 | VK_F18 | VK_F18 | F18 | |
130 | VK_F19 | VK_F19 | F19 | |
131 | VK_F20 | VK_F20 | F20 | |
132 | VK_F21 | VK_F21 | F21 | |
133 | VK_F22 | VK_F22 | F22 | |
134 | VK_F23 | VK_F23 | F23 | |
135 | VK_F24 | VK_F24 | F24 | |
136 | VK_NAVIGATION_VIEW | 割当無し | ||
137 | VK_NAVIGATION_MENU | 割当無し | ||
138 | VK_NAVIGATION_UP | 割当無し | ||
139 | VK_NAVIGATION_DOWN | 割当無し | ||
140 | VK_NAVIGATION_LEFT | 割当無し | ||
141 | VK_NAVIGATION_RIGHT | 割当無し | ||
142 | VK_NAVIGATION_ACCEPT | 割当無し | ||
143 | VK_NAVIGATION_CANCEL | 割当無し | ||
144 | VK_NUMLOCK | NumLockキー | NumLock | |
145 | VK_SCROLL | ScrollLockキー | ScrollLock | |
146 | VK_OEM_NEC_EQUAL | |||
146 | VK_OEM_FJ_JISHO | |||
147 | VK_OEM_FJ_MASSHOU | |||
148 | VK_OEM_FJ_TOUROKU | |||
149 | VK_OEM_FJ_LOYA | |||
150 | VK_OEM_FJ_ROYA | |||
151 | 割当無し | |||
152 | 割当無し | |||
153 | 割当無し | |||
154 | 割当無し | |||
155 | 割当無し | |||
156 | 割当無し | |||
157 | 割当無し | |||
158 | 割当無し | |||
159 | 割当無し | |||
160 | VK_LSHIFT | 左Shiftキー | 左Shift | |
161 | VK_RSHIFT | 右Shiftキー | 右Shift | |
162 | VK_LCTRL | 左Ctrlキー | 左Ctrl | |
163 | VK_RCTRL | 右Ctrlキー | 右Ctrl | |
164 | VK_LALT | 左Altキー | 左Alt | |
164 | VK_LMENU | 左Altキー | 左Alt | |
165 | VK_RALT | 右Altキー | 右Alt | |
165 | VK_RMENU | 右Altキー | 右Alt | |
166 | VK_BROWSER_BACK | ブラウザーの戻るキー | ||
167 | VK_BROWSER_FORWARD | ブラウザーの進むキー | ||
168 | VK_BROWSER_REFRESH | ブラウザーの更新のキー | ||
169 | VK_BROWSER_STOP | ブラウザーの停止キー | ||
170 | VK_BROWSER_SEARCH | ブラウザーの検索キー | ||
171 | VK_BROWSER_FAVORITES | ブラウザーのお気に入りキー | ||
172 | VK_BROWSER_HOME | ブラウザーの開始およびホームキー | ||
173 | VK_VOLUME_MUTE | 音量ミュートキー | ||
174 | VK_VOLUME_DOWN | 音量ダウンキー | ||
175 | VK_VOLUME_UP | 音量アップキー | ||
176 | VK_MEDIA_NEXT_TRACK | 次のトラックキー | ||
177 | VK_MEDIA_PREV_TRACK | 前のトラックキー | ||
178 | VK_MEDIA_STOP | メディア停止キー | ||
179 | VK_MEDIA_PLAY_PAUSE | メディア再生/一時停止キー | ||
180 | VK_LAUNCH_MAIL | メール起動キー | ||
181 | VK_LAUNCH_MEDIA_SELECT | メディア選択キー | ||
182 | VK_LAUNCH_APP1 | アプリケーション1起動キー | ||
183 | VK_LAUNCH_APP2 | アプリケーション2起動キー | ||
184 | 予約済 | |||
185 | 予約済 | |||
186 | VK_OEM_1 | OEM1キー | : | * |
187 | VK_OEM_PLUS | +キー | ; | + |
188 | VK_OEM_COMMA | ,キー | , | < |
189 | VK_OEM_MINUS | -キー | - | = |
190 | VK_OEM_PERIOD | .キー | . | > |
191 | VK_OEM_2 | OEM2キー | / | ? |
192 | VK_OEM_3 | OEM3キー | @ | ` |
193 | VK_ABNT_C1 | 予約済 | ||
194 | VK_ABNT_C2 | 予約済 | ||
195 | VK_GAMEPAD_A | 予約済 | ||
196 | VK_GAMEPAD_B | 予約済 | ||
197 | VK_GAMEPAD_X | 予約済 | ||
198 | VK_GAMEPAD_Y | 予約済 | ||
199 | VK_GAMEPAD_RIGHT_SHOULDER | 予約済 | ||
200 | VK_GAMEPAD_LEFT_SHOULDER | 予約済 | ||
201 | VK_GAMEPAD_LEFT_TRIGGER | 予約済 | ||
202 | VK_GAMEPAD_RIGHT_TRIGGER | 予約済 | ||
203 | VK_GAMEPAD_DPAD_UP | 予約済 | ||
204 | VK_GAMEPAD_DPAD_DOWN | 予約済 | ||
205 | VK_GAMEPAD_DPAD_LEFT | 予約済 | ||
206 | VK_GAMEPAD_DPAD_RIGHT | 予約済 | ||
207 | VK_GAMEPAD_MENU | 予約済 | ||
208 | VK_GAMEPAD_VIEW | 予約済 | ||
209 | VK_GAMEPAD_LEFT_THUMBSTICK_BUTTO | 予約済 | ||
210 | VK_GAMEPAD_RIGHT_THUMBSTICK_BUTT | 予約済 | ||
211 | VK_GAMEPAD_LEFT_THUMBSTICK_UP | 予約済 | ||
212 | VK_GAMEPAD_LEFT_THUMBSTICK_DOWN | 予約済 | ||
213 | VK_GAMEPAD_LEFT_THUMBSTICK_RIGHT | 予約済 | ||
214 | VK_GAMEPAD_LEFT_THUMBSTICK_LEFT | 予約済 | ||
215 | VK_GAMEPAD_RIGHT_THUMBSTICK_UP | 予約済 | ||
216 | VK_GAMEPAD_RIGHT_THUMBSTICK_DOWN | 割当無し | ||
217 | VK_GAMEPAD_RIGHT_THUMBSTICK_RIGH | 割当無し | ||
218 | VK_GAMEPAD_RIGHT_THUMBSTICK_LEFT | 割当無し | ||
219 | VK_OEM_4 | OEM4キー | [ | { |
220 | VK_OEM_5 | OEM5キー | \ | | |
221 | VK_OEM_6 | OEM6キー | ] | } |
222 | VK_OEM_7 | OEM7キー | ||
223 | VK_OEM_8 | OEM8キー | ||
224 | 予約済 | |||
225 | VK_OEM_AX | OEM固有 | ||
226 | VK_OEM_102 | OEM102キー | \ | _ |
227 | VK_ICO_HELP | OEM固有 | ||
228 | VK_ICO_00 | |||
229 | VK_PROCESSKEY | IME PROCESSキー | ||
230 | VK_ICO_CLEAR | OEM固有 | ||
231 | VK_PACKET | キーボード以外の入力手段に使用される 32ビット仮想キー値の下位ワード | ||
232 | 割当無し | |||
233 | VK_OEM_RESET | OEM固有 | ||
234 | VK_OEM_JUMP | OEM固有 | ||
235 | VK_OEM_PA1 | OEM固有 | ||
236 | VK_OEM_PA2 | OEM固有 | ||
237 | VK_OEM_PA3 | OEM固有 | ||
238 | VK_OEM_WSCTRL | OEM固有 | ||
239 | VK_OEM_CUSEL | OEM固有 | ||
240 | VK_OEM_ATTN | OEM固有 | ||
241 | VK_OEM_FINISH | OEM固有 | ||
242 | VK_OEM_COPY | OEM固有 | ||
243 | VK_OEM_AUTO | OEM固有 | ||
244 | VK_OEM_ENLW | OEM固有 | ||
245 | VK_OEM_BACKTAB | OEM固有 | ||
246 | VK_ATTN | Attnキー | Attn | |
247 | VK_CRSEL | CrSelキー | CrSel | |
248 | VK_EXSEL | ExSelキー | ExSel | |
249 | VK_EREOF | Erase EOFキー | ||
250 | VK_PLAY | Playキー | ||
251 | VK_ZOOM | Zoomキー | ||
252 | VK_NONAME | 予約済 | ||
253 | VK_PA1 | PA1キー | ||
254 | VK_OEM_CLEAR | Clearキー | ||
901 | VK_RRETURN |
プログラム実行例
画像をクリップボードにコピーする
Alt+Sでマウスカーソル下のオブジェクトのスクリーンショット画像をクリップボードにコピーします。
SETHOTKEY(VK_S, MOD_ALT, "imageToClipboard")
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
WHILE TRUE
SLEEP(0.01)
WEND
PROCEDURE imageToClipboard()
SAVEIMG( , GETID(GET_FROMPOINT_WIN))
FEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
アイドル時間を取得
最後にキーボードまたはマウスを操作してから経過した時間をミリ秒で取得します。
DEF_DLL GetTickCount(): Dword: kernel32
DEF_DLL GetLastInputInfo({DWORD, DWORD}): BOOL: user32
DIM t
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
WHILE TRUE
GetLastInputInfo(8, t)
FUKIDASI((GetTickCount() - t) + "ms")
SLEEP(0.01)
WEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
マウスカーソル下のウィンドウの情報を吹き出しに表示
PUBLIC ttl, cls
SETHOTKEY(VK_ESC, , "forceQuit")
SETHOTKEY(VK_S, MOD_ALT, "output")
WHILE TRUE
ID = GETID(GET_FROMPOINT_WIN)
msg = ""
msg = msg + "ALT+Sでカーソル下のタイトルとクラス名を出力<#CR>"
msg = msg + "ESCで終了<#CR>"
msg = msg + "<#CR>"
ttl = STATUS(ID, ST_TITLE)
cls = STATUS(ID, ST_CLASS)
msg = msg + "タイトル:" + ttl + "<#CR>"
msg = msg + "クラス名:" + cls + "<#CR>"
msg = msg + "X座標:" + STATUS(ID, ST_X) + "<#CR>"
msg = msg + "Y座標:" + STATUS(ID, ST_Y) + "<#CR>"
msg = msg + "幅:" + STATUS(ID, ST_WIDTH) + "<#CR>"
msg = msg + "高さ:" + STATUS(ID, ST_HEIGHT) + "<#CR>"
msg = msg + "クライアントX座標:" + STATUS(ID, ST_CLX) + "<#CR>"
msg = msg + "クライアントY座標:" + STATUS(ID, ST_CLY) + "<#CR>"
msg = msg + "クライアント幅:" + STATUS(ID, ST_CLWIDTH) + "<#CR>"
msg = msg + "クライアント高さ:" + STATUS(ID, ST_CLHEIGHT) + "<#CR>"
msg = msg + "親ウィンドウID:" + STATUS(ID, ST_PARENT) + "<#CR>"
msg = msg + "アイコン状態:" + STATUS(ID, ST_ICON) + "<#CR>"
msg = msg + "最大化:" + STATUS(ID, ST_MAXIMIZED) + "<#CR>"
msg = msg + "表示状態:" + STATUS(ID, ST_VISIBLE) + "<#CR>"
msg = msg + "アクティブ状態:" + STATUS(ID, ST_ACTIVE) + "<#CR>"
msg = msg + "ビジー状態:" + STATUS(ID, ST_BUSY) + "<#CR>"
msg = msg + "有効ID:" + STATUS(ID, ST_ISID) + "<#CR>"
msg = msg + "64bit:" + STATUS(ID, ST_WIN64) + "<#CR>"
msg = msg + "EXEパス:" + STATUS(ID, ST_PATH) + "<#CR>"
msg = msg + "プロセスID:" + STATUS(ID, ST_PROCESS) + "<#CR>"
msg = msg + "モニター番号:" + STATUS(ID, ST_MONITOR) + "<#CR>"
FUKIDASI(msg)
SLEEP(0.01)
WEND
// 強制終了する
PROCEDURE forceQuit()
EXITEXIT
FEND
// カーソル下のウィンドウのタイトルとクラス名を出力
PROCEDURE output()
PRINT "GETID(<#DBL>" + ttl + "<#DBL>, <#DBL>" + cls + "<#DBL>)"
PRINT ttl
PRINT cls
PRINT "----------"
FEND
特定のキーを連打する
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
SETHOTKEY(VK_SPACE, EMPTYPARAM, "toggle")
PUBLIC flg = FALSE
WHILE TRUE
DIM msg = "Spaceキーで切り替え<#CR>ESCキーで終了<#CR>"
IFB flg THEN
FUKIDASI(msg + "連打中")
KBD(VK_A, CLICK)
SLEEP(0.100)
ELSE
FUKIDASI(msg + "停止中")
ENDIF
WEND
PROCEDURE forceQuit()
EXITEXIT
FEND
PROCEDURE toggle()
flg = !flg
SLEEP(0.500)
FEND
現在のカーソル位置を吹き出しに表示
DEF_DLL GetCursorPos({long, long}): bool: user32
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
DIM x, y
WHILE TRUE
GetCursorPos(x, y)
FUKIDASI(x + ", " + y)
SLEEP(0.001)
WEND
PROCEDURE forceQuit()
EXITEXIT
FEND
プログラム実行時からの経過時間を表示(ESCで終了)
SETHOTKEY(VK_ESC, , "forceQuit")
DIM t = GETTIME()
WHILE TRUE
FUKIDASI(GETTIME() - t)
SLEEP(0.001)
WEND
PROCEDURE forceQuit()
EXITEXIT
FEND
メールの受信を検知(Outlook)
メールを受信したら日時を出力する。日時はメールの受信日時ではなくOutlookが受信を検知した日時。
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
DIM Outlook = GETACTIVEOLEOBJ("Outlook.Application")
OLEEVENT(Outlook, "ApplicationEvents_11", "NewMailEx", "receivedMail")
WHILE TRUE
FUKIDASI("ESCで終了")
SLEEP(0.001)
WEND
PROCEDURE forceQuit()
EXITEXIT
FEND
PROCEDURE receivedMail()
PRINT text(now(), "yyyy/mm/dd hh:nn:ss")
FEND
//////////////////////////////////////////////////
// 【引数】
// interval : 加算する時間間隔を表す文字列式(yyyy:年、m:月、d:日、ww:週、h:時、n:分、s:秒)
// num : dateに加算する値。未来は正、過去は負で指定
// date : 時間間隔を加算する日付
// 【戻り値】
// 日時(date)に、指定した単位(interval)の時間(num)を加算して返します
//////////////////////////////////////////////////
FUNCTION dateAdd(interval, num, date)
DIM year, month, day, d
GETTIME(0, date)
DIM time = G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
SELECT interval
CASE "yyyy"
d = (G_TIME_YY + num) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
IF time <> "00:00:00" THEN d = d + " " + time
CASE "m"
IFB num > 0 THEN
year = G_TIME_YY + INT((G_TIME_MM + num) / 12)
month = REPLACE(FORMAT(((G_TIME_MM + num) MOD 12), 2), " ", "0")
ELSE
year = G_TIME_YY + CEIL((G_TIME_MM + num) / 12 - 1)
month = REPLACE(FORMAT(G_TIME_MM - (ABS(num) MOD 12), 2), " ", "0")
ENDIF
IF month = "00" THEN month = 12
day = G_TIME_DD2
d = "" + year + month + day
IFB !isDate(d) THEN
d = year + "/" + month + "/" + "01"
d = getEndOfMonth(d)
ELSE
d = year + "/" + month + "/" + day
ENDIF
IF time <> "00:00:00" THEN d = d + " " + time
CASE "d"
t = GETTIME(num, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "ww"
t = GETTIME(num * 7, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "h"
t = GETTIME(num / 24, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "n"
t = GETTIME(num / 1440, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "s"
t = GETTIME(num / 86400, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
SELEND
RESULT = d
FEND
//////////////////////////////////////////////////
// 【引数】
// interval : 時間単位(yyyy︰年、q:四半期、m︰月、d︰日、w:週日、ww:週、h:時、n:分、s:秒)
// date1 : 日時1
// date2 : 日時2
// 【戻り値】
// date2からdate1を引いた時間間隔を求めます。
//////////////////////////////////////////////////
FUNCTION dateDiff(interval, date1, date2)
DIM y1, y2, m1, m2, d1, d2, d
SELECT interval
CASE "yyyy"
GETTIME(0, date1)
y1 = G_TIME_YY
GETTIME(0, date2)
y2 = G_TIME_YY
d = y2 - y1
CASE "q"
GETTIME(0, date1)
y1 = G_TIME_YY
m1 = G_TIME_MM
GETTIME(0, date2)
y2 = G_TIME_YY
m2 = G_TIME_MM
d = y2 * 4 + CEIL(m2/3) - (y1 * 4 + CEIL(m1/3))
CASE "m"
GETTIME(0, date1)
y1 = G_TIME_YY
m1 = G_TIME_MM
GETTIME(0, date2)
y2 = G_TIME_YY
m2 = G_TIME_MM
d = (y2 - y1) * 12 + m2 - m1
CASE "d"
d1 = GETTIME(0, date1)
d2 = GETTIME(0, date2)
d = (d2 - d1) / 86400
CASE "w"
d = INT(dateDiff("d", date1, date2) / 7)
CASE "ww"
date1 = dateAdd("d", -1 * getWeekday(date1), date1)
d = INT(dateDiff("d", date1, date2) / 7)
CASE "h"
d = dateDiff("d", date1, date2) * 24
CASE "n"
d = dateDiff("d", date1, date2) * 1440
CASE "s"
d = dateDiff("d", date1, date2) * 86400
SELEND
RESULT = d
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 最大公約数を求める数値を格納した配列
// 【戻り値】
// 最大公約数
//////////////////////////////////////////////////
FUNCTION GCD(array[])
DIM c = LENGTH(array)
DIM rem = array[c-1] MOD array[c-2]
IFB rem = 0 THEN
IFB LENGTH(array) = 2 THEN
RESULT = array[c-2]
EXIT
ENDIF
RESIZE(array, c-2)
RESULT = GCD(array)
EXIT
ENDIF
array[c-1] = array[c-2]
array[c-2] = rem
RESULT = GCD(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)
// m : 第一引数の指定日からプラスマイナスm月とする
// 【戻り値】
// dateからm月後の月末の日付
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
date = dateAdd("m", m + 1, date)
GETTIME(0, date)
GETTIME(-G_TIME_DD, date)
RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
//////////////////////////////////////////////////
// 【引数】
// date : 日付文字列(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)もしくはシリアル値
// type : 取得する曜日番号の種類を示す0〜3または11〜17の値。1と17は日曜日を1、2と11は月曜日を1とカウントします。11以降はExcel2010で追加された値で、互換性を保つために重複した値があります。
// 【戻り値】
// typeで指定した種類によって以下の値を返します。 : (0 : 0(日曜)〜6(土曜)、1 : 1(日曜)~7(土曜)、2 : 1(月曜)~7(日曜)、3 : 0(月曜)〜6(日曜)、11 : 1(月曜)~7(日曜)、12 : 1(火曜)~7(月曜)、13 : 1(水曜)~7(火曜)、14 : 1(木曜)~7(水曜)、15 : 1(金曜)~7(木曜)、16 : 1(土曜)~7(金曜)、17 : 1(日曜)~7(土曜))
//////////////////////////////////////////////////
FUNCTION getWeekday(date, type = 1)
IF VARTYPE(date) <> 258 THEN date = text(date, "yyyy/mm/dd")
GETTIME(0, date)
DIM w = G_TIME_WW
SELECT TRUE
CASE type = 0
RESULT = w
CASE type = 1
RESULT = w + 1
CASE type = 2
RESULT = IIF(w=0, 7, w)
CASE type = 3
RESULT = (w+6) MOD 7
CASE type >= 11
RESULT = ((getWeekday(date, 2) + 17 - type) MOD 7) + 1
SELEND
FEND
//////////////////////////////////////////////////
// 【引数】
// serial : シリアル値もしくは時刻文字列
// 【戻り値】
// 時刻から時間を表す0〜23の範囲の値
//////////////////////////////////////////////////
FUNCTION Hour(serial)
IF VARTYPE(serial) = 258 THEN serial = timeValue(serial)
RESULT = INT(serial * 24) MOD 24
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻り値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// date : 存在するかを調べる日付文字列。YYYYMMDD or YYYY/MM/DD or YYYY-MM-DDのいずれかの形式。
// 【戻り値】
// TRUE : 日付として認識できる、FALSE : 日付として認識できない
//////////////////////////////////////////////////
FUNCTION isDate(date)
TRY
GETTIME(0, date)
RESULT = TRUE
EXCEPT
RESULT = FALSE
ENDTRY
FEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻り値】
// 正規表現で検索した結果をMatchesコレクションとして返します。
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Execute(str)
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻り値】
// 正規表現にマッチするかどうかを示すブール値
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Test(str)
FEND
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻り値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// serial : シリアル値
// format : フォーマット
// 【戻り値】
// 数値を表示書式に基づいて変換した文字列
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// 【引数】
// serial : シリアル値
// format : フォーマット
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION text(serial, format, hour12 = FALSE)
HASHTBL startDate
startDate["明治"] = "1868/01/25"
startDate["大正"] = "1912/07/30"
startDate["昭和"] = "1926/12/25"
startDate["平成"] = "1989/01/08"
startDate["令和"] = "2019/05/01"
DIM baseDate = "1899/12/30"
serial = VAL(serial)
SELECT TRUE
CASE reTest(format, "\[h+\]")
Matches = reExecute(format, "\[(h+)\]")
DIM hour = iif(hour12, Hour(serial) MOD 12, Hour(serial))
RESULT = text(hour, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE reTest(format, "^h+$")
Matches = reExecute(format, "^(h+)$")
hour = iif(hour12, Hour(serial) MOD 12, Hour(serial))
RESULT = text(hour MOD 24, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE reTest(format, "\[m+\]")
Matches = reExecute(format, "\[(m+)\]")
RESULT = text(serial * 1440, strRepeat("0", LENGTH(Matches.Item(0).SubMatches(0))))
CASE format = "m"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_MM, "0")
CASE format = "mm"
GETTIME(serial, baseDate)
RESULT = G_TIME_MM2
CASE format = "n"
GETTIME(serial, baseDate)
RESULT = G_TIME_NN
CASE format = "nn"
GETTIME(serial, baseDate)
RESULT = G_TIME_NN2
CASE format = "s"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_SS, "0")
CASE format = "ss"
GETTIME(serial, baseDate)
RESULT = G_TIME_SS2
CASE format = "yyyy"
GETTIME(serial, baseDate)
RESULT = G_TIME_YY4
CASE format = "yy"
GETTIME(serial, baseDate)
RESULT = COPY(G_TIME_YY4, 3, 2)
CASE format = "e"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 2018
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1988
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1925
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1911
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(serial, "yyyy") - 1867
SELEND
CASE format = "ee"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 2018, "00")
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1988, "00")
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1925, "00")
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1911, "00")
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0
RESULT = text(text(serial, "yyyy") - 1867, "00")
SELEND
CASE format = "g"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "R"
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "H"
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "S"
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "T"
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "M"
SELEND
CASE format = "gg"
RESULT = COPY(text(serial, "ggg"), 1, 1)
CASE format = "ggg"
SELECT TRUE
CASE dateDiff("d", startDate["令和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "令和"
CASE dateDiff("d", startDate["平成"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "平成"
CASE dateDiff("d", startDate["昭和"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "昭和"
CASE dateDiff("d", startDate["大正"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "大正"
CASE dateDiff("d", startDate["明治"], text(serial, "yyyy/mm/dd")) >= 0; RESULT = "明治"
SELEND
CASE format = "mmmmm"
RESULT = COPY(text(serial, "mmmm"), 1, 1)
CASE format = "mmmm"
DIM month[] = "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
RESULT = month[text(serial, "m") - 1]
CASE format = "mmm"
RESULT = COPY(text(serial, "mmmm"), 1, 3)
CASE format = "dd"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_DD2, "00")
CASE format = "d"
GETTIME(serial, baseDate)
RESULT = text(G_TIME_DD, "0")
CASE reTest(format, "^[ad]{3,4}$")
Matches = reExecute(format, "([ad]{3,4})")
GETTIME(serial, baseDate)
DIM aaa[] = "日", "月", "火", "水", "木", "金", "土"
DIM aaaa[] = "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"
DIM ddd[] = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
DIM dddd[] = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";
RESULT = EVAL(Matches.Item(0).SubMatches(0) + "[" + getWeekday(G_TIME_WW, 1) + "]")
CASE reTest(format, "(0+\.?0+)?%")
Matches = reExecute(format, "(0+\.?0+)?%")
RESULT = text(serial * 100, Matches.Item(0).SubMatches(0)) + "%"
CASE reTest(format, "^\[DBNum\d{1,4}\](.*?)$")
Matches = reExecute(format, "^\[DBNum(\d{1,4})\](.*?)$")
DIM value = VAL(Matches.Item(0).SubMatches(0))
DIM sss = text(serial, Matches.Item(0).SubMatches(1))
Matches = reExecute(sss, "(\D+)?(\d+)(\D+)?")
DIM res = ""
FOR m = 0 TO Matches.Count - 1
serial = Matches.Item(m).SubMatches(1)
SELECT value
CASE 1, 2
DIM n[][9] = "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九", + _
"", "壱", "弐", "参", "四", "伍", "六", "七", "八", "九"
DIM a[][3] = "", "十", "百", "千", + _
"", "拾", "百", "阡"
DIM b[][3] = "", "万", "億", "兆", + _
"", "萬", "億", "兆"
DIM r = ""
DIM j = 0
type = value - 1
REPEAT
DIM str = ""
DIM n4 = serial MOD 10000
FOR i = LENGTH(n4) TO 1 STEP -1
s = COPY(n4, i, 1)
IFB s = 1 AND a[type][LENGTH(n4)-i] <> "" THEN
str = IIF(s, a[type][LENGTH(n4)-i], "") + str
ELSE
str = n[type][s] + IIF(s, a[type][LENGTH(n4)-i], "") + str
ENDIF
NEXT
IF str <> "" THEN r = str + b[type][j] + r
j = j + 1
serial = INT(serial / 10000)
UNTIL serial = 0
res = res + Matches.Item(m).SubMatches(0) + r + Matches.Item(m).SubMatches(2)
CASE 3
res = res + Matches.Item(m).SubMatches(0) + STRCONV(serial, SC_FULLWIDTH) + Matches.Item(m).SubMatches(2)
CASE 4
res = res + Matches.Item(m).SubMatches(0) + STRCONV(serial, SC_HALFWIDTH) + Matches.Item(m).SubMatches(2)
SELEND
NEXT
RESULT = res
CASE reTest(format, "^(.*?)(AM\/PM|am\/pm|A\/P|a\/p)(.*?)$")
Matches = reExecute(format, "^(.*?)(AM\/PM|am\/pm|A\/P|a\/p)(.*?)$")
DIM array = SPLIT(Matches.Item(0).SubMatches(1), "/")
ampm = array[IIF(serial - INT(serial) >= 0.5, 1, 0)]
hour12 = TRUE
res = ""
WITH Matches.Item(0)
res = text(serial, .SubMatches(0), hour12) + ampm + text(serial, .SubMatches(2), hour12)
ENDWITH
RESULT = res
CASE reTest(format, "([^ymdagehns]{0,})?(([ymdagehns])\3{0,})([^ymdagehns]+)?")
Matches = reExecute(format, "([^ymdagehns]{0,})?(([ymdagehns])\3{0,})([^ymdagehns]+)?")
FOR n = 0 TO Matches.Count - 1
IF n = 0 THEN res = Matches.Item(n).SubMatches(0)
NEXT
FOR n = 0 TO Matches.Count - 1
WITH Matches.Item(n)
res = res + text(serial, .SubMatches(1), hour12) + .SubMatches(3)
ENDWITH
NEXT
RESULT = res
CASE format = "0/0"
DIM separator = POS(".", serial)
DIM g = 0
IFB separator <> 0 THEN
DIM keta = LENGTH(serial)
DIM shift = POWER(10, keta - separator)
IFB shift >= POWER(10, 15) THEN
DIM position = 0
FOR i = 0 TO 14
IFB serial * POWER(10, i) - serial >= 1 THEN
position = i
BREAK
ENDIF
NEXT
tmp = serial * POWER(10, position)
FOR i = 1 TO 15
r = (tmp * POWER(10, i)) / serial - (tmp / serial)
a1 = tmp * POWER(10, i) - tmp
IF a1 = INT(a1) THEN BREAK
NEXT
DIM frac[] = a1, r
g = GCD(frac)
RESULT = (a1/g) + "/" + (r/g)
ELSE
DIM molecule = serial * shift // 分子
DIM denominator = shift // 分母
DIM nums[] = molecule, denominator
g = GCD(nums)
molecule = molecule / g
denominator = denominator / g
RESULT = molecule + "/" + denominator
ENDIF
ELSE
RESULT = serial + "/1"
ENDIF
CASE reTest(format, "(0+)\.?(0+)?") AND UBound(SPLIT(format, ".")) <= 1
Matches = reExecute(format, "(0+)\.?(0+)?")
len1 = LENGTH(Matches.Item(0).SubMatches(0))
len2 = LENGTH(Matches.Item(0).SubMatches(1))
DIM arr[] = LENGTH(INT(serial)), len1
IFB POS(".", format) THEN
RESULT = REPLACE(FORMAT(serial, CALCARRAY(arr, CALC_MAX) + len2 + 1, len2), " ", "0")
ELSE
RESULT = REPLACE(FORMAT(serial, CALCARRAY(arr, CALC_MAX)), " ", "0")
ENDIF
SELEND
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 時刻文字列。hh:nn:ss AM/PM、hh:nn AM/PM、hh AM/PM、hh:nn:ss、hh:nn、hh時nn分ss秒、hh時nn分のいずれかの形式を指定。
// 【戻り値】
// シリアル値 (例)0…00:00:00、0.5…12:00:00、0.999988425925926…23:59:59
//////////////////////////////////////////////////
FUNCTION timeValue(str)
DIM serial = 0
DIM Matches
DIM pattern = "(\d+)"
DIM hh = "(0?[0-9]|1[0-2])"
DIM ampm = "([AP]M|[ap]m)"
SELECT TRUE
CASE reTest(str, "\b" + hh + ":" + pattern + ":" + pattern + " " + ampm + "\b")
Matches = reExecute(str, "\b" + hh + ":" + pattern + ":" + pattern + " " + ampm + "\b")
WITH Matches.Item(0)
serial = timeValue(.SubMatches(0) + " " + .SubMatches(3)) + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
ENDWITH
CASE reTest(str, "\b" + hh + ":" + pattern + " " + ampm + "\b")
Matches = reExecute(str, "\b" + hh + ":" + pattern + " " + ampm + "\b")
WITH Matches.Item(0)
serial = timeValue(.SubMatches(0) + " " + .SubMatches(2)) + VAL(.SubMatches(1)) / 1440
ENDWITH
CASE reTest(str, "\b" + hh + " " + ampm + "\b")
Matches = reExecute(str, "\b" + hh + " " + ampm + "\b")
WITH Matches.Item(0)
serial = VAL(.SubMatches(0) MOD 12) + IIF(reTest(.SubMatches(1), "AM|am"), 0, 12)
serial = serial / 24
ENDWITH
CASE reTest(str, "\b" + pattern + ":" + pattern + ":" + pattern + "\b")
Matches = reExecute(str, "\b" + pattern + ":" + pattern + ":" + pattern + "\b")
WITH Matches.Item(0)
serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
ENDWITH
CASE reTest(str, "\b" + pattern + ":" + pattern + "\b")
Matches = reExecute(str, "\b" + pattern + ":" + pattern + "\b")
WITH Matches.Item(0)
serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440
ENDWITH
CASE reTest(str, "\b" + pattern + "時" + pattern + "分" + pattern + "秒")
Matches = reExecute(str, "\b" + pattern + "時" + pattern + "分" + pattern + "秒")
WITH Matches.Item(0)
serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440 + VAL(.SubMatches(2)) / 86400
ENDWITH
CASE reTest(str, "\b" + pattern + "時" + pattern + "分")
Matches = reExecute(str, "\b" + pattern + "時" + pattern + "分")
WITH Matches.Item(0)
serial = VAL(.SubMatches(0)) / 24 + VAL(.SubMatches(1)) / 1440
ENDWITH
DEFAULT
serial = ERR_VALUE
SELEND
RESULT = serial - INT(serial)
FEND
//////////////////////////////////////////////////
// 【引数】
// arrayname : 上限値を求める配列の名前
// dimension : 返す次元を示す整数
// 【戻り値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
マウスカーソル下のスクロールバー情報を取得
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
WHILE TRUE
DIM ID = GETID(GET_FROMPOINT_WIN)
DIM str = ""
DIM i = 1
WHILE GETSLIDER(ID, i, SLD_POS) <> ERR_VALUE
str = str + "[" + i + "]<#CR>"
str = str + "値:" + GETSLIDER(ID, i, SLD_POS) + "<#CR>"
str = str + "最小値:" + GETSLIDER(ID, i, SLD_MIN) + "<#TAB>"
str = str + "最大値:" + GETSLIDER(ID, i, SLD_MAX) + "<#CR>"
str = str + "移動量:" + GETSLIDER(ID, i, SLD_PAGE) + "<#TAB>"
str = str + "表示方向:" + GETSLIDER(ID, i, SLD_BAR) + "<#CR>"
str = str + "X座標:" + GETSLIDER(ID, i, SLD_X) + "<#TAB>"
str = str + "Y座標:" + GETSLIDER(ID, i, SLD_Y) + "<#CR>"
str = str + "----------<#CR>"
i = i + 1
WEND
FUKIDASI(TRIM(str))
WEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
[1]
値: 28
最小値: 0 最大値: 65
移動量: 12 表示方向: 1
X座標: 0 Y座標: 56
----------
[2]
値: 0
最小値: 0 最大値: 15
移動量: 11 表示方向: 1
X座標: 393 Y座標: 56
----------
[3]
値: 17
最小値: 0 最大値: 486
移動量: 450 表示方向: 0
X座標: 393 Y座標: 56
----------
[4]
値: 59
最小値: 0 最大値: 63
移動量: 5 表示方向: 1
X座標: 0 Y座標: 330
----------
Yahoo!ファイナンスから米ドル・ユーロ・豪ドルのレートを取得
IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
IE.Navigate("https://info.finance.yahoo.co.jp/fx/")
BusyWait(IE)
// ループを抜ける用のフラグ
PUBLIC flg = FALSE
// ESCキーを入力でloopBreak関数を実行
SETHOTKEY(VK_ESC, , "loopBreak")
REPEAT
usd = IE.document.getElementById("USDJPY_top_bid").innerText
eur = IE.document.getElementById("EURJPY_top_bid").innerText
aud = IE.document.getElementById("AUDJPY_top_bid").innerText
msg = "米ドル/円<#TAB>" + usd + "<#CR>" + _
"ユーロ/円<#TAB>" + eur + "<#CR>" + _
"豪ドル/円<#TAB>" + aud + "<#CR>" + _
"ESCで終了"
FUKIDASI(msg)
SLEEP(0.01)
UNTIL flg = TRUE
IE.Quit
PROCEDURE loopBreak()
flg = TRUE
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// values : 追加する要素をvalue1から指定
// 【戻り値】
// 処理後の配列の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
DIM i = 1
WHILE EVAL("value" + i) <> EMPTY
DIM res = RESIZE(array, UBound(array) + 1)
array[res] = EVAL("value" + i)
i = i + 1
WEND
RESULT = LENGTH(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// needle : 検索する値
// haystack : 配列
// 【戻り値】
// needleが見つかった場合に配列のキー
//////////////////////////////////////////////////
FUNCTION arraySearch(needle, haystack[])
DIM i = 0
FOR item IN haystack
IFB item = needle THEN
RESULT = i
EXIT
ENDIF
i = i + 1
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// IE : IEオブジェクト
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE BusyWait(Var IE)
SLEEP(0.500)
DIM t = GETTIME()
TRY
REPEAT
DIM tm = GETTIME() - t
FUKIDASI("BusyWait:" + tm)
SLEEP(0.010)
IF tm >= 60 THEN BREAK
UNTIL !IE.Busy AND IE.readyState = 4
EXCEPT
IE = getIEObj(-1)
PRINT IE.document.URL + " のIEオブジェクトを取得しました。"
BusyWait(IE)
ENDTRY
FUKIDASI()
FEND
//////////////////////////////////////////////////
// 【引数】
// 文字列 or 数値 : 取得したい<a href="https://uwsc.jp/com/ie/" >InternetExplorer オブジェクト</a>のタイトル・URLもしくは数値を指定
// 完全一致フラグ : (TRUE : 文字列が完全一致したものを取得、FALSE : 文字列の一部を含むものを取得)
// 【戻り値】
// 条件に一致する<a href="https://uwsc.jp/com/ie" >InternetExplorer</a>
//////////////////////////////////////////////////
FUNCTION getIEObj(str, flg = FALSE)
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM ShellWindows = Shell.Windows
DIM IE[-1]
FOR i = 0 TO ShellWindows.Count - 1
TRY
IFB ShellWindows.Item(i).Name = "Internet Explorer" THEN
arrayPush(IE, ShellWindows.Item(i))
ENDIF
EXCEPT
ENDTRY
NEXT
SELECT CHKNUM(str)
CASE TRUE
IFB str = 0 THEN
RESULT = LENGTH(IE)
ELSE
IF str < 0 THEN str = str + LENGTH(IE) + 1
TRY
RESULT = IE[str-1]
EXCEPT
RESULT = ERR_VALUE
ENDTRY
ENDIF
CASE FALSE
DIM pattern = IIF(flg, "^" + str + "$", str)
DIM titleList = SLICE(IE)
FOR i = 0 TO UBound(titleList)
titleList[i] = titleList[i].Document.title
NEXT
DIM urlList = SLICE(IE)
FOR i = 0 TO UBound(urlList)
urlList[i] = urlList[i].Document.URL
NEXT
DIM num = ERR_VALUE
SELECT TRUE
CASE pregGrep(pattern, titleList) <> FALSE; num = arraySearch(pregGrep(pattern, titleList)[0], titleList)
CASE pregGrep(pattern, urlList) <> FALSE; num = arraySearch(pregGrep(pattern, urlList)[0], urlList)
SELEND
TRY
RESULT = IE[num]
EXCEPT
RESULT = ERR_VALUE
ENDTRY
SELEND
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻り値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// pattern : 検索するパターンを表す文字列
// array : 検索される配列
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION pregGrep(pattern, array[], flags = 0)
DIM res[-1]
FOR item IN array
IF reTest(item, pattern) THEN arrayPush(res, item)
NEXT
RESULT = SLICE(res)
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻り値】
// 正規表現にマッチするかどうかを示すブール値
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Test(str)
FEND
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻り値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// arrayname : 上限値を求める配列の名前
// dimension : 返す次元を示す整数
// 【戻り値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
ファイルを開いているプロセスを調べる
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
CONST TemporaryFolder = 2
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
WITH FSO
DIM Folder = .GetSpecialFolder(TemporaryFolder)
DIM folderspec = Folder.Path
DIM filename = .GetTempName
DIM path = .BuildPath(folderspec, filename)
ENDWITH
DIM Shell = CREATEOLEOBJ("Shell.Application")
Shell.FileRun()
DIM ID = GETID("ファイル名を指定して実行", "#32770")
SENDSTR(ID, "cmd /c openfiles /query /fo CSV > " + path)
CLKITEM(ID, "OK", CLK_BTN)
SLEEP(0.500)
REPEAT
SLEEP(0.100)
UNTIL GETID("C:\WINDOWS\system32\cmd.exe", "ConsoleWindowClass") = -1
DIM FID = FOPEN(path, F_READ)
TRY
DIM ID2 = GETID("使用中", "OperationStatusWindow")
GETITEM(ID2, ITM_ACCTXT, 1)
DIM str = ALL_ITEM_LIST[1]
DIM sep = IIF(POS("フォルダー", STATUS(ID2, ST_TITLE)) <> 0, "\", "")
DIM msg = "■" + str + "<#CR>"
FOR r = 5 TO FGET(FID, F_LINECOUNT)
IF POS("\" + str + sep, FGET(FID, r, 3)) <> 0 THEN
msg = msg + "ID:" + FGET(FID, r, 1) + ", プロセス名:" + FGET(FID, r, 2) + "<#CR>"
ENDIF
NEXT
FCLOSE(FID)
REPEAT
FUKIDASI(TRIM(msg))
SLEEP(0.100)
UNTIL GETID("使用中", "OperationStatusWindow") = -1
FINALLY
FSO.DeleteFile(path)
ENDTRY
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻り値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
キーボードからの入力を1文字ずつずらす
キーからのA→B、B→C、…、Z→Aのように1文字後ろにずらします。
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
PUBLIC array[-1]
FOR key = VK_A TO VK_Z
arrayPush(array, key)
NEXT
PUBLIC rotate
rotate = arrayRotate(array, 1)
PUBLIC key
FOR key = VK_A TO VK_Z
SETHOTKEY(key,, "keyChange")
SETHOTKEY(key, MOD_SHIFT, "keyChange")
NEXT
WHILE TRUE
FUKIDASI("キー割り当て変更中。ESCで終了")
SLEEP(0.001)
WEND
PROCEDURE keyChange()
DIM vk = rotate[arraySearch(HOTKEY_VK, array)]
IFB HOTKEY_MOD = 4 THEN
vk = STRCONV(vk, SC_UPPERCASE)
ENDIF
KBD(vk)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 一次元配列。参照引数。
// callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。
// 【戻り値】
// callback関数によりフィルタ処理が行われたarrayの全ての要素を含む配列を返します。
//////////////////////////////////////////////////
PROCEDURE arrayFilter(var array[], callback)
DIM n = 0
DIM tmp[-1]
FOR %val% IN array
IFB EVAL(callback) THEN
RESIZE(tmp, n)
tmp[n] = %val%
n = n + 1
ENDIF
NEXT
RESIZE(array, RESIZE(tmp))
FOR n = 0 TO RESIZE(tmp)
array[n] = tmp[n]
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// arr : 追加される配列(参照引数)
// tmp : 追加する配列
// 【戻り値】
// 追加した後の配列の要素数
//////////////////////////////////////////////////
FUNCTION arrayMerge(Var arr[], tmp[])
FOR n = 0 TO UBound(tmp)
arrayPush(arr, tmp[n])
NEXT
RESULT = UBound(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// values : 追加する要素をvalue1から指定
// 【戻り値】
// 処理後の配列の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
DIM i = 1
WHILE EVAL("value" + i) <> EMPTY
DIM res = RESIZE(array, UBound(array) + 1)
array[res] = EVAL("value" + i)
i = i + 1
WEND
RESULT = LENGTH(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 配列
// shift : シフトする要素数。正の数で末尾方向。負の数で先頭方向。
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION arrayRotate(array[], shift)
IF shift < 0 THEN shift = LENGTH(array) + shift
DIM array1 = arraySlice(array, shift)
DIM array2 = arraySlice(array, 0, shift)
arrayMerge(array1, array2)
RESULT = array1
FEND
//////////////////////////////////////////////////
// 【引数】
// needle : 検索する値
// haystack : 配列
// 【戻り値】
// needleが見つかった場合に配列のキー
//////////////////////////////////////////////////
FUNCTION arraySearch(needle, haystack[])
DIM i = 0
FOR item IN haystack
IFB item = needle THEN
RESULT = i
EXIT
ENDIF
i = i + 1
NEXT
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 配列
// offset : 配列の位置。負の値の場合、配列の後ろから
// length : lengthが省略された場合は末尾まで。lengthが正の数ならば、offsetからlengthの数だけ要素を取得。lengthが負の数ならば、末尾からlengthだけ切り捨てる。
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION arraySlice(array[], offset, length = NULL)
SELECT TRUE
CASE offset > 0
SHIFTARRAY(array, -1 * offset)
IF length = NULL THEN length = LENGTH(array) - offset
RESIZE(array, length - 1)
CASE offset < 0
SHIFTARRAY(array, ABS(offset) - LENGTH(array))
RESIZE(array, LENGTH(array) - ABS(offset))
arrayFilter(array, "%val% <> EMPTY")
IF length < 0 THEN RESIZE(array, RESIZE(array) + length)
CASE offset = 0
IF length = NULL THEN length = LENGTH(array)
RESIZE(array, length - 1)
SELEND
RESULT = SLICE(array)
FEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻り値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// arrayname : 上限値を求める配列の名前
// dimension : 返す次元を示す整数
// 【戻り値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
マウス位置の色を取得
マウス位置の色情報を取得します。
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
WHILE TRUE
DIM c = PEEKCOLOR(G_MOUSE_X, G_MOUSE_Y)
DIM r = c AND $FF
DIM g = (c AND $FF00) / $100
DIM b = (c AND $FF0000) / $10000
FUKIDASI("赤<#TAB>" + r + "<#CR>緑<#TAB>" + g + "<#CR>青<#TAB>" + b)
SLEEP(0.001)
WEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
キャレット(カーソル)位置を取得
DEF_DLL GetCaretPos({long, long}): bool: user32
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
DIM x, y
WHILE TRUE
GetCaretPos(x, y)
FUKIDASI(x + ", " + y)
SLEEP(0.010)
WEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
CLKITEMで操作できる項目を取得
PUBLIC flg = FALSE
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
SETHOTKEY(VK_X, MOD_ALT, "flag")
DIM array[] = "BTN", "LIST", "TAB", "MENU", "TREEVIEW", + _
"LISTVIEW", "EDIT", "STATIC", "STATUSBAR", "TOOLBAR", + _
"LINK", "ACCCLK", "ACCCLK2", "ACCTXT", "ACCEDIT", + _
"FROMLAST", "BACK"
REPEAT
FUKIDASI("Alt + Xでカーソル下の情報を取得")
SLEEP(0.001)
UNTIL flg
FUKIDASI("取得中")
DIM ID = GETID(GET_FROMPOINT_WIN)
PRINT "DIM ID = GETID(<#DBL>" + STATUS(ID, ST_TITLE) + "<#DBL>, <#DBL>" + STATUS(ID, ST_CLASS) + "<#DBL>)"
PRINT
FOR item IN array
PRINT "// [" + item + "]"
FOR class IN GETITEM(ID, EVAL("ITM_" + item), -1)
PRINT "CLKITEM(ID, <#DBL>" + class + "<#DBL>, CLK_" + item + ")"
NEXT
PRINT
NEXT
PROCEDURE forceQuit()
EXITEXIT
FEND
PROCEDURE flag()
flg = TRUE
FEND
参考文献
関連記事
- SCKEY関数 (スクリプト関数)
- ショートカットキーを実行します。
- GETKEYSTATE関数 (スクリプト関数)
- GETKEYSTATE関数は、キークリック・マウスクリック・トグルキー情報を取得する関数です。引数に指定したキーコードに対応するキーのクリックがあった場合はTRUE、なかった場合はFALSEを返します。