公園の池も雨の中

陶磁器コレクション、千夜一夜物語、映画の話等

VBScript HTA間で文字列を送信する

2008-03-04 10:34:17 | VBScript
上司が「君はファンキー・モンキー・ウッキー イカレてるよ」と、唄っていました。
猿ってか。失礼な。(怒・怒・怒)

標題にHTA間と、書きましたがサンプルは単純にしたかったので
VBS->HTA へ一方的に送る仕様です。

HTAウィンドウ表示中にデータをやり取りする方法はないかと調べてみたら
"sendKeys"がありました。

2重起動を許可しないタイプのHTAを想定して作成しています。
(2重起動が可ならコマンドラインからデータをとれますね)

ポイント
 ・受信側の内部アプリケーション名を指定しておく
 ・受信側は2重起動を許可しない設定にしておく
<code>
--送信側(VBS)--
Option Explicit
Dim objShell

Set objShell = CreateObject("WScript.Shell")
objShell.Run "rcvMsg.hta"
Wscript.Sleep 1000
objShell.AppActivate "sampleA" 
objShell.SendKeys chr(&H2) & "Hello" & chr(&H3)

Set objShell=Nothing
Wscript.Quit

--受信側(rcvMsg.hta)--
<html>
<head>

<HTA:APPLICATION
    APPLICATIONNAME="sampleA"
    SINGLEINSTANCE="yes"
/>

<script language="vbscript">
Option Explicit
Dim Flg,Msg
Flg=False

Sub getMsg()'受信
Dim s

  s=chr(window.event.keyCode)

  Select Case s
    Case chr(&H2)'メッセージの先頭
	window.focus	'TEXTBOXに受信した文字が入らないようにウィンドにフォーカスを移しておく
	Msg=""
	Flg=True

    Case chr(&H3)	'メッセージの最後
	If Flg=True Then MsgBox Msg	'メッセージを表示する
	Flg=False

    Case Else  'データ部
	If Flg=True Then Msg=Msg & s			

    End Select

End Sub

</script>
</head>

<body onKeyPress="getMsg">
  <input type="text" value="aaa">
</body>

</html>
</code>

送信側
 既に"rcvMsg.hta"を起動済みでも送信できます。
 ユーザーのキー入力と区別するためにデータの先頭と終りに記号を付けています。

受信側:
 内部名は"sampleA"です。

注意:
 いじめテストしていません。
 ウィンド内の入力と受信が重なるとバグがでるかも。
 "SendKeys"実行後、すぐにオブジェクトを破棄しているので長文を送ったときに全文字列
 を保障してくれるのかは未テストです。