- 題名: C#のSendMessageで送信したメッセージを、C++アプリで受信する方法
- 日時: 2006/07/28 11:29:31
- ID: 16875
- この記事の返信元:
- (なし)
- この記事への返信:
- [16876] Re[1]: C#のSendMessageで送信したメッセージを、C++アプリで受信する方法2006/07/28 11:38:52
- ツリーを表示
一応試しに、C#の勉強がてらやってみた。
C#
// 参考)http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31174&forum=7
using System;
using System.Runtime.InteropServices;
public class CopyDataTest
{
private static uint WM_COPYDATA = 0x004A;
[DllImport("user32.dll")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern IntPtr SendMessage (IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
//private static extern IntPtr SendMessage (IntPtr hWnd, uint Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
private struct COPYDATASTRUCT
{
public IntPtr dwData;
public uint cbData;
public IntPtr lpData;
}
public static void Main(string[] args)
{
string s = "ほげ";
IntPtr hWnd = FindWindow(null, "recv");
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds.dwData = IntPtr.Zero;
cds.lpData = Marshal.StringToHGlobalUni(s);
cds.cbData = (uint)((s.Length + 1) * 2);
IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(cds));
Marshal.StructureToPtr(cds, pnt, false);
// やはりlParamをIntPtr.Zeroにすると、C++のウィンドウに通知されない
SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, pnt);
//SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, ref cds);
}
}
C++・・・手抜きのためMFCでWM_COPYDATAをハンドル。
BOOL CRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
CString str( ( LPCWSTR )pCopyDataStruct->lpData );
AfxMessageBox( str );
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
分類:[.NET]
過去の掲示板
http://dobon.net/vb/bbs/log3-4/2445.html#2445
に、「SendMessage() APIで送信したメッセージをC#アプリ側で受信する方法」がありますが、
これの逆で、C#のSendMessageで送信したメッセージをC++アプリで受信することを実装したいのですが、うまく動作しません。
C#アプリ側のSendMessage()でメッセージ(0x004A)を送信しても、C++アプリ側ではWM_COPYDATAで受け取れません。
何かご存知の方は、ご教授下さい。