日期:2014-05-18  浏览次数:21309 次

C#中发送消息SendMessage中参数问题
场景如下:
将系统中的日志在启动画面中显示,如是想到用消息机制。
首先定义消息,这个不表。
然后是引用windowsApp:
C# code

        [DllImport("User32.dll", EntryPoint = "SendMessageA")]
        private static extern int SendMessage(
             int hWnd, // handle to destination window 
             int Msg, // message 
             int wParam, // first message parameter 
             string lParam // second message parameter 
            );
        private static extern int FindWindow(string lpClassName, string lpWindowName);

        public static void SendMsgToFlashForm(int MSG, IntPtr wParam, string lParam)
        {
            int WINDOW_HANDLER = FindWindow(null, @"XXXX");
            if (WINDOW_HANDLER == 0)
            {
                throw new Exception("Could not find Main window!");
            }
            SendMessage(WINDOW_HANDLER, MSG, wParam, lParam);
        }



调用地方:
C# code

 MessageController.SendMsgToFlashForm(MessageManager.MyMessage.WM_SHOW_PROCESS, IntPtr.Zero, "系统开始创建核心对象");



接收的地方:
C# code

            try
            {
                switch (m.Msg)
                {
                    case Utility.CommonUtility.MessageManager.MyMessage.WM_SHOW_PROCESS:
                        {
                            label2.Text = m.LParam.ToString();
                            break;
                        }
                    default:
                        base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
                        break;
                }
            }


现在问题是:
在接收的地方,总是收不到正确的东西,例如,我应该在这里收到是字符串的内容,结果总是返回一组数字!!

为什么?麻烦周末有达人帮解决!!

------解决方案--------------------
mark
------解决方案--------------------
还没用过User32.dll呢!!
------解决方案--------------------
C# code
 
用StringBuild 
private static extern int SendMessage(
             int hWnd, // handle to destination window 
             int Msg, // message 
             int wParam, // first message parameter 
             StringBuild lParam // second message parameter 
            );

------解决方案--------------------
同进程可以这样:
C# code
[DllImport("User32.dll")]
private static extern int SendMessage(int hWnd, int Msg, int wParam, string lParam);
private const int WM_USER = 0x0400;
private void button1_Click(object sender, EventArgs e)
{
    SendMessage((int)Handle, WM_USER + 10, 0, "Zswang 路过");
}

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_USER + 10:
            MessageBox.Show(Marshal.PtrToStringAnsi(m.LParam));
            break;
    }
    base.WndProc(ref m);
}

------解决方案--------------------
探讨
非常感谢Zswang,
好像不止一次帮我解决问题,!

------解决方案--------------------
探讨
那家伙耍了我2000分...恨之入骨