WinAPIでRGUIにテキストが送信出来ない
お世話になります。
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