Windows 構造体は、Windows OS のユーザ インタフェース要素にアクセスするためのメソッドを提供します。
特に指定のない限り、これらのメソッドは、3ds Max 2008 以降で使用可能です。
3ds Max 2024 の新機能: HWND 引数を使用して操作対象となるウィンドウを指定する関数では、代わりに RolloutFloater、Rollout、または
#max
という名前(3ds Max メイン ウィンドウを指定する名前)を使用できます。これらの関数の概要の最新版を次に示します。
従来、Avguard 拡張機能として提供されていた機能です。
windows.getMAXHWND()
このメソッドは、3ds Max メイン ウィンドウの HWND を整数(Pointer 値)で返します。
windows.getDesktopHWND()
このメソッドは、MS Windows デスクトップの HWND を整数(Pointer 値)で返します。
windows.sendMessage {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <int message> <int messageParameter1> <int messageParameter2>
最初の引数で指定された HWND、RolloutFloater、Rollout、または 3ds Max のメイン ウィンドウに Win32 メッセージを送信します。
2 番目の引数はメッセージ ID です。通常は 16 進数で指定します。
3 番目と 4 番目の引数はメッセージのパラメータです。パラメータを指定しない場合は、プレースホルダとして 0 を渡します。
windows.postMessage {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <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 {<RolloutFloater>|<Rollout>|<int_HWND>|#max} parent:{<RolloutFloater>|<Rollout>|<int_HWND>|#max}
このメソッドは、指定された HWND、RolloutFloater、Rollout、または 3ds Max メイン ウィンドウの子ウィンドウの配列を再帰的に返します。
指定された 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 {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <string> parent:{<RolloutFloater>|<Rollout>|<int_HWND>|#max}
このメソッドは、指定された HWND、RolloutFloater、Rollout、または 3ds Max を親とし、特定のウィンドウ テキストを持った子ウィンドウを返します。子ウィンドウは再帰的に検索されます。
指定された 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 {<RolloutFloater>|<Rollout>|<int_HWND>|#max}
指定された HWND、RolloutFloater、Rollout、または 3ds Max メイン ウィンドウに関連付けられたデータを返します。
HWND として #max
が指定されている場合は、3ds Max メイン ウィンドウに関連付けられている HWND が使用されます。
指定された HWND が存在しない場合は、undefined 値が返されます。
マッチするものが見つかると、8 要素の配列が返されます。要素の意味の詳細については、上記の windows.getChildrenHWND()
メソッドの説明を参照してください。
3ds Max 2011 以降で使用可能です。
3ds Max 2011 以降では、ロールアウトやロールアウト コントロールで読み取り専用の .hwnd
プロパティが公開されることに注意してください。
ロールアウトの場合は、このプロパティに、そのロールアウトに関連付けられたウィンドウの HWND が格納されます。ロールアウトが開いていない場合は 0 になります。
ロールアウト ユーザ インタフェース コントロールの場合は、そのロールアウトを含むロールアウトのウィンドウの HWND が格納されます。ロールアウトが開いていない場合は空の配列になります。
windows.setWindowPos {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <int x> <int y> <int width> <int height> <bool repaint> [ applyUIScaling:<true> ]
HWND、RolloutFloater、Rollout、または 3ds Max メイン ウィンドウで指定されたウィンドウの位置を、2 番目と 3 番目の引数で指定された X 座標と Y 座標に設定します。
また、ウィンドウの幅および高さを 4 番目と 5 番目の引数として渡された値に設定します。
6 番目の引数を True に設定すると、そのウィンドウも再描画されます。
applyUIScaling
パラメータは、高 DPI ディスプレイで必要なスケールを適用するかどうかを示します。
3ds Max 2014 以降で使用可能です。
windows.setWindowPos {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <Box2 rect> <bool repaint> [ applyUIScaling:<true> ]
HWND、RolloutFloater、Rollout、または 3ds Max メイン ウィンドウで指定されたウィンドウの位置を、2 番目の Box2 引数で指定された座標とサイズに設定します。
3 番目の引数を True に設定すると、そのウィンドウも再描画されます。
applyUIScaling
パラメータは、true に設定されている場合、HDPI ディスプレイに必要なすべてのスケールを適用します。
3ds Max 2014 以降で使用可能です。
<Box2 rect>windows.getWindowPos {<RolloutFloater>|<Rollout>|<int_HWND>|#max} [ removeUIScaling:<true> ]
HWND、RolloutFloater、Rollout、または 3ds Max メインウィンドウ引数によって指定されたウィンドウの左上隅の位置、および幅と高さを返します。
位置は、画面の左上隅からの相対的な画面座標で表現されます。
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()
現在マウスをキャプチャしているウィンドウの HWND を返します。詳細については、「winuser.h GetCapture 関数」を参照してください。3ds Max 2022.2 Update 以降で使用可能です。
<Point2>windows.clientToScreen {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <int x> <int y> [ applyUIScaling:<true> ]
<Point2>windows.clientToScreen {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <Point2 clientCoord> [ applyUIScaling:<true> ]
座標を、最初の引数によって指定されたウィンドウのクライアント領域から、画面の左上隅からの相対座標に変換します。
applyUIScaling
パラメータは、true に設定されている場合、HDPI ディスプレイに必要なすべてのスケールを適用します。
3ds Max 2014 以降で使用可能です。
<Point2>windows.screenToClient {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <int x> <int y> [ applyUIScaling:<true> ]
<Point2>windows.screenToClient {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <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
-->true
windows.isWindowEnabled int_HWND
指定したウィンドウが有効で、マウスとキーボードの入力を受け取ることができる場合は、true を返します。詳細については、「Win32 API IsWindowEnabled のドキュメント」を参照してください。
windows.snapshot {<int_HWND>|#max} captureAlpha:<boolean> gammaCorrect:<boolean> captureScreenPixels:<boolean>
指定された HWND、RolloutFloater、Rollout、または 3ds Max メイン ウィンドウのビットマップ スナップショットを作成します。
指定された 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.getFocus
現在フォーカスされているウィンドウ(つまり、キーボード入力を受け取るウィンドウ)の HWND ハンドルを返します。詳細については、「Win32 API GetFocus のドキュメント」を参照してください。
windows.addChild <int_HWND> <int_HWND>
最初の引数として渡された HWND を持つ ActiveX コントロールを、2 番目の引数として渡された HWND を持つウィンドウの子にします。
最初の引数に MAXScript のコントロールやロールアウトを指定することはできません。必ず ActiveX コントロールを指定する必要があります。
ActiveX コントロールは 3ds Max 9 以降では廃止されたと見なされることから、このメソッドも廃止と見なされることがあります。
<bool>windows.isWindow {<RolloutFloater>|<Rollout>|<int_HWND>|#max}
3ds Max 2024 の新機能: RolloutFloater、Rollout、HWND、または 3ds Max のメイン ウィンドウに指定されたハンドルが既存のウィンドウである場合は、true を返します。
<bool>windows.isWindowVisible {<RolloutFloater>|<Rollout>|<int_HWND>|#max}
3ds Max 2024 の新機能: RolloutFloater、Rollout、HWND、または 3ds Max メイン ウィンドウに指定されたハンドルが表示されている既存のウィンドウである場合は、true を返します。
windows.showWindow {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <enum showCmd>
3ds Max 2024 の新機能: 指定した
showCmd
コマンドを、指定した RolloutFloater、Rollout、ウィンドウ ハンドル、または 3ds Max メイン ウィンドウのウィンドウに適用します。
showCmd
は次に示す列挙型のいずれかです。
<enum showCmd> : #hide | #normal | #showNormal | #showMinimized | #maximize | #showMaximized | #showNoActivate | #show | #minimize | #showMinNoActive | #showNa | #Restore | #showDefault | #forceMinimize
これらのコマンドの値の意味については、winuser.h ShowWindow 関数のヘルプを参照してください。
<array>windows.getWindowPlacement {<RolloutFloater>|<Rollout>|<int_HWND>|#max} removeUIScaling:<true>
3ds Max 2024 の新機能: 指定した RolloutFloater、Rollout、HWND、または 3ds Max メイン ウィンドウの表示状態と、復元された最小位置、および最大位置を返します。
返される配列の形式は #(showCmd enum, [minPos], [maxPos], (Box2, NormalPos))
です。
removeUIScaling
パラメータの既定値は true です。false の場合、値は高 DPI ディスプレイのスケール係数の影響を受けます。
返される位置の値形式の詳細については、Win32 ヘルプでウィンドウの WINDOWPLACEMENT 構造を参照してください。
3ds Max 2024 の新機能:
<bool>windows.setWindowPlacement {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <enum showCmd> <point2 minPos> <point2 maxPos> <box2 normalPos> applyUIScaling:<true>
<bool>windows.setWindowPlacement {<RolloutFloater>|<Rollout>|<int_HWND>|#max} <array> applyUIScaling:<true>
指定した RolloutFloater、Rollout、HWND、または 3ds Max メイン ウィンドウの表示状態と、復元された最小位置、および最大位置を設定します。
この関数の別バージョンは、getWindowPlacement()
(上記)が返す配列と同じ配列を取ります。
applyUIScaling
パラメータの既定値は true です。false の場合、値は高 DPI ディスプレイのスケール係数の影響を受けます。
位置の値形式の詳細については、Win32 ヘルプでウィンドウの WINDOWPLACEMENT 構造を参照してください。
<bool>windows.setFocus {<RolloutControl>|<RolloutFloater>|<Rollout>|<int_HWND>|#max} <bool> -- alias of setFocus function
3ds Max 2024 の新機能: 指定した RolloutControl、RolloutFloater、Rollout、HWND、または 3ds Max のメイン ウィンドウに入力またはマウスのフォーカスを設定します。
これは、SetFocus()
関数のエイリアスです。
<bool>windows.setForegroundWindow {<RolloutFloater>|<Rollout>|<int_HWND>|#max} -- alias of setForegroundWindow function.
3ds Max 2024 の新機能: 指定した RolloutFloater、Rollout、HWND、または 3ds Max のメイン ウィンドウを「一番上の」フォアグラウンド ウィンドウに設定します。
これは、setForegroundWindow()
関数のエイリアスです。
<intptr> windows.getWindowLong {<RolloutFloater>|<Rollout>|<int_HWND>|#max} {#exStyle|#instance|#id|#style|#userData|#wndproc|#dlgproc|#msgResult|#user|}
3ds Max 2024 の新機能: 指定したウィンドウに関する情報を取得します。2 番目の引数(取得するパラメータ)の意味の詳細については、
GetWindowLongPtrW
関数のヘルプを参照してください。
この関数が失敗した場合(たとえば、プライベート データを取得しようとした場合)、undefined が返されます。
<intptr> windows.setWindowLong {<RolloutFloater>|<Rollout>|<int_HWND>|#max} {#exStyle|#instance|#id|#style|#userData|#wndproc|#dlgproc|#msgResult|#user|} <intptr>
3ds Max 2024 の新機能: 指定したウィンドウの指定したアトリビュートを値(3 番目のパラメータ)に設定します。パラメータの以前の値を返します。2 番目の引数(設定するパラメータ)の意味の詳細については、
SetWindowLongPtrW
関数のヘルプを参照してください。
この関数が失敗した場合(たとえば、プライベート データを設定しようとした場合)、undefined が返されます。