機能: | 画面解像度を取得します。 | ||
構文: | ArxQueryScreenSize() |
この関数は、X方向/Y方向の値が、1スペース区切りで繋がった文字列を戻します。
例: | ||
PARSE VALUE ArxQueryScreenSize() WITH cx cy | ||
/* 変数 cx にX方向の、cy にY方向の値が入る */ |
機能: | ウィンドウの情報を取得します。 | ||
構文: | rc = ArxQueryWindowInfo( type , stem ) | ||
type | ··· | 取得対象ウィンドウ | |
stem | ··· | 情報が入る変数(ステム)の名前 |
「取得対象ウィンドウ」には、大きく分けて2種類の指定方法があります。
1つの方法は、(REXX スクリプトが呼び出された際にアクティブになっている)メイン・ウィンドウを基準とした間接的な指定です。
「ID:」という頭の文字列に続いて、以下の文字列の何れかか、アクティブ・ウィンドウ(メイン・ウィンドウ)直下の子ウィンドウのID値を追記します。
SYSMENU ··· システムメニュー・ウィンドウ TITLEBAR ··· タイトルバー・ウィンドウ MINMAX ··· 最大化/最小化ボタン・ウィンドウ MENU ··· メニュー・ウィンドウ VERTSCROLL ··· 縦スクロールバー・ウィンドウ HORZSCROLL ··· 横スクロールバー・ウィンドウ CLIENT ··· クライアント・ウィンドウ
注: |
ArxQueryWindowInfo を他のセッションから呼び出す場合、
この 「ID:」による指定は行えません。 |
もう1つの方法は、ウィンドウ・ハンドル値の直接指定です。
「HWND:」という頭の文字列に続いて、以下の文字列の何れかか、ウィンドウ・ハンドル値を追記します。
HERE ··· REXX スクリプトを呼び出したウィンドウ MAIN ··· メイン・ウィンドウ CURRENTFRAME ··· フレーム・ウィンドウ PARENT ··· フレーム・ウィンドウ(もしくはメイン・ウィンドウ)の親ウィンドウ FOCUS ··· フォーカス・ウィンドウ ACTIVE ··· アクティブ・ウィンドウ DESKTOP ··· デスクトップ・ウィンドウ
注: |
ArxQueryWindowInfo を他のセッションから呼び出す場合、「FOCUS」「ACTIVE」「DESKTOP」のみ指定可能です。 |
注: |
「DESKTOP」以外の文字列は、頭の文字列が 「HWND:」ではなく 「ID:」でも、正常に動作します(旧バージョンとの互換性維持のため)。 |
頭の文字列 「ID:」「HWND:」は省略可能です。
省略された場合、指定された数値(または文字列)から、ウィンドウ・IDの値か、ウィンドウ・ハンドルの値のどちらとして取り扱うか、自動判別を行います。
(数値指定の場合、1 以上且つ 65536 未満でウィンドウ・IDの値、65536 以上でウィンドウ・ハンドルの値だと見なす)
※ |
例外として、ウィンドウ・IDの値 0 を引数として指定する場合に限り、頭の文字列 「ID:」を必ず明記する必要があります。 |
なお、上記の仕様に矛盾する引数指定(例えば、頭の文字列 「ID:」を指定しながら、
ウィンドウ・ハンドル値に相当する値(65536以上)を指定した場合など)を行った場合、
関数は何も処理を行わず、0 を返します。
(解析できない不正な文字列を指定した場合は、エラーになる)
メイン・ウィンドウとフレーム・ウィンドウの違いは、前者は、ウィンドウ階層上で、
デスクトップ・ウィンドウ直下にあたるウィンドウの事を指し、後者は、
フォーカス・ウィンドウからウィンドウ階層を遡り、最初にたどり着いたフレーム・ウィンドウの事を指します。
後者の場合、多重のフレーム・ウィンドウから構成されるアプリケーション(例えば、オンラインヘルプの VIEW.EXE や、
WorkplaceShell の各種設定ノートブック)において、フォーカスが当たっている最も内側のフレームを、
処理対象に指定する事が可能です。
(因みに、唯一のフレーム・ウィンドウから構成される(シンプルな)アプリケーションの場合、
双方が戻す値は同一になります)
なお、フレーム・ウィンドウ指定時に、そのウィンドウ階層上でフレーム属性を持つウィンドウが存在しない場合
(例えば WarpCenter)は、ArxQueryWindowInfo呼び出しは失敗に終わります(戻り値=0)。
REXX スクリプトが「ウィンドウ制御:REXXマクロ」の機能から呼び出されている場合、
「取得対象ウィンドウ」に、フォーカス・ウィンドウ(FOCUS)を指定できない可能性があります(戻り値=0)。
例えば、「WM_ACTIVATE(TRUE)」がトリガである場合、アクティブ・ウィンドウが切り替わったばかりで、
そのウィンドウの何処にフォーカスが当たるのか、まだ決定していない(つまり、フォーカスウィンドウが存在しない)、
などが考えられます。
関数が正常に終了すると、変数 stem に、以下の値が設定されます。
stem.HWND ··· ウィンドウ・ハンドル(32bit 16進数) stem.X ··· X座標(親ウィンドウからの相対位置) stem.Y ··· Y座標(同上) stem.GX ··· X座標(画面上での絶対位置) stem.GY ··· Y座標(同上) stem.CX ··· X方向サイズ stem.CY ··· Y方向サイズ stem.FL ··· ウィンドウ・フラグ(32bit 16進数) stem.ID ··· ウィンドウ・IDの値(32bit 16進数) stem.STYLE ··· ウィンドウ・スタイル(32bit 16進数) stem.TITLE ··· タイトルバー文字列 stem.CLASS ··· ウィンドウ・クラス名 stem.MODULE ··· ウィンドウ作成者(実行ファイル名) stem.PID ··· 同上 (プロセスID) stem.TID ··· 同上 (スレッドID)
ウィンドウ・フラグ及びウィンドウ・スタイルは、PM アプリケーション開発に精通されている方のために用意してあります。
(FL は構造体 SWP のメンバ fl の値)
(STYLE は PM-API の WinQueryWindowULong(hwnd,QWL_STYLE) の戻り値)
タイトルバー文字列は、そのウィンドウにタイトルバーが存在する場合のみ設定されます。
(その他の場合は、長さ 0 の文字列になる)
また、他のセッションから呼び出す場合、
タイトルバー文字列を取得するためには、あらかじめ ALWALTFX を実行させておく必要があります。
(設定状態は問いません。「全機能休止」の状態でも構わない)
クラス名は、そのウィンドウの種類の分別するのに役立ちます。
例えば、PM 標準コントロール(部品)のクラス名は、以下の通りです。
#1 ··· フレーム #2 ··· コンボボックス #3 ··· ボタン #4 ··· メニュー #5 ··· 静的制御 #6 ··· Single Line 入力フィールド #7 ··· リストボックス #8 ··· スクロールバー #9 ··· タイトルバー #10 ··· Multi Line 入力フィールド(MLE) #32 ··· スピンボタン #37 ··· コンテナー #38 ··· スライダー #39 ··· バリューセット #40 ··· ノートブック
ウィンドウ作成者(実行ファイル名)は、そのウィンドウが、
REXX スクリプトを呼び出したウィンドウと同一プロセスの場合のみ、文字列が設定されます。
(別プロセス/別セッションの場合は、長さ 0 の文字列になる)
例: | ||
CALL ArxQueryWindowInfo 'FOCUS','info' | ||
IF info.CLASS='#6' | info.CLASS='#10' THEN DO | ||
/* 以下、入力フィールドにフォーカスが当たっている場合のみ処理を続行 */ |
機能: | ウィンドウ位置及びサイズの設定を行います。 | ||
構文: | rc = ArxSetWindowPos( type , x , y , cx , cy , z ) | ||
type | ··· | 設定対象ウィンドウ | |
x | ··· | X座標(省略可) | |
y | ··· | Y座標(省略可) | |
cx | ··· | X方向サイズ(省略可) | |
cy | ··· | Y方向サイズ(省略可) | |
z | ··· | Z順配列位置(省略可) |
「設定対象ウィンドウ」の指定法は、前述 ArxQueryWindowInfo と同じです。
「Z順配列位置」には、以下の文字列の何れかを指定します。
TOP ··· 最前列にウィンドウを移動する BOTTOM ··· 最後列にウィンドウを移動する
引数を省略した場合は、現在の位置及びサイズを保持します。
なお、PM-API の WinSetWindowPos() とは、引数の順番が異なるので、PM プログラマの方は注意して下さい。
あと、PM における座標指定は、左下が原点なので、左上が原点である MS-Windows のプログラマの方は、注意して下さい。
例: | |||
CALL ArxSetWindowPos 'MAIN',0,0,640,480 | /* VGA 画面一杯の位置へウィンドウを移動する */ | ||
CALL ArxSetWindowPos 'MAIN',,,,,'BOTTOM' | /* 最後列へウィンドウを移動する */ |
機能: | ウィンドウの文字列の取得/設定を行います。 | ||
構文: | rc = ArxQueryWindowString( type , name ) | ||
rc = ArxSetWindowString( type , string ) | |||
type | ··· | 取得/設定対象ウィンドウ | |
name | ··· | 文字列が入る変数の名前 | |
string | ··· | 設定する文字列 |
「取得/設定対象ウィンドウ」の指定法は、前述 ArxQueryWindowInfo と同じです。
これらの関数を他のセッションから呼び出す場合、
あらかじめ ALWALTFX を実行させておく必要があります。
(設定状態は問いません。「全機能休止」の状態でも構わない)
例: | ||
CALL ArxQueryWindowString 'TITLEBAR','str' | ||
/* 変数 str にタイトルバー・ウィンドウの文字列を取得する */ | ||
CALL ArxSetWindowString 'FOCUS','' | ||
/* フォーカス・ウィンドウの文字列をクリアする */ |
機能: | ウィンドウの再描画を行います。 | ||
構文: | rc = ArxInvalidateRect( type ) | ||
type | ··· | 再描画対象ウィンドウ(省略可) |
「再描画対象ウィンドウ」の指定法は、前述 ArxQueryWindowInfo と同じです。
省略された場合は、現行のアクティブ・ウィンドウのみを再描画します。
例: | ||
CALL ArxInvalidateRect 'DESKTOP' | /* デスクトップを再描画する */ |
機能: | ウィンドウ・ハンドル値を取得します。 | ||
構文: | rc = ArxQueryWindowHandle( qrywin , ... ) | ||
rc = ArxQueryWindowHandle( 'POINT' , x , y ) | |||
qrywin | ··· | 取得対象ウィンドウ(複数指定可) | |
x | ··· | X座標(省略可) | |
y | ··· | Y座標(省略可) |
この関数は、引数に指定された条件に合致するウィンドウが存在すれば、
そのハンドル値(32bit 16進数)を戻します。
(該当するウィンドウが存在しない場合、「H00000000」を戻す)
「取得対象ウィンドウ」の指定法は、前述 ArxQueryWindowInfo と同じです。
「取得対象ウィンドウ」を連ねて指定すると、最初に指定された引数に合致するウィンドウを基準にして、
次々と引数に指定されたウィンドウを検索していきます。
また、連ねて指定する「取得対象ウィンドウ」の指定には、前述 ArxQueryWindowInfo と同様の指定以外に、
PM-API である WinQueryWindow() の引数のシンボルの頭部(QW_)を除いた文字列も指定可能です。
1つめの引数に、文字列「POINT」が指定されると、スクリーン上の特定の座標(座標指定が省略された場合は、マウスカーソル位置)下のウィンドウ・ハンドル値を返します。
また、他のセッションからの呼び出しで「POINT」指定を使う場合、あらかじめ ALWALTFX を実行させておく必要があります。
(設定状態は問いません。「全機能休止」の状態でも構わない)
※ |
そのウィンドウが、マウスボタン入力に対して「透過」の指定が成されている場合、そのウィンドウの下(後ろ)のウィンドウ・ハンドル値を返します。 |
例: | ||
hwparent = ArxQueryWindowHandle('HWND:H80001234','PARENT') | ||
/* ハンドル 80001234 のウィンドウの親ウィンドウ */ | ||
hwgparent = ArxQueryWindowHandle('HERE','PARENT','PARENT') | ||
/* REXX スクリプト呼び出しウィンドウの、親ウィンドウの親ウィンドウ */ | ||
hwpointer = ArxQueryWindowHandle('POINT') | ||
/* マウスカーソル位置の直下のウィンドウ */ |
機能: | 子ウィンドウ・ハンドル値を取得します。 | ||
構文: | rc = ArxEnumWindowHandle( parent , stem ) | ||
parent | ··· | 取得対象親ウィンドウ | |
stem | ··· | 情報が入る変数(ステム)の名前 |
「取得対象親ウィンドウ」の指定法は、前述 ArxQueryWindowInfo と同じです。
関数が正常に終了すると、変数 stem.0 に子ウィンドウの数が、
以降 stem.1、stem.2、stem.3 ...に、全ての子ウィンドウ・ハンドル値(32bit 16進数)が設定されます。
例: | ||
CALL ArxEnumWindowHandle 'MAIN','enum' | ||
/* メイン・ウィンドウの子ウィンドウ・ハンドルを取得 */ | ||
CALL ArxEnumWindowHandle 'DESKTOP','enum' | ||
/* デスクトップ・ウィンドウの子ウィンドウ・ハンドルを取得 */ |
機能: | 指定されたウィンドウが存在するかをチェックします。 | ||
構文: | rc = ArxIsWindow( type ) | ||
type | ··· | 調査対象ウィンドウ |
「調査対象ウィンドウ」の指定法は、前述 ArxQueryWindowInfo と同じです。
この関数は、指定されたウィンドウが存在すると 1 を、存在しないか、
引数に不正な文字列(または数値)の指定を行うと 0 を返します。
(引数の個数(必ず1つ)の誤りは、他の関数と同様にエラーになります)
例: | ||
exist = ArxIsWindow(ArxQueryWindowHandle('MAIN','ID:123')) | ||
/* メイン・ウィンドウの、IDの値が 123 の子ウィンドウの存在をチェック */ | ||
IF ArxIsWindow('MENU') THEN DO | ||
/* 以下、メニュー・ウィンドウが存在する場合のみ処理続行 */ |