Windows 構造体

 
 
 

Windows 構造体は、Windows OS のユーザ インタフェース要素にアクセスするためのメソッドを提供します。

これらのメソッドは、3ds Max 2008 以降で使用可能です。

従来、Avguard 拡張機能として提供されていた機能です。

   

windows.getMAXHWND()

このメソッドは、3ds Max メイン ウィンドウの HWND を整数(Pointer 値)で返します。

   

windows.getDesktopHWND()

このメソッドは、MS Windows デスクトップの HWND を整数(Pointer 値)で返します。

   

windows.sendMessage <int HWND> <int message> <int messageParameter1> <int messageParameter2>

最初の引数で指定された HWND に Win32 メッセージを送信します。

2 番目の引数はメッセージ ID です。通常は 16 進数で指定します。

3 番目と 4 番目の引数はメッセージのパラメータです。パラメータを指定しない場合は、プレースホルダとして 0 を渡します。

   

windows.postMessage <int HWND> <int message> <int messageParameter1> <int messageParameter2> 

引数の値を渡しながら、Windows の PostMessage 関数を呼び出します。

3ds Max 2011 以降 で使用可能です。

   

windows.processPostedMessages()

Windows の保留中のメッセージを取得して 3ds Max に送信するメッセージ ポンプを実行します。

このメソッドを呼び出すと、保留されているメッセージがすべて処理されます。これを MAXScript ループ内部で使用すると、時間のかかる計算によって 3ds Max の応答がなくなる場合に Windows 7で発生する「ホワイト スクリーン」を防ぐことができます。

3ds Max 2011 以降 で使用可能です。

   

