Last Update : 2008/06/xx
Win32 API関数やウィンドウメッセージ(oncmd命令)を利用したマウス関連の発展的なサンプルスクリプトです。HSP3でマウスに関連した標準の命令・関数・システム変数には、下のようなものが用意されています。
名称 | 説明 |
mouse命令 | ポインタ(カーソル)の表示位置を変更。 カーソル表示・非表示の切り替え。 |
getkey命令 | 左ボタン、右ボタン、中ボタン(ホイールボタン)が クリックされているか取得。 |
stick命令 | 左ボタン、右ボタンがクリックされているか取得。 |
onclick命令 | 左ボタン、右ボタン、中ボタン(ホイールボタン)が クリックされた時のラベルジャンプ先を指定。 |
システム変数 mousex | ポインタの位置(X座標、Y座標)が返る。 HSPの自ウィンドウ内(クライアントエリア、デフォルトで 白い部分)から見た位置です。 |
システム変数 mousey | |
システム変数 mousew | マウスホイールの回転移動量(±120)が返る。 |
システム変数 ginfo_mx ginfo関数 (タイプ0) |
ポインタの位置(X座標、Y座標)が返る。 PCのモニタ画面から見た位置です。 |
システム変数 ginfo_my ginfo関数 (タイプ1) |
HSP2にはllmod.asモジュールを利用したmouse_event命令がありました。
これはマウスを操作する命令(クリック動作)ですが、同名のWin32
API関数であるmouse_event関数を単に呼び出していただけです。HSP3では「llmod3」にも用意されてます。
// mouse_event関数サンプル (by Kpan) #include "user32.as" ; mouse_event関数 ; 第1パラ ... 動作の種類指定 (以下の数値の組み合わせ) ; $8000=絶対座標 (指定しないと直前のカーソル座標位置が移動量に反映) ; $1=カーソル移動 ; $2=左ボタンダウン、$4=アップ (→足した$6だと左クリック) ; $8=右ボタンダウン、$10=アップ ; $20=中央ボタンダウン、$40=アップ ; $800=ホイール回転 (Windows NT/2K以降) ; 第2パラ、第3パラ ... XY方向の移動量 (×ピクセル数) ; 0〜65535の範囲と決まっているので、1/2すれば画面の中心に ; 第4パラ ... ホイールの移動量 ホイール回転を指定している場合 ; 第5パラ ... 0指定 mouse_event $8000 | $1, 65535 / 2, 65535 / 2, 0, 0
動作を組み合わせれば、一連のクリック動作(マウスのボタンの押し下げ+ボタンから離す)になります。
// mouse_event関数サンプル (by Kpan) #include "user32.as" wait 100 ; カーソル移動 repeat 2000 mouse_event $8000 | $1, cnt, cnt, 0, 0 loop wait 100 ; 右ボタンクリック mouse_event $8 | $10, 0, 0, 0, 0 mes "done"
自ウィンドウ上でのマウスカーソル(マウスポインタ)の変更です。
まずはWindowsのシステムが用意してる15個ほどカーソル(砂時計、禁止マークなど)を利用するサンプルです。カーソルIDの一覧はちょくとさんのページを参照してください。
// システムのカーソルを利用するコード (by Kpan) #include "user32.as" ; ウィンドウ全体の場合 ; LoadCursor関数の第2パラに カーソルID を指定。 LoadCursor 0, 32514 SetClassLong hwnd, -12, stat ; 特定オブジェクト上のみの場合 chkbox "チェック", a hChkbox = objinfo(stat, 2) LoadCursor 0, 32649 SetClassLong hChkbox, -12, stat
今度は自前のカーソルを利用する方法です。LoadCursorFromFile関数でハードディスク上のカーソルファイル(*.cur)や、アニメーションカーソルファイル(*.ani)を読み込んで利用する方法です。
// カーソルファイルの利用 (by Kpan) #include "user32.as" dialog "cur;*.ani", 16, "カーソルファイル" if stat = 0 : stop LoadCursorFromFile refstr SetClassLong hwnd, -12, stat
次に、実行ファイルにカーソルファイルのデータを「リソース」として埋め込んでおくHSP的にはイレギュラーな手法です。リソースエディタ「Resource Hacker」を別途用意してください。まず、実行ファイル(正確に言えば、後に実行ファイルとなるランタイム)にカーソルを埋め込む作業を行います。
で、HSPスクリプトで任意のカーソルをリソースから読み込む処理を書きます。
// リソースのカーソルを利用1 (by Kpan) ; 自動作成オプション指定に先ほど保存した拡張ランタイム(*.hrt)を設定 #packopt runtime "hogehoge.hrt" #include "user32.as" ; 実行ファイル内からカーソルデータを読み込んでカーソルのハンドルを取得。 ; 第2パラメータが先ほどの[リソース名]で指定した数値です。 LoadCursor hinstance, 1 SetClassLong hwnd, -12, stat
これで完成。早速、[コンパイル+実行]をやってみましょう。とかろが、カーソルは何も変化しないと思います。これは実行ファイルにならないと、実際の効果を確認することはできません。必ず[実行ファイル自動作成]で実行ファイルを作成し確認してください。
カーソルファイルは複数個埋め込むこともできます。もう1つ埋め込んで、それはオブジェクト上でカーソルが変わる処理にしてみます。「hogehoge.hrt」を「Resource Hacker」で再び読み込み、[リソース名]を今度は「2」としておきましょう。そして、上のスクリプトに以下のように追記します。
// リソースのカーソルを利用2 (by Kpan) #packopt runtime "hogehoge.hrt" #include "user32.as" ; ウィンドウ全体 LoadCursor hinstance, 1 SetClassLong hwnd, -12, stat ; オブジェクト上 chkbox "ここの上ネ", value hChkbox = objinfo(stat, 2) ; カーソル読み込み LoadCursor hinstance, 2 ; objinfo関数の第1パラメータでオブジェクトIDを指定 SetClassLong hChkbox, -12, stat
シングルクリックとダブルクリックの判定です。シングルクリックは標準のonclick命令でも可能です。ダブルクリックは、HSP2の場合だとちょっと大変だと思いますが、HSP3では楽に実現できます。(→ 参照、HSP開発Wiki)
// 左クリックサンプルソース (by Kpan) ; WM_LBUTTONDOWN (マウスの左クリックされた時) oncmd gosub *lbuttondown, $201 ; [おまけ] ; WM_MBUTTONDOWN (マウスの中央ボタンが押された時) oncmd gosub *mbuttondown, $207 stop *lbuttondown ; 1=左ボタン、3=右ボタン+左ボタン、5=Shiftキー+左ボタン、 ; 9=Ctrlキー+左ボタン mes "左クリック: "+wParam+"" return *mbuttondown ; 16=中央ボタンが押された mes "中央: "+wParam+"" return
// ダブルクリックサンプルソース (by Kpan) #include "user32.as" ; WM_LBUTTONDBLCLK (左ボタンをダブルクリックした時) oncmd gosub *lbuttondblclk, $203 ; WM_RBUTTONDBLCLK (右ボタンをダブルクリックした時) oncmd gosub *rbuttondblclk, $206 ; ダブルクリックを取得できるようウィンドウクラススタイル変更 (CS_DBLCLKS) GetClassLong hwnd, -26 SetClassLong hwnd, -26, stat | $8 stop *rbuttondblclk *lbuttondblclk ; wparam値に1=左ボタン、2=右ボタンが返る dialog "ダブルクリッッーク! ("+wparam+")" return
いまいち実用性が不明な代物ですが、マウスカーソルのウィンドウ移動範囲を制限します。ウィンドウを移動したりしてしまうと制限は解除されてしまいます。プログラムの終了の際は必ず制限を解除してください。
// カーソル移動範囲制御 (by Kpan) #include "user32.as" ; 制限する画面全体の左上XY座標、右下XY座標 (RECT構造体) RECT = 100, 0, 200, 200 ClipCursor varptr(RECT) wait 500 ; 解除するには 0 指定 ClipCursor 0
マウスのポインタ(カーソル)が移動した際に通知されるウィンドウメッセージ「WM_MOUSEMOVE」をチェックします。HSPのループチェックを使わない手法です。
// 自ウィンドウの座標 (by Kpan) ; WM_MOUSEMOVE (マウスカーソルが移動した時) oncmd gosub *mousemove, $200 stop *mousemove ; wparam には 1=マウスの左ボタンを押しながら、2=右ボタンを ; 押しながら、4=Shiftキーを押しながら、8=Ctrlキーを押し ; ながら、16=中央ボタンを押しながら。 title "X: "+mousex+" / Y: "+mousey+" || "+wparam+"" return
// スクリーン全体の座標 (by Kpan) // (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。 oncmd gosub *mousemove, $200 stop *mousemove title "X: "+ginfo(0)+" / Y: "+ginfo(1)+"" return
mouse命令でマウスカーソル(マウスポインタ)の表示・非表示の状態を切り替えできますが、現在のカーソルの表示状態を取得します。Windows 98以降のGetCursorInfo関数(CURSORINFO構造体)を利用します。
// カーソルの状態取得 (by Kpan) // Windows 98〜 #include "user32.as" ; CURSORINFO構造体 dim CURSORINFO, 5 button "消す", *hidden button "表示", *show stoop *hidden mouse -1 goto *check *show mouse goto *check *check CURSORINFO = 20 GetCursorInfo varptr(CURSORINFO) ; 0=表示なし、1=表示あり title ""+CURSORINFO.1
また、mouse命令のヘルプにあるように、『マウスカーソル表示の設定は、システムの内部カウンタにより制御されています。OFFにした表示を、再度表示するためには、OFFにした回数分だけ表示のリクエストを行なう必要があるので注意してください』とあります。ShowCursor関数を利用すると、戻り値がこの「システムの内部カウンタ」値です。
// カーソルの表示・非表示 (by Kpan) #include "user32.as" repeat 5 ; 0で非表示カウントアップ、1で表示カウントアップ ShowCursor 0 loop mes stat
ホイール回転時に通知されるウィンドウメッセージ「WM_MOUSEWHEEL」です。前回転で120の倍数値、後回転で-120の倍数値が返ります。ちなみに、HSP3にはシステム変数mousewも用意されてます。
// ホイール移動量の取得 // Windows 98〜 ; WM_MOUSEWHEEL (ホイールが回転した時) oncmd gosub *mousewheel, $20A stop *mousewheel ; wparamの上位ワードに移動量が返る mes ""+(wparam >> 16 & $FFFF) return
; WM_NCLBUTTONDOWN (タイトルバーがクリックされた時) oncmd gosub *nclbuttondown, $A1 ; WM_NCLBUTTONDBLCLK (タイトルバーがダブルクリックされた時) oncmd gosub *nclbuttondblclk, $A3 stop *nclbuttondown mes "クリック" return **nclbuttondblclk mes "ダブルクリック" return
Copyright © 2005-2012 Kpan. All rights reserved.