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 以降で使用可能です。
3ds Max 2011 以降では、ロールアウトやロールアウト コントロールで読み取り専用の .hwnd
プロパティが公開されることに注意してください。
ロールアウトの場合は、このプロパティに、そのロールアウトに関連付けられたウィンドウの HWND が格納されます。ロールアウトが開いていない場合は 0 になります。
ロールアウト ユーザ インタフェース コントロールの場合は、そのロールアウトを含むロールアウトのウィンドウの HWND が格納されます。ロールアウトが開いていない場合は空の配列になります。
windows.setWindowPos <int HWND> <int x> <int y> <int width> <int height> <bool repaint> [ applyUIScaling:<true> ]
]
HWND によって指定されたウィンドウの位置を、2 番目と 3 番目の引数によって指定された X および Y 座標に設定します。
また、ウィンドウの幅および高さを 4 番目と 5 番目の引数として渡された値に設定します。
6 番目の引数を True に設定すると、そのウィンドウも再描画されます。
applyUIScaling
パラメータは、高 DPI ディスプレイで必要なスケールを適用するかどうかを示します。
3ds Max 2014 以降で使用可能です。
windows.setWindowPos <int HWND> <Box2 rect> <bool repaint> [ applyUIScaling:<true> ]
HWND によって指定されたウィンドウの位置を、2 番目の Box2 引数によって与えられた座標およびサイズに設定します。
3 番目の引数を True に設定すると、そのウィンドウも再描画されます。
applyUIScaling
パラメータは、true に設定されている場合、HDPI ディスプレイに必要なすべてのスケールを適用します。
3ds Max 2014 以降で使用可能です。
<Box2 rect>windows.getWindowPos <int HWND> [ removeUIScaling:<true> ]
HWND 引数によって指定されたウィンドウの左上隅の位置、および幅と高さを返します。
位置は、画面の左上隅からの相対的な画面座標で表現されます。
removeUIScaling
パラメータは、true に設定されている場合、HDPI ディスプレイに適用されているすべてのスケールを削除します。
3ds Max 2014 以降で使用可能です。
例:
rollout test1 "Test" ( button btn "PRESS ME" ) --a test rollout createDialog test1 200 50 120 140 --rollout, width, height, x, y windows.getWindowPos test1.hwnd --get the resulting position and size
リスナー出力:
Rollout:test1 true (Box2 120 140 206 75) --Note that the width and height include the borders and the title bar --and can vary depending on the Windows Theme used.
移動してサイズを変更してみましょう:
windows.setWindowPos test1.hwnd 220 240 206 55 true
<int HWND> getCapture()
3ds Max 2022.2 Update の新機能: 現在マウスをキャプチャしているウィンドウの HWND を返します。詳細については winuser.h GetCapture 関数を参照してください。
<Point2>windows.clientToScreen <int HWND> <int x> <int y> [ applyUIScaling:<true> ]
<Point2>windows.clientToScreen <int HWND> <Point2 clientCoord> [ applyUIScaling:<true> ]
座標を、最初の引数によって指定されたウィンドウのクライアント領域から、画面の左上隅からの相対座標に変換します。
applyUIScaling
パラメータは、true に設定されている場合、HDPI ディスプレイに必要なすべてのスケールを適用します。
3ds Max 2014 以降で使用可能です。
<Point2>windows.screenToClient <int HWND> <int x> <int y> [ applyUIScaling:<true> ]
<Point2>windows.screenToClient <int HWND> <Point2 screenCoord> [ applyUIScaling:<true>]
座標を、左上隅を基準にした画面領域から、最初の引数によって指定されたウィンドウのクライアント領域に変換します。
applyUIScaling
パラメータは、true に設定されている場合、HDPI ディスプレイに必要なすべてのスケールを適用します。
3ds Max 2014 以降で使用可能です。
例:
tv = trackviews.getTrackView 1 --><MixinInterface:TrackView> windows.getWindowPos tv.ui.hwnd -->(Box2 244 242 1200 400) screenPos = windows.clientToScreen tv.ui.hwnd 10 20 -->[262,312] windows.screenToClient tv.ui.hwnd screenPos.x screenPos.y -->[10,20] windows.getWindowPos tv.ui.hwnd -->(Box2 244 242 1200 400) windows.setWindowPos tv.ui.hwnd 0 0 1200 400 -->true
windows.snapshot {<int_HWND>|#max} captureAlpha:<boolean> gammaCorrect:<boolean> captureScreenPixels:<boolean>
指定された HWND のビットマップ スナップショットを作成します。
指定された HWND が 0 の場合、Windows デスクトップのスナップ ショットが取得されます。
引数が #max
に設定されている場合は、3ds Max メイン ウィンドウに関連付けられている HWND が使用されます。
captureAlpha:
オプション キーワード引数が指定され、True に設定されている場合、ビューポートアルファもキャプチャされます。指定されないまたは False に設定された場合、返されたイメージには、アルファおよび RGB チャンネルのみが含まれます。
gammaCorrect:
オプション キーワード引数が指定されないまたは True に設定されている場合、ガンマ補正が返されたビットマップ値に対して実行されます。False に設定した場合は、ガンマ補正は実行されません。
captureScreenPixels:
オプションキーワード引数が True に設定されている場合、ウィンドウのデスクトップ ピクセルが指定したウィンドウの領域内にキャプチャされます。
3ds Max 2015 以降で使用可能です。
例:
--Get a snapshot of the Windows Desktop: ssBitmap1 = windows.snapshot 0 display ssBitmap1 caption:"Desktop Snapshot" --Get a snapshot of the 3ds Max Main Window without gamma correction: ssBitmap2 = windows.snapshot #max gammaCorrect:False display ssBitmap2 caption:"3ds Max Main Window" --Get a snapshot of the active viewport: ssBitmap3 = windows.snapshot (viewport.getHWnd()) display ssBitmap3 caption:"Active Viewport"
「Viewport.GetViewportDib()」および「gw.getViewportDib()」も参照してください。
windows.addChild <int_HWND> <int_HWND>
最初の引数として渡された HWND を持つ ActiveX コントロールを、2 番目の引数として渡された HWND を持つウィンドウの子にします。
最初の引数に MAXScript のコントロールやロールアウトを指定することはできません。必ず ActiveX コントロールを指定する必要があります。
ActiveX コントロールは 3ds Max 9 以降では廃止されたと見なされることから、このメソッドも廃止と見なされることがあります。