windows.getChildrenHWND {<int_HWND>|#max} parent:{<int_HWND>| #max}

このメソッドは、指定された HWND の再帰的な子ウィンドウの配列を返します。

指定された HWND が 0 である場合は、 (再帰的にではなく) 最上位のデスクトップ ウィンドウのみを返します。

親 HWND が指定されている場合は、直接の親が指定されたウィンドウであるウィンドウのみを返します。

HWND として #max が指定されている場合は、3ds Max メイン ウィンドウに関連付けられている HWND が使用されます。

指定された HWND が存在しない場合は、 undefined 値が返されます。

それ以外の場合は、配列が返されます。

配列の各要素はウィンドウに対応し、8 要素の配列が含まれます(3ds Max 2008 では最初の 5 要素のみ)。

これらの配列の各要素は、ウィンドウに関する次の情報を表します。

1: HWND

2: 親の HWND。所有者は除く(GetAncestor(hWnd,GA_PARENT))

3: 親または所有者の HWND。子のウィンドウの場合、戻り値は親のウィンドウのハンドル。最上位のウィンドウの場合、戻り値は所有者のウィンドウのハンドル。(GetParent(hWnd))

4: クラス名の文字列(GetClassName(hWnd, className, bufSize)) - 最大 255 文字

5: ウィンドウ テキストの文字列(GetWindowText(hWnd, windowText, bufSize)) - 最大 255 文字

6: 所有者の HWND (GetWindow(hWnd,GW_OWNER))

7: ルート ウィンドウの HWND。親のウィンドウを順番にたどって特定されるルート ウィンドウ(GetAncestor(hWnd,GA_ROOT))

8: 所有ルート ウィンドウの HWND。GetParent で返される親および所有者のウィンドウを順番にたどって特定される所有ルート ウィンドウ(GetAncestor(hWnd,GA_ROOTOWNER))

例: 次の呼び出しの結果の一部

print (windows.getChildrenHWND #max)

次のようになります。

...
#(16990604P, 25827408P, 25827408P, "#32770", "Main Toolbar", 25827408P, 25827408P, 25827408P)
#(2048768P, 16990604P, 16990604P, "CustToolbar", "", 0P, 25827408P, 25827408P)
#(8794706P, 2048768P, 2048768P, "CustSeparator", "", 0P, 25827408P, 25827408P)
#(33762226P, 2048768P, 2048768P, "CustButton", "", 0P, 25827408P, 25827408P)
#(34615562P, 2048768P, 2048768P, "CustButton", "", 0P, 25827408P, 25827408P)
#(999632P, 2048768P, 2048768P, "CustButton", "", 0P, 25827408P, 25827408P)
#(5908980P, 2048768P, 2048768P, "CustSeparator", "", 0P, 25827408P, 25827408P)
#(19083138P, 2048768P, 2048768P, "ComboBox", "All", 0P, 25827408P, 25827408P)
...

この場合、3ds Max のメイン ツールバーは HWND が 16990604 であるドッキングされたウィンドウであり、3ds Max メイン ウィンドウの HWND は 25827408 であり、メイン ツールバーのクラス名は「#32770」であり、ツールバーのウィンドウ テキストは「Main Toolbar」であることが分かります。また、要素 6、7、8 から、所有者およびルートは HWND が 25827408 の 3ds Max ウィンドウです。

次の要素はツールバー ウィンドウ自体であり、HWND は 2048768、親は HWND が 16990604 であるメイン ツールバー ウィンドウです。ツールバーのクラスは「CustToolbar」であり、テキストは表示されていません。所有者のウィンドウはなく(そのため HWND は 0)、ルートは HWND が 25827408 の 3ds Max ウィンドウです。

次の要素は、ツールバーの最初のセパレータです。HWND は 8794706 で、親は HWND が 2048768 であるカスタム ツールバーです。クラスは「CustSeparator」で、テキストは関連付けられていません。所有者はなく、ルートは 3ds Max ウィンドウです。

その後の要素はメイン ツールバーの最初のアイコンで、HWND は 33762226 です。親は上記と同じ HWND が 2048768 のカスタム ツールバーです。クラスは「CustButton」で、テキストはありません。所有者はなく、ルートは 3ds Max ウィンドウです。

以下、ボタンとセパレータが続いています。HWND が 19083138P の要素は[選択フィルタ](Selection Filter)コンボ ボックスで、既定値で[すべて](All)と表示されるようになっています。

windows.getChildHWND {<int_HWND>| #max} <string> parent:{<int_HWND>|#max}

このメソッドは、指定された HWND を親とし、特定のウィンドウ テキストを持った子ウィンドウを返します。子ウィンドウは再帰的に検索されます。

指定された HWND が 0 である場合は、(再帰的にではなく) 最上位のデスクトップ ウィンドウのみを返します。

親 HWND が指定されている場合は、直接の親が指定されたウィンドウであるウィンドウのみを検索します。

HWND として #max が指定されている場合は、3ds Max メイン ウィンドウに関連付けられている HWND が使用されます。

指定された HWND が存在しない場合は、 undefined 値が返されます。

指定されたテキストを持った子ウィンドウが見つからない場合は、 undefined が返されます。

テキストの検索では、大文字と小文字は区別されます

マッチするものが見つかると、8 要素の配列が返されます。要素の意味の詳細については、上記の windows.getChildrenHWND() メソッドの説明を参照してください。

例: 次の呼び出しの結果の一部

max file xref object -- open xref object dialog
xro_hwnd = windows.getChildHWND 0 "XRef Objects" parent:#max -- find xref object dialog
if xro_hwnd != undefined do windows.sendMessage xro_hwnd[1] 0x0010 0 0 -- if found, send close message
max file xref scene -- open xref sceen dialog
xrs_hwnd = windows.getChildHWND 0 "XRef Scenes" parent:#max -- find xref scene dialog
if xrs_hwnd != undefined do windows.sendMessage xrs_hwnd[1] 0x0010 0 0 -- if found, send close message 

リスナー出力:

OK
#(25961156P, 65552P, 25827408P, "#32770", "XRef Objects", 25827408P, 25961156P, 25827408P)
1
OK
#(26813124P, 65552P, 25827408P, "#32770", "XRef Scenes", 25827408P, 26813124P, 25827408P)
1

   

windows.getHWNDData {<int_HWND>|#max}

指定された HWND に関連するデータを返します。

HWND として #max が指定されている場合は、3ds Max メイン ウィンドウに関連付けられている HWND が使用されます。

指定された HWND が存在しない場合は、undefined 値が返されます。

マッチするものが見つかると、8 要素の配列が返されます。要素の意味の詳細については、上記の windows.getChildrenHWND() メソッドの説明を参照してください。

3ds Max 2011 以降 で使用可能です。

   

windows.addChild <int_HWND> <int_HWND>

最初の引数として渡された HWND を持つ ActiveX コントロールを、2 番目の引数として渡された HWND を持つウィンドウの子にします。

最初の引数に MAXScript のコントロールやロールアウトを指定することはできません。必ず ActiveX コントロールを指定する必要があります。

3ds Max 9 以降廃止されたと見なされる ActiveX コントロールを指定した場合、このメソッドも廃止と見なされることがあります。

   

3ds Max 2011 以降では、ロールアウトやロールアウト コントロールで読み取り専用の .hwnd プロパティが公開されることに注意してください。

ロールアウトの場合は、このプロパティに、そのロールアウトに関連付けられたウィンドウの HWND が格納されます。ロールアウトが開いていない場合は 0 になります。

ロールアウト ユーザ インタフェース コントロールの場合は、そのロールアウトを含むロールアウトのウィンドウの HWND の配列が格納されます。ロールアウトが開いていない場合は空の配列になります。