- 題名: 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で受け取れません。
何かご存知の方は、ご教授下さい。