UWSCでPowershellを使ったフォームの表示

こんな記事を見つけた。
というか、検索するとGoogleの上位に出てくる。
UWSC4.6bのpowershell()関数 | たっぷす庵
調べたところとりあえず解決できそうなので、解決してみた。

UWSC v4.7にて、修正が入った。
そのため、全面更新。
なお、v4.7以降のみ対応とするなら、PowershellFormモジュールに内部変数は不要となる。


PowershellForm.uws

OPTION EXPLICIT


IFB GET_UWSC_NAME = "PowershellForm.uws" THEN
	DIM formName = "PowerShellフォーム"
	TEXTBLOCK ps1
		[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
		#フォーム
		$form = New-Object Windows.Forms.Form
		$form.Text = "#$#$formName$#$#"
		$form.FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedSingle
		$form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen 

		#エディットボックス
		$edit = New-Object Windows.Forms.TextBox
		$edit.MultiLine = $true
		$edit.Size = $form.ClientSize
		$form.Controls.Add($edit)

		#[Windows.Forms.Application]::Run($form)
		#$form.Show()
		$form.ShowDialog() | out-null
		$edit.Text
	ENDTEXTBLOCK

	PRINT PowershellForm.Show(formName, REPLACE(ps1,"#$#$formName$#$#",formName))
ENDIF


MODULE PowershellForm
	DIM _wait = TRUE
	DIM _result

	FUNCTION Show(title, pss)
		IFB GET_UWSC_VER >= 4.7 THEN
			THREAD PrivateShowWindow(title)
			RESULT = PrivateMakeForm(pss)
		ELSE	// 4.6cでは、4.63と返ってきた
			_wait = TRUE
			THREAD PrivateMakeForm(pss)
			PrivateShowWindow(title)
			WHILE _wait
				SLEEP(0.1)
			WEND
			RESULT = _result
		ENDIF
	FEND

	FUNCTION PrivateMakeForm(pss)
		RESULT = POWERSHELL(pss, FALSE, FALSE)
		_result = RESULT
		_wait = FALSE
	FEND
	PROCEDURE PrivateShowWindow(title)
		CTRLWIN(GETID(title, "", -1), SHOW)
	FEND
ENDMODULE