sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 題名: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: 五十の手習い
- 日時: 2012/02/04 17:40:48
- ID: 29761
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: オショウ
- 日時: 2012/02/04 19:34:24
- ID: 29762
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: Azulean
- 日時: 2012/02/04 20:25:14
- ID: 29765
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: 五十の手習い
- 日時: 2012/02/04 21:02:34
- ID: 29766
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: Azulean
- 日時: 2012/02/04 22:40:26
- ID: 29768
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: 五十の手習い
- 日時: 2012/02/05 11:24:03
- ID: 29769
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: Azulean
- 日時: 2012/02/05 17:19:10
- ID: 29770
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: sendmessageから別アプリ側でWM_COPYDATAが受け取れません。
- 著者: 五十の手習い
- 日時: 2012/02/05 21:29:20
- ID: 29772
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
こんにちは、よろしくお願い致します。
あまり使用したことのない32bit APIの処理で困っています。
・実現したい事
あるWindows Formアプリから文字列を送信し、別アプリで受信し表示する。
・コード
--- 送信側 ---------------------------------------------
'COPYDATASTRUCT構造体
Private Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As StringBuilder
End Structure
Private Const WM_COPYDATA As Integer = &H4A
<System.Runtime.InteropServices.DllImport("user32.dll", _
CharSet:=System.Runtime.InteropServices.CharSet.Ansi)> _
Private Shared Function SendMessage( _
ByVal hWnd As IntPtr, _
ByVal wMsg As Integer, _
ByVal wParam As Integer, _
ByRef lParam As COPYDATASTRUCT) As Integer
End Function
Private Sub Process_Boot(ByVal exe_nm As String, ByVal app_nm As String)
'プロセスを開始
Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start(GetAppPath() + exe_nm)
Try
'↓ ウィンドウハンドル
'アイドル状態になるまで待機する
hProcess.WaitForInputIdle()
While (hProcess.MainWindowHandle = IntPtr.Zero And hProcess.HasExited = False)
System.Threading.Thread.Sleep(1)
hProcess.Refresh()
End While
Dim hWnd As Integer = 0
hWnd = GetHwndFromPid(hProcess.Id)
'↓ 文字列メッセージを送信
Dim str_Send As String = "ABCDEFG"
Dim bytearry() As Byte = System.Text.Encoding.Default.GetBytes(str_Send)
Dim len As Int32 = bytearry.Length
Dim cds As COPYDATASTRUCT = New COPYDATASTRUCT
Dim result As Int32 = 0
Dim buf As New StringBuilder()
Try
buf.Append(str_Send)
Finally
buf = Nothing
End Try
cds.dwData = 0
cds.cbData = len + 1
cds.lpData = buf
'送信
SendMessage(hWnd, WM_COPYDATA, 0, buf)
Catch ex As Exception
Throw New Exception(app_nm & "は起動できませんでした。" & ex.Message)
Finally
hProcess.Close()
hProcess.Dispose()
End Try
End Sub
'ボタン押下げ
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Me.Cursor = Cursors.WaitCursor
'起動 & プロセス通信
Process_Boot("\Recieve_Window.exe", "受信アプリ")
Me.Cursor = Cursors.Default
Catch ex As Exception
Me.Cursor = Cursors.Default
MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "起動エラー")
End Try
End Sub
・コード
--- 受信側 ---------------------------------------------
'COPYDATASTRUCT構造体
Private Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As String
End Structure
Private Const WM_COPYDATA As Integer = &H4A
Private Const WM_GETTEXT As Integer = &HD
Private targetString As String
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_GETTEXT
targetString = "何故か、ここを通る?"
Case WM_COPYDATA
Dim mystr As COPYDATASTRUCT = New COPYDATASTRUCT()
Dim mytype As Type = mystr.GetType()
mystr = CType(m.GetLParam(mytype), COPYDATASTRUCT)
targetString = mystr.lpData
Return
End Select
MyBase.WndProc(m)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.Text = targetString
End Sub
コード 以上 ------------------------------------------
・結果 受信側アプリのMe.Textに「何故か、ここを通る?」が表示されてしまう。
以上ですが、
1. なぜ、WM_GETTEXT なのでしょう?
2. 試しに WM_GETTEXT の中にWM_COPYDATA内の処理を置いてみましたが、
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。エラーとなりました。
よろしくお願い致します。