WindowsMobile 5.0/6.0/6.1 TouchKeySip v1.12 スクリプトコマンドマニュアル touchkeysip の設定ファイルの記述方法を解説します。 touchkeysip 自体の説明は touchkeysip.txt を参照してください。 このドキュメントは 8tab です。 ●特徴 このスクリプトは設定ファイルの記述に特化した特殊な言語となっています。 非常に軽量であることが特徴です。読み込みも構文解析の無い 1パスで、デコーダ (コンパイラ)も最小限で実行ユニット(VM)もほとんどメモリを消費しません。 その代わり命令はアセンブラライクな低レベルなものとなっていますが、em1key より はまじめに設計したのでそこそこまともになりました。汎用度が向上し重複する不要 な機能も無くなっています。 各命令は可変個数の任意の引数を持つことができ、定数、変数区別無く記述すること ができます。ブロック制御構文が入ったので、ラベルを使ったジャンプを用いる必要 もありません。 8bit の定数制限も無くなり、値数も演算も変数もすべて 32bit まで意識せずに値を 扱うことができます。文字列定数も特殊な命令を必要とせず、直接記述できるように なりました。ローカル変数と引数の扱いも統一され、スタックを直接操作する必要も ありません。 ただし構文解析やエラー判定、構造データの扱いに関しては結局設定ファイルの拡張 に過ぎず、言語として低レベルであることは変わりません。 ●配布など touchkeysip 用に作成したスクリプトやデータは、自由に再配布することができます。 touchkeysip の作者に許可を取る必要はありません。また touchkeysip に付属する defaultscript.txt 等のサンプルを改変したものも、無断で自由に再配布して構い ません。 ●ファイルの置き場所 デフォルトの script は下記の場所に置かれます。 \Program Files\touchkeysip\defaultscript.txt このファイルを直接変更しても構いませんが、touchkeysip の更新や再インストール で上書きされてしまう可能性があります。 オプション画面で他のファイルを指定することができるので、修正する場合は別の ファイル名に変更しておくことをお勧めします。また script ファイルの置き場所は 本体メモリを推奨します。 ●キーボードデータファイル 基本的にテキストで書かれたスクリプトファイル 1つです。これに、スクリプト内で 読み込む任意の bmp 画像データが付属します。 まずは何らかのサンプルをベースに、キー配列の変更や画像の入れ替えなどから 試してみることをお勧めします。 ●レジストリ このソフトウエアは SIP として登録するために、下記のレジストリエントリを追加 します。下記以外のエントリは変更していません。 HKEY_CLASS_ROOT\CLSID\{A7815BD6-D976-4b0f-B0E3-E6FA309ADF94} ●script の実行タイミング インストール後、SIP (入力パネル) を touchkeysip に切り替えたタイミングで script が読み込まれ、定義された関数 EventSelect が走ります。 通常この EventSelect の中で必要な Bitmap 等のリソース読込を行います。 SIP を他の入力パネルに切り替えると Script 内で定義された EventDeselect 関数 が走り、必要な後始末を行います。その後読み込まれたりソースを開放し、開いた ウィンドウなどをすべて閉じます。 スクリプトやリソースを更新した場合の再読込は、このように入力パネルを一旦他の ものに切り替えるだけでできます。逆に一度他のパネルに切り替えないと更新が反映 されません。 オプション設定を反映させる場合も、同じように一旦 SIP を切り替える必要があり ます。 ●座標系 ウィンドウ、描画、イベントの判定などは座標をもとに行われます。この座標系は デバイスの本来のピクセル座標に相当します。 そのため QVGA 機種にあわせて作った SIP 設定は VGA 機種では小さく表示されて しまいます。逆も同様です。 この差を解消するために、座標系のスケーリング補正機能を持っています。 QVGA 用に作った script も 2倍のスケールに設定しておけば、VGA 機種でもほぼ 同じような大きさで表示されるようになります。縮小も可能です。 これらの判定や適切なスケールの設定は、画面サイズを元にスクリプトで自動化する ことが可能です。 ●押されたボタンの判定 押されたボタンは、キーボードエリアのどの座標にタッチされたのかで判定します。 座標範囲はあらかじめテーブルに記述しておくことが可能で、同時に押されたとき に実行される関数名も指定できます。 サンプルデータを見ると、ほとんどテーブルの記述だけでキーが定義されていること がわかるかと思います。 関数部分はほとんど定型とみなしてかまいません。カスタマイズはほとんどの場合 ・テーブルの座標の変更 ・与えるキーコード ・画像の変更 だけでできるはずです。 スクリプトが必要になるのはおそらく、複雑なコマンド(モード変更など)と、複雑 なキー操作(携帯電話のかな入力のような)、特殊な演出(ポップアップウィンドウ、 パターンアニメーション)の場合だけでしょう。 ●ウィンドウ 情報表示用として、メインの入力パネルだけでなく、サブウィンドウを用いること ができるようになっています。現在メインパネルを含めて 8枚まで管理できます。 たとえばボタンを押したタイミングでポップアップさせ、何らかの情報を表示する ことが可能です。または入力時のガイドとしても利用できます。 メインの入力パネルはウィンドウ番号 (wid) 0 に相当します。wid 0 のみ本来の SIP エリアに表示されます。それ以外は画面にオーバーラップして任意の位置に表示 させることが可能です。 なお伝統的な WindowsCE の入力パネルでは、基本的にメインウィンドウ 1つしか使 わないので、必ずしもサブウィンドウを用いる必要はありません。この場合 wid は 常に 0 と思って構いません。 各ウィンドウには、それぞれ独立した DisplayList とイベントテーブルを登録する ことが可能です。 ウィンドウ内でタッチ等の操作が行われた場合、対応づけられたイベントテーブル に従って任意の処理が呼ばれます。ウィンドウの再描画が必要になった場合、対応 づけられた DisplayList に従って描画が行われます。 ●固定イベント 一部の関数番号はシステムで予約されており、特殊な固定のイベント発生時に呼ばれ ます。現在下記の固定イベントがあります。 EventSelect (01) touchkeysip の入力パネルが選択されたときに呼ばれます。リソースの読み 込みやウィンドウのオープンなど、初期化はこのタイミングで行います。 IInputMethod2::Select() に相当します。 EventDeselect (02) 入力パネルを touchkeysip から他の入力パネルに切り替えたときに呼ばれ ます。終了時の処理が必要な場合に記述します。特に必要ない場合は未定義 のままにしておいて構いません。 IInputMethod2::Deselect() に相当します。 EventTimer (03) 指定時間後に呼ばれます。 v1.10 以降は複数のタイマーを設定できるようになりました。呼び出し直後、 $GW_RETVAL0 に timer の種類 0〜3 が入ります。この値を調べることで、 どの timer による呼び出しか区別することが出来ます。 WM_TIMER に相当します。 EventRotate (04) 画面回転時や解像度変更などデバイスの状態が変化したときに呼ばれます。 WM_SETTINGCHANGE に相当します。 EventShowing (05) IInputMethod2::Showing()/Hiding() に相当します。 $GW_RETVAL0 に状態が入ります。Showing = 1, Hiding = 0 発生タイミングを厳密に調査していないため利用には注意してください。 0x06〜0x0f 予約 ●描画の説明 コマンドで直接描画するだけでなく、ウィンドウの重なりに応じて再描画時にも適切 な描画を行う必要があります。 描画手段はあらかじめコマンド形式で専用のバッファに格納しておきます。この バッファを DisplayList と呼び、現在 32 個あります。 ◎DisplayList 32個分描画コマンドを格納可能 例えば (1) 背景用に画像を全部転送する (2) 押されたボタンだけ別の画像を転送する といった2つの描画コマンドを DisplayList に登録しておけば、必要なときに (1)→(2) の順番でまた描画を呼び出してくれます。 描画手段をまとめると下記のようになります。 ・どのような描画を行うのか、0〜31 番の DisplayList に登録しておく。 SetDisplayList ・ウィンドウが、DisplayList のうちどこを参照するか登録する。 ウィンドウの描画時に、DisplayList の何番目から何個分を実行するか 設定します。 SetWindowDisplayList ウィンドウに登録するだけでなく、即座に描画を反映させたい場合があります。 例えば、ボタンが押されたら背景は更新する必要は無いけど、ボタンのパーツだけ 色を変えてみたいわけです。 こんなときは任意の DisplayList を即座に描画実行することができます。 ・DisplayList の任意の位置から指定個数分即座に実行する。 DrawDisplayList 描画コマンドには何もしない DLTYPE_OFF があります。ウィンドウに一定範囲の DisplayList を対応付けしておき、部分的に DLTYPE_OFF にしたり DLTYPE_COPY に して表示内容を切り替えることもできます。 各種サンプルデータではさまざまな手法を使っていますので参考にしてください。 ●スクリーン座標への変換 ボタンをタッチしたときに受け取る座標は、そのウィンドウ内のローカル座標になっ ています。例えばメインパネル (WIN_MAIN) で何らかの位置が押されると、WIN_MAIN の左上位置が (0,0) となります。 例えばキーボードの上外側、アプリケーション側の座標は Y が負の座標となります。 サブウィンドウをポップアップで表示させたい場合は、スクリーン座標で指定する 必要があるので座標変換が必要になることがあります。 GetScreenPos WIN_MAIN 0 0 このコマンドは、メインパネル( WIN_MAIN )左上原点の、スクリーン座標を $GW_RETVAL0, $GW_RETVAL1 に返します。 また GetScreenPos WIN_MAIN $GW_PX $GW_PY のように引数に 0 以外のパラメータを与えると、それらを加算した値を返します。 つまりローカル座標からスクリーン座標への変換に相当します。 SIP の表示位置は画面サイズによって異なることがあります。Y 座標は当然ですが、 X 座標も常に 0 ではありません。画面の回転によって横画面になると中心にセンタ リングされます。そのため、 640x480 の縦位置 640x480 の横位置 800x480 の横位置 はどれも異なる X の基準スクリーン座標を返します。 互換性のためにも GetScreenPos を使って、サブウィンドウの描画には SIP の基準 位置を考慮するようにしてください。 ●行フォーマット ・各コマンドは改行で区切ります。 ・コマンドとその引数は空白文字で区切ります。 ・'#' 以後はコメントとみなし無視します。 ・何も書かれていない空行も無視します。 空白文字は、半角スペースもしくはタブです。文字列定数 "〜" や文字定数 '〜' など、クオートされている場合は空白文字を含むことができます。 1行の長さは 256byte 未満にしてください。また各種キーワードも 256byte 未満 である必要があります。 ●記述時の文字コードについて 文字列定数、文字定数に ASCII 7bit (0x7f 未満) の文字だけ使用している場合は UTF-8 でも ShiftJIS でも構いません。コメントの文字コードは特に影響ありません。 文字列定数 ("〜") に、日本語等上記以外の文字を使用する場合は、ファイル全体を UTF-8 で保存しておく必要があります。UTF-8 BOM は特に必要ありませんが、あって も影響しません。 ただし文字定数 ('〜') は UTF-8 に未対応なので注意してください。 PrintFormat は現在 ASCII 7bit のみ出力できます。 ●定数 (Const) 定数 (Const) には下記の 4種類あります。各数値は 32bit 符号付とみなします。 ・10進定数 -2147483648 〜 2147483647 ・16進数定数 0x0〜0xffffffff ・文字定数 'A'〜'Z' '0'〜 1〜4文字の文字コード \ はエスケープ文字として認識するので、\\ と2重に記述する必要があります。 特殊な文字は下記のとおりです。 \\ 文字 \ \' 文字 ' \xHH 16進数で直接コードを指定 ・シンボル名 (Symbol) define や edef で定義されたもの。定義された数値に置き換わります。 ●シンボル名 (Symbol) 定数の代わりに定義したシンボル名を用いることができます。シンボルは define や edef 命令で定義します。 シンボル名に使える文字は下記の通りです。ただしシンボル名の先頭に数値を使う ことはできません。  ・英数 A〜Z a〜z  ・数字 0〜9  ・アンダースコア _ 大文字小文字を厳密に区別するので注意してください。全角は使えません。名前の 長さに特に制限はありませんが、あまり長い場合は行長制限、キーワード長制限に 引っかかる可能性があります。 シンボル名はコンパイル時にのみ参照されます。バイトコード変換時に定数に置き 換わるので、実行時には単なる定数とかわりません。 ●引数 (Arg) 命令の引数として使用可能なオブジェクトは次の通りです。 ・定数 (Const) ・文字列定数 (String) "〜文字列〜" \ はエスケープ文字として認識します。そのためパスの区切りで使う「\」 も二重に「\\」と記述する必要があります。 文字列定数として記述できるのは最大 250 文字までです。 特殊な文字は下記のとおりです。 \\ 文字 \ \" 文字 " \xHH 16進数で直接コードを指定 ・変数 (Var) $ の形式で、実行時に変数を扱うことができます。変数の内容が 参照されます。 ・間接変数 (Var) $$ の形式で、$ の値を変数番号とみなして変数への間接 参照ができます。間接変数アクセスについて詳しくは後述します。 「●変数の間接アクセス」を参照してください。 ●変数 (Var) 変数は、実行時に任意の値を入れておくことができる器です。任意の数値 (Const) を格納することができます。 変数は番号で管理されており、番号区分によっていくつかの種類があります。 この区分は将来変数領域の追加により変更される可能性があるので注意してください。 ・ローカル変数 $0〜$63 関数ごとに割り当てられるローカルな変数領域です。値はその関数の中での み有効で、呼出し毎に別の領域となります。ローカル変数は LOCAL 命令で 確保した分だけアクセスすることができます。 たとえば LOCAL 5 と宣言した場合 $0〜$4 まで使えるようになります。 ・関数の引数参照 $ARG0, $ARG1, ... 関数の引数として渡された値を参照します。$65〜 の番号が割り当てられて いますが、将来の互換性のために必ず $ARG0, $ARG1, 〜 の定義シンボルを 使ってください。 ・グローバル変数 $GW_〜 関数の範囲を超えてアクセスすることができ、また関数終了後も値が保存 されます。この値は SIP を切り替えるまで有効です。いくつかの変数は 使い道が決まっています。$128 以降の番号が割り当てられていますが、 将来の互換性のためにできる限り定義された $GW_ のシンボル名を使って ください。 ●グローバル変数領域 0x80 $GW_STATE 直前の IF/CMP 命令の結果 TRUE or FALSE が格納されます。この変数は IF/CMP 命令によって常に書き換わるので、値が必要な場合は別の変数に 保存しておいてください。条件式を結合する場合に参照したり書き換える ことができます。 0x81 $GW_RETVAL0 0x82 $GW_RETVAL1 0x83 $GW_RETVAL2 0x84 $GW_RETVAL3 〜 0x8f 関数の戻り値を格納する変数として使用します。関数の戻り値を参照する 場合、または戻り値を返す場合はこの変数を使ってください。この変数も 頻繁に書き換えられるため、できるだけ RETURN 直前で書き込みを行い、 また必要なら関数呼び出しの直後にすぐ保存しておいてください。 特に SystemCall 呼び出しを行うと必ず値を返すので、常に GW_RETVAL0 が書き換わります。 特に戻り値で書き換えないことがわかっている場合、汎用の変数やワーク として用いることも出来ます。 0x90 $GW_PX 0x91 $GW_PY イベント発生時の座標が入ります。必要に応じて参照することができます。 0x92 $GW_RX 0x93 $GW_RY 0x94 $GW_RW 0x95 $GW_RH イベント発生時の判定矩形が入ります。必要に応じて参照できます。 0x96 $GW_EVENTTYPE 発生したイベントの種類が入ります。 0x97 $GW_WID イベントが発生したときのウィンドウ番号が入ります。 0x98 $GW_PARAM0 0x99 $GW_PARAM1 イベントテーブルの引数が入ります。 0x9a〜0x9f 予約 $0xa0〜$0xff ユーザー用ワークとして自由に使うことができます。 v1.07 以前は 0xa0〜0xbf の 32 個でした。 v1.08 以降 0xa0〜0xff までの 96 個に拡張されています。 ●変数の間接アクセス 変数参照時に $$ と二重にすることで間接アクセスが可能になります。例えば $$0 は、変数 $0 に入っている値を変数番号とみなして値を参照します。 SETV $0 3 # $0= 3 ADD $2 $2 $$0 # $2= $2 + $[$0] 上記の例で $0 の値は 3なので、$2 には $3 の内容が加算されます。間接アクセス 変数に値を代入するには SETA 命令を使います。 SETV $0 5 # $0= 5 SETV $1 20 # $1= 20 SETA $1 $$0 # $[$1]= $[$0] / $20= $5 SETA は第一引数の値を変数番号とみなして値を代入します。第一引数に $$1 と記述 した場合は 2段階間接になるので注意してください。 SETV $0 5 # $0= 5 SETV $1 20 # $1= 20 SETV $20 33 # $20= 33 SETA $$1 $$0 # $[$[$1]]= $[$0] この場合 $1 は 20 が入っていて、$20 には 33 が入っているため $33= $5 相当に なります。 ●コンパイラコマンド コンパイル(ロード)時に解釈される命令です。バイト命令に展開されないので常駐 メモリを消費しません。これらは内蔵されている唯一の予約語です。下記以外の コマンドはすべて外部ファイルで定義されたシンボル値です。 em1key のスクリプトと違い、大文字小文字を区別するので注意してください。 特に 'else' は、大文字の 'ELSE' と意味や働きが異なるので注意が必要です。 define ------------------------------------------------------------------------------- Symbol name 定義するシンボル名 Const num 割り当てる定数 name に数値 num を割り当てます。 ------------------------------------------------------------------------------- enum ------------------------------------------------------------------------------- Const num 割り当てる定数の初期値 edef でシンボルに割り当てる初期値を指定します。以後 edef でシンボル に割り当てられるたびにインクリメントします。 ------------------------------------------------------------------------------- edef ------------------------------------------------------------------------------- Symbol name 定義するシンボル名 name に数値を割り当てます。割り当てる数値は enum で指定したものです。 edef 命令ごとに割り当てられる数値は 1増えます。 例 enum 0 edef W_MON edef W_TUE edef W_WED edef W_THU edef W_FRI edef W_SAT edef W_SUN これは下記の定義と同等です。 define W_MON 0 define W_TUE 1 define W_WED 2 define W_THU 3 define W_FRI 4 define W_SAT 5 define W_SUN 6 ------------------------------------------------------------------------------- ifsw / ifnsw 〜 else 〜 endsw ------------------------------------------------------------------------------- Const param 条件 ifsw は param が 0 以外の場合に条件成立とみなし、else/endsw までを コンパイル対象にします。ifnsw は param が 0 の場合に条件成立とみな します。 else が存在する場合は、条件が成立しなかった場合のコンパイル対象を 記述できます。「else 〜」部は無くてもかまいません。 通常 param には define されたシンボルを用い、コンパイル時の機能選択 等に使います。これは C/C++ のプリプロセッサ #if 〜 #else 〜 #endif に相当します。 最大 16 段までネストできます。 ------------------------------------------------------------------------------- func 〜 endfunc ------------------------------------------------------------------------------- Const funcid 定義する管理番号 指定の管理番号に関数を定義します。func 〜 endfunc の間には実際に実行 する命令を記述することができます。 管理番号は 0〜511 で与えることができます。通常わかりやすいように番号 にシンボル名を定義して使います。 一部の管理番号(0〜15)はシステムで予約されており、役割が決まってい ます。また管理番号は table 命令と共通なので、衝突しないよう注意して ください。 ------------------------------------------------------------------------------- table 〜 endtable ------------------------------------------------------------------------------- Const tableid 定義する管理番号 table 〜 endtable の間には汎用のデータ定義を記述することができます。 この管理番号は func 〜 と共有しているので注意してください。 ------------------------------------------------------------------------------- dataw [ .. ] ------------------------------------------------------------------------------- Const num0 .. 定義データ 任意のデータを 16bit (word) で定義します。table の中でのみ使えます。 ------------------------------------------------------------------------------- datad [ .. ] ------------------------------------------------------------------------------- Const num0 .. 定義データ 任意のデータを 32bit (dword) で定義します。table の中でのみ使えます。 (v1.09 現在未実装) ------------------------------------------------------------------------------- ●実行コマンド 実際にバイトコンパイルされる命令群です。func 〜 endfunc の間にのみ記述する ことができます。これらは実行時に解釈されます。 LOCAL ------------------------------------------------------------------------------- Const count 確保数 ローカル変数を確保します。ここで指定した数だけ関数内でワーク用の ローカル変数を用いることができます。ローカル変数は $0〜 でアクセス できます。 func 定義の先頭で使用します。先頭以外でも使えますが、LOCAL 実行前は ローカル変数を用いることができません。 ------------------------------------------------------------------------------- SETV ------------------------------------------------------------------------------- Var vid 代入する変数 Arg val 代入値 変数に値を代入します。 例 SETV $3 128 # $3= 128 SETV $2 $GW_STATE # $2= $GW_STATE SETV $GW_PX $0 # $GW_PX= $0 ------------------------------------------------------------------------------- SETA ------------------------------------------------------------------------------- Arg vid 代入する変数番号 Arg val 代入値 変数に値を代入します。SETV との違いは、vid 側の変数を評価することです。 vid に変数を与えた場合、その変数の中身を変数番号とみなします。変数の 間接指定が可能で、配列変数のような使い方ができます。 「●変数の間接アクセス」も参照してください。 例 SETV $0 3 # $0 に 3 を代入 ($0=3) SETA $0 8 # $0 値はこの場合 3 なので、$3 に 8 を代入 ($$0=8, $3=8) SETA 0 3 # $0 に 3 を代入。この場合 SETV と全く同じ挙動。 ------------------------------------------------------------------------------- CALL [ ... ] ------------------------------------------------------------------------------- Arg funcid 呼び出す関数の管理番号 他の関数を呼び出します。呼び出し時に任意個数の引数を与えることができ ます。funcid を変数指定することも可能です。サブルーチンに関数を渡して 処理先を切り替えることもできます。 ------------------------------------------------------------------------------- SCALL [ ... ] ------------------------------------------------------------------------------- Arg sysid 呼び出すシステム命令番号 組み込みのシステム命令を番号指定で呼び出すことができます。通常は専用 のシンボルが割り当てられているので、この命令を直接用いる必要はありま せん。必要に応じて引数を記述する必要があります。 ------------------------------------------------------------------------------- RETURN ------------------------------------------------------------------------------- 関数から戻ります。 ------------------------------------------------------------------------------- EXIT ------------------------------------------------------------------------------- イベント呼び出しを終了します。深い関数呼び出しの中からも、強制的に 終了させることができます。 ------------------------------------------------------------------------------- IF CMP ------------------------------------------------------------------------------- Const cmp 比較手段の指定 Arg param0 比較値 Arg param1 比較値 値を比較し比較した結果を $GW_STATE に格納します。cmp は下記のシンボ ルを指定することができます。 CMP_EQ param0 == param1 CMP_NE param0 != param1 CMP_LT param0 < param1 CMP_LE param0 <= param1 CMP_GT param0 > param1 CMP_GE param0 >= param1 それぞれ成り立つ場合に $GW_STATE に TRUE (1) が入り、成り立たない 場合に FALSE (0) になります。 $GW_STATE の値を演算で求めることにより、条件式の結合が可能です。 なお IF と CMP は同じコマンドに対する別名(alias)です。文脈に応じて使 い分けてください。 例 条件式の結合 CMP CMP_EQ $1 $2 # $1 == $2 の比較 SETV $0 $GW_STATE # $GW_STATE の保存 CMP CMP_EQ $3 $4 # $3 == $4 の比較 AND $GW_STATE $GW_STATE $0 # ( $1 == $2 and $3 == $4 ) 相当 ------------------------------------------------------------------------------- THEN ------------------------------------------------------------------------------- $GW_STATE が FALSE の場合、対応する ELSE か ENDIF の次の命令に 飛びます。ネスト数制限はありません。 例 $GW_PX が 32 なら (A) を、そうでなければ (B) を実行 IF CMP_EQ $GW_PX 32 THEN (A) ELSE (B) ENDIF ------------------------------------------------------------------------------- ELSE ------------------------------------------------------------------------------- 対応する ENDIF まで飛びます。 現在のデコーダーでは ELSE を複数記述してもエラーになりませんが、 このような記述の仕方は推奨しません。 ------------------------------------------------------------------------------- ENDIF ------------------------------------------------------------------------------- 何もしません。THEN 〜 ELSE 〜 の終端を意味します。 ------------------------------------------------------------------------------- DO ------------------------------------------------------------------------------- DO〜WHILE ブロックを作成します。 必ず WHILE と対応させてください。 ------------------------------------------------------------------------------- WHILE ------------------------------------------------------------------------------- $GW_STATE が FALSE でないなら、対応する DO まで戻ります。DO および CMP 命令と組み合わせて使います。 例 8回ループ SETV $0 0 DO (実行文) ADD $0 $0 1 CMP CMP_LT $0 8 WHILE ------------------------------------------------------------------------------- ADD # vid= param0 + param1 SUB # vid= param0 - param1 MUL # vid= param0 * param1 DIV # vid= param0 / param1 MOD # vid= param0 % param1 AND # vid= param0 & param1 OR # vid= param0 | param1 XOR # vid= param0 ^ param1 SHL # vid= param0 << param1 SHR # vid= param0 >> param1 ------------------------------------------------------------------------------- Var vid 代入する変数 Arg param0 Arg param1 param0 と param1 の演算結果を変数 vid に代入します。 例 ADD $0 $2 32 # $0=$2+32 ------------------------------------------------------------------------------- NEG # vid= -param NOT # vid= ~param ------------------------------------------------------------------------------- Var vid 代入する変数 Arg param param の演算結果を変数 vid に代入します。 ------------------------------------------------------------------------------- ●システムコール命令 システムコールは組み込みの関数のことです。func / table の管理番号とはまた別 の番号体系を持ち、番号を意識することなく呼び出すことができます。 戻り値は必ず $GW_RETVAL0 に入ります。特に明示していないシステムコールでも、 戻り値として常に 0 を返しているため $GW_RETVAL0 の値を上書きします。 注意してください。 SetPanelSize SetPanelSize ------------------------------------------------------------------------------- Arg width パネルの大きさ (横のドット数)、-1 で無変更 Arg height パネルの大きさ (縦のドット数)、-1 で無変更 Arg xpos パネル絶対位置指定 Arg ypos パネル絶対位置指定 戻り値なし SIP のサイズを指定します。標準よりも大きなサイズや小さいなサイズに 変更することも可能です。 この命令を使わない場合は下記のデフォルトのサイズとなります。 240x80pixel (QVGA) 480x160 (VGA) RealVGA 時は EventSelect でこの命令を実行しておかないと正しいサイズ で表示されませんので注意してください。 横のサイズを拡大することもできます。特に横画面時の SIP は左右に空き ができるので、この幅をいっぱいに使った SIP を作ることも可能です。 width, height のみ指定した場合は、出来るだけ状態を変更しないように 動作します。また常にセンタリングします。 xpos, ypos も指定した場合は、制限なしにパネルの絶対位置やサイズを 変更することが出来ます。例えば横画面時に右端に寄らせたり、といった 自由な位置決めができるようになります。 ------------------------------------------------------------------------------- LoadBitmap ------------------------------------------------------------------------------- Arg bid 読み込む管理番号 (0〜7) String filename 読み込む Bitmap ファイル名 戻り値なし 管理番号に画像を読み込みます。現在利用可能な管理番号は 0〜7 です。 画像は同時に 8枚まで読み込めますが、一つのキーボードに使用するリソース はできるだけ 1枚にまとめてください。その方が高速で効率よい描画が 出来ます。読み込める画像は Windows の bmp 形式。 v1.10 以降は jpeg、gif、png 等一般的な画像データに対応しました。 Bitmap は描画意外にもステータスアイコンとしても利用できます。 (SetModeIcon) ファイル名のみ与えた場合、現在読み込んでいる script ファイルと同じ フォルダから画像を読み込みます。 ファイルの置き場所を固定する場合はフルパスで記述してください。 SIP 動作中に LoadBitmap で画像を読み直しても問題ありませんが、 存在しない画像を表示することがないよう注意してください。 ------------------------------------------------------------------------------- SetDisplayList [ ] ------------------------------------------------------------------------------- Arg dlid 登録する DisplayList 番号 (0〜31) Arg type 描画タイプ Arg x 描画先の座標 Arg y 描画先の座標 Arg w 描画先のサイズ Arg h 描画先のサイズ Arg bid 描画する画像の管理番号 (0〜7) Arg ix 転送元の座標 Arg iy 転送元の座標 Arg iw 転送元のサイズ Arg ih 転送元のサイズ Arg a alpha値 (または AC_SRC_ALPHA) 戻り値なし SIP の描画を行うためのコマンド(手順)を登録します。ウィンドウの再描画 時に、DisplayList の番号順に実行されます。引数の数は type によって異 なります。使用可能な描画タイプは下記の通り。 DLTYPE_OFF 何もしない (none) DLTYPE_COPY 画像転送 (x y w h bid ix iy) DLTYPE_REVERSE 画面反転 (x y w h) DLTYPE_STRETCH 画像転送 (x y w h bid ix iy iw ih) DLTYPE_ALPHA Alphaつき転送 DisplayList は現在最大 32個(0〜31)登録できますが、将来拡張される可能 性があります。 DLTYPE_ALPHA 時は alpha パラメータの指定が必要です。alpha に AC_SRC_ALPHA を指定した場合は、合成に bmp 画像の alpha チャンネルが 使われます。bmp 画像が 32bit でなく alpha 値を含んでいない場合は、 a に 0x00〜0xff の値を指定して透明度を指定できます。 v1.09 以前のバージョンでは bid に指定出来る番号は 0 のみとなっています。 v1.10 以降複数の bitmap リソースの描画が可能となっています。 ------------------------------------------------------------------------------- SetWindowDisplayList ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 Arg dstart 描画する DisplayList の開始番号 (0〜31) Arg dcount 描画する DisplayList の個数 戻り値なし ウィンドウの描画に使用する DisplayList を登録します。指定ウィンドウ の再描画時に、ここで指定した DisplayList が使われます。 メインパネルはウィンドウ番号 0 です。 例 SetWindowDisplayList WIN_MAIN 0 7 ------------------------------------------------------------------------------- DrawDisplayList ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 Arg dstart 描画する DisplayList の開始番号 (0〜31) Arg dcount 描画する DisplayList の個数 戻り値なし DisplayList の描画をすぐに実行します。DisplayList を登録しておくと ウィンドウの再描画時など必要な場合に呼ばれます。この命令は描画を即座 に実行し、更新を反映させる場合に使います。 例 DrawDisplayList WIN_MAIN 2 3 ------------------------------------------------------------------------------- SetEventTable [ ..] ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 Arg tableid テーブル 戻り値なし イベントを検索するテーブルを登録します。テーブルは最大 4つまで指定で きます。テーブルは指定した順番に判定されます。 例 SetEventTable WIN_MAIN ET_Current ET_Global ET_Default ------------------------------------------------------------------------------- SendVirtual ------------------------------------------------------------------------------- Arg vkey キーコード Arg keyflag キーフラグ 戻り値なし 仮想キーコードを送信し、実際のキー入力をシミュレートします。キーコー ドは VK_ で始まるシンボルです。キー操作はキーの押し下げ (DOWN) と キーを離した動作 (UP) の組み合わせになるので注意してください。 DOWN だけではキーが押しっぱなしになってしまいます。 キーフラグに指定できるシンボル KEYEVENTF_SLIENT 4 キークリック音なし KEYEVENTF_KEYDOWN 0 キーの押し下げ KEYEVENTF_KEYUP 2 キーの離し KEYEVENTF_SKEYDOWN 4 DOWN+キークリック音なし KEYEVENTF_SKEYUP 6 UP+キークリック音なし ------------------------------------------------------------------------------- SendChar ------------------------------------------------------------------------------- Arg vkey 仮想キーコード (0で省略) Arg shiftstate 同時に押されている修飾キー情報 Arg code 送信する文字コード (Unicode) 戻り値なし WM_CHAR を送信します。実際のキー入力を行います。 文字コードから直接キー入力とみなすことができます。入力した文字に相当 するキーを仮想キーコードで指定できます。 仮想キーコードは無くても(任意でも)文字入力できますが、キーボードとの 正確なマッピングができなくなります。そのため WM_KEYDOWN を使った判定 など、一部のアプリで、キーボードをシミュレートしたキー入力ができなく なる場合があります。 例えば特殊な記号入力専用など、文字入力専用のボタンを作る場合は、特に 実際のキーボードとのマッピングを気にしなくて大丈夫です。 なお直接 Unicode で文字コードを指定可能です。日本語、ロシア語など特 殊な文字も直接キーボードに割り付けることができます。 例 '$key' と入力します SendChar 0 0 '$' SendChar 0 0 'k' SendChar 0 0 'e' SendChar 0 0 'y' 例 'あ' を入力します。 SendChar 0 0 0x3042 shiftstate には下記の bit flag を指定できます。これらのフラグは合成 できますが、スクリプトでは or 演算の定数を記述できないため直接合成 した数値を記述する必要があります。そのためヘッダでは特にシンボルが 定義されていません。 KeyStateDownFlag 0x00000040 KeyStatePrevDownFlag 0x00000080 KeyShiftNoCharacterFlag 0x00010000 KeyShiftCapitalFlag 0x08000000 KeyShiftAnyAltFlag 0x10000000 KeyShiftAnyShiftFlag 0x20000000 KeyShiftAnyCtrlFlag 0x40000000 KeyShiftNumLockFlag 0x00001000 KeyShiftKanaFlag 0x00008000 KeyShiftRightWinFlag 0x00080000 KeyShiftLeftWinFlag 0x00800000 DOWN 時の例 KeyStateDownFlag UP 時の例 KeyStatePrevDownFlag + KeyShiftNoCharacterFlag ------------------------------------------------------------------------------- SendString ------------------------------------------------------------------------------- String string キー文字列送信 戻り値なし キー入力として文字列を渡すことができます。仮想キーコードを渡すことは できません。定型の文字入力だけ行いたい場合は便利です。0x00〜0x1f 等の 特殊な文字コードを指定する場合は SendChar を併用する必要があります。 例 SendString "Hello" v1.05 以降で Unicode に対応しました。スクリプトファイル自体を UTF-8 で記述することで、Unicode 文字の送信が可能です。日本語はもちろん、 ロシア語など特殊な文字をキーに割り振ることが可能です。 v1.04 以前で Unicode を使用する場合は SendChar を使ってください。 ------------------------------------------------------------------------------- PrintFormat [..] ------------------------------------------------------------------------------- String format フォーマット文字列 Arg arg 引数 戻り値なし デバッグ用に文字列をメッセージ表示します。format には C言語の printf 相当のフォーマット文字列が使えます。 この命令は MessageBox を開きます。MessageBox が開いている間のイベント 実行順番は保障されないので注意してください。この命令を挟んだことに よって、予期せぬエラーが出ることがあります。 将来仕様が変わる可能性があります。 この命令はまだ UTF-8 に未対応です。将来 UTF-8 へ変更予定です。 ------------------------------------------------------------------------------- OpenWindow ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 Arg x ウィンドウ位置 Arg y ウィンドウ位置 Arg w ウィンドウサイズ Arg h ウィンドウサイズ 戻り値なし ウィンドウを開きます。ウィンドウ番号 0 は標準の入力パネルです。 標準パネルはシステム側でリサイズされるので特にサイズを与える必要は ありません。 すでに同じ番号でウィンドウが開いているときにこの命令を呼び出すと、 ウィンドウを閉じてから開きなおします。 SetWindowDisplayList で DisplayList を割り当てなければ何も描画されま せん。またイベントを発生させるためには SetEventTable が必要です。 ウィンドウ番号は 0〜7 まで指定することができます。 ------------------------------------------------------------------------------- CloseWindow ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 戻り値なし ウィンドウを閉じます。すでに閉じている場合は何もしません。 0 を指定すると、メインパネルを閉じることもできてしまうので注意して ください。 ------------------------------------------------------------------------------- MoveWindow ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 Arg x ウィンドウ位置 Arg y ウィンドウ位置 戻り値なし ウィンドウの位置を変更します。 ------------------------------------------------------------------------------- ResizeWindow ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 Arg w ウィンドウサイズ Arg h ウィンドウサイズ 戻り値なし ウィンドウのサイズを変更します。 ------------------------------------------------------------------------------- GetScreenPos ------------------------------------------------------------------------------- Arg wid ウィンドウ番号 Arg x 変換元座標 Arg y 変換元座標 戻り値 $GW_RETVAL0 変換後の x $GW_RETVAL1 変換後の y ウィンドウのローカル座標をスクリーン座標に変換します。メインパネルを タッチした座標から、サブウィンドウを開く位置を求める場合などに使い ます。 結果は $GW_RETVAL0, $GW_RETVAL1 に返ります。 ------------------------------------------------------------------------------- GetScreenSize ------------------------------------------------------------------------------- 戻り値 $GW_RETVAL0 width $GW_RETVAL1 height デバイスの画面サイズを取得します。結果は width, height が $GW_RETVAL0, $GW_RETVAL1 に入ります。 ------------------------------------------------------------------------------- SetScale ------------------------------------------------------------------------------- Arg sx スケール (default 256 = 1.0) Arg sy スケール (default 256 = 1.0) 戻り値なし 座標系にスケール補正を行います。VGA to QVGA または VGA to QVA の変換を 行うことができます。 256 が 1.0 倍に相当します。1/2 にする場合は 128 を、2倍にする場合は 512 を与えてください。 GetScreenSize の結果を元に適切なスケールを与えることで、QVGA/VGA の 区別無く、スクリプト内部では固定の座標系と思って記述することができ ます。 なおスケールを指定すると画像の表示もそれにあわせて拡大・縮小が行われ ます。イメージの等倍表示よりは品質も速度も下がる可能性があります。 後述する SetImageScale を使うことにより、読み込み画像のスケールを 個別に設定することができます。 ------------------------------------------------------------------------------- SetImageScale ------------------------------------------------------------------------------- Arg sx スケール (default 256 = 1.0) Arg sy スケール (default 256 = 1.0) 戻り値なし 転送元画像に対する座標指定に対してスケール補正を行います。 例えば 512 (2.0倍) に設定しておくと、DisplayList で (12,64) の位置から 32x32 ピクセル分読むように指定しても、実際には (24,128) の位置から 64x46 ピクセル分読み出します。 画像データを共有して拡大縮小する場合は特に指定する必要はありません。 QVGA 座標系で作成した script をそのまま流用して、画像データだけ VGA 専用に高解像度に使用したい場合に使います。逆に、VGA 用に作ったス クリプトで QVGA 用の専用 bitmap を用いる場合にも使えます。 ------------------------------------------------------------------------------- SetTimer