お世話になります。

Windows7で統計・解析環境「R」のGUI版に対してコマンドテキストを送信し、その結果を取得するアプリを作成しています。

見よう見まねでFindWindowEx関数でRGUIの親ウインドウハンドル、MDIのウインドウハンドル、そしてRConsole自体のハンドルを取得する事に成功しました。

※ハンドルはWinSpectorで確認

取得したハンドルに対してSendMessage関数で文字列を飛ばそうと思うのですが実行しても全然文字を入力してくれません。

ウインドウハンドル自体は取得できているので問題ないと思っているのですが何か足りない物があるのでしょうか?

ご示唆頂けるとありがたく思います。

よろしくお願いします。

Option Strict Off
Option Explicit On
Friend Class Form1
    Inherits System.Windows.Forms.Form

    'クラス名、キャプションから子ウィンドウのハンドルを取得
    Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Integer, ByVal hwndChildAfter As Integer, ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer,ByVal lParam As String) As Integer

    Private Const WM_IME_CHAR As Short = &H286S '文字コード送信
    Private Const WM_SETTEXT As Short = &HCS '文字列送信

    Private Sub Command1_Click(ByVal eventSender As System.Object, _
                               ByVal eventArgs As System.EventArgs) Handles Command1.Click
        Dim lnghWnd As Integer 'トップレベル(親)のウィンドウハンドル
        Dim lnghWndMDI As Integer
        Dim lnghWndTarget As Integer 'ターゲット(子)のウィンドウハンドル
        Dim lngRc As Integer 'APIの返却値

        lngRc = Shell("C:\Program Files\R\R-3.3.1\bin\x64\Rgui.exe", AppWinStyle.NormalFocus)
        System.Threading.Thread.Sleep(3000)


        '
        '-------------------------------------
        ' ターゲットウィンドウのハンドルを取得
        '-------------------------------------
        lnghWnd = FindWindowEx(0, 0, "Rgui Workspace", "RGui (64-bit)")
        lnghWndMDI = FindWindowEx(lnghWnd, 0, "MDIClient", "")
        lnghWndTarget = FindWindowEx(lnghWndMDI, 0, "Rgui Document", "R Console")

        '-------------------------------------
        ' 送信
        '-------------------------------------
        Dim strDt As String

        '-------------------------------------
        ' 1文字ずつ送信 50ミリ(0.05)秒間隔
        '-------------------------------------
        Dim lngDt As Integer
        Dim i As Integer

        For i = 1 To Len(Text1.Text)            '文字数分繰り返す
            strDt = Mid(Text1.Text, i, 1)       '1文字
            lngDt = Asc(strDt)                  'ASCIIコードに変換
            lngRc = SendMessage(lnghWndTarget, WM_IME_CHAR, lngDt, 0) '1文字送信

            System.Threading.Thread.Sleep(50) '指定ミリ秒待つ
        Next i

    End Sub


    Private Sub Form1_Load(ByVal eventSender As System.Object, _
                           ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        Text1.Text = "q()" & vbCrLf
    End Sub

    Private Sub Form1_FormClosing(ByVal eventSender As System.Object, _
                                  ByVal eventArgs As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Dim Cancel As Boolean = eventArgs.Cancel
        Dim UnloadMode As System.Windows.Forms.CloseReason = eventArgs.CloseReason
        End
        eventArgs.Cancel = Cancel
    End Sub
End Class