如何将对象实例发送到WndProc

时间:2011-06-28 15:05:51

标签: c# sendmessage wndproc postmessage

我正在使用描述某些状态和值的自定义类:

  class MyClass
    {
        int State;
        String Message;
        IList<string> Values;
    }

由于应用程序体系结构,表单交互使用消息及其基础结构(SendMessage / PostMessage,WndProc)。 问题是 - 如何使用SendMessage / PostMessage将MyClass的实例发送到WndProc? 在我的代码中,PostMessage的定义方式如下:

[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

所以,我需要在我的自定义消息号下面以某种方式发送和一个MyClass实例,所以在WndProc我可以用它来满足逻辑需求。 有可能吗?

1 个答案:

答案 0 :(得分:2)

你无法做到这一点。 托管语言中的指针没有任何意义,它们通常在不再引用时被重新定位和终止。 好吧,也许你可以通过这种方式(过程中)实现某种方式,使用不安全的代码和固定指针但这将是你的厄运。

如果您只想进行进程通信,请注意跨线程通信的影响。

如果您需要跨进程通信,请参阅此主题: IPC Mechanisms in C# - Usage and Best Practices

修改

通过SendMessage发送uniqueID以获取序列化对象。 我不建议这样做,因为它是黑客攻击和容易出错但你要求:

发送邮件时

IFormatter formatter = new BinaryFormatter();
string filename = GetUniqueFilenameNumberInFolder(@"c:\storage"); // seek a freee filename number -> if 123.dump is free return 123 > delete those when not needed anymore
using (FileStream stream = new FileStream(@"c:\storage\" + filename + ".dump", FileMode.Create))
{
   formatter.Serialize(stream, myClass);
}
PostMessage(_window, MSG_SENDING_OBJECT, IntPtr.Zero, new IntPtr(int.Parse(filename)));
在WndProc中收到

if (msg == MSG_SENDING_OBJECT)
{
    IFormatter formatter = new BinaryFormatter();
    MyClass myClass;
    using (FileStream stream = new FileStream(@"c:\storage\" + lParam.ToInt32().ToString() + ".dump", FileMode.Open))
    {
        myClass = (MyClass)formatter.Deserialize(stream);
    }
    File.Delete(@"c:\storage\" + lParam.ToInt32().ToString() + ".dump");
}

对于代码中的拼写错误,我写这个特设并且无法测试......