2

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
4

1 に答える 1

1

このWM_KEYDOWNメッセージは、「非システム キーの仮想キー コード」を wParam として想定しています ( MSDNを参照)。

これはたまたま、英数字記号のキー文字の ASCII 値に対応していますが、他のすべてのキーには対応していません。しばらくの間、送信する必要があると思いますVK_OEM_PERIOD

仮想キー コードの表は、http: //msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspxにあります。

于 2012-06-14T16:40:54.887 に答える