VB.net を使用して IBM iSeries エミュレーターを自動化し、「SetParent」API を使用して WindowsForm パネルに外部 iSeries エミュレーター ウィンドウを埋め込む GUI を作成しました。iSeries ウィンドウと通信するには、SendMessage API を使用してキーを画面に送信します。私は .net の sendkeys.keys を認識していますが、この方法では、SetForegroundWindow を使用してフォームを再アクティブ化する必要はありません。
私のプログラムはスケールの出力を読み取り、受信したデータが適切かどうかを検証します。そうであれば、次のコードを使用して iSeries 画面に出力を送信します (UserApi は私の Lib です)。
For Each element As Char In CStr(txtto400.Text)
UserApi.SendMessage(as400WindowHandle, 256, CType(Convert.ToInt32(element), IntPtr), CType(0, IntPtr))
Next
私はこれを他のプロジェクトで数回行いましたが、この方法はうまく機能しますが、私の TextBox (txtto400.Text) では、体重に「000.88 KG」のような値があります。SendMessage は、ピリオド (.) であるキー "46" を送信しません。代わりに、"00088 KG" になります。
なぜこれがうまくいかないのか、誰にも分かりますか?私にできることはありますか?
編集:
ヒントをくれた Paul B. に感謝します。
これが私がそれを解決した方法です。
私の SendMessage 関数は次のようになります。
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function SendMessage( _
ByVal hwnd As IntPtr, _
ByVal wMsg As UInt32, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As IntPtr
End Function
VK_OEM_PERIOD を保持する変数を作成しました。
Public Const VK_OEM_PERIOD = &HBE
Chrをチェックする関数を作成しました:
Public Function vk_key(key As Char) As Integer
Select Case key
Case Is = Chr(46)
Return VK_OEM_PERIOD
Case Else
Return AscW(key)
End Select
End Function
これをiSeriesウィンドウに渡す方法は次のとおりです。
For Each element As Char In txtto400.Text
UserApi.SendMessage(as400WindowHandle, 256, vk_key(element), 0)
Next