这是我的原型:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool PostMessage(int hhwnd, uint msg, IntPtr wparam, IntPtr lparam);
以下是我如何使用它:
PostMessage(HWND_BROADCAST, msg, Marshal.StringToHGlobalAuto("bob"), IntPtr.Zero);
在另一个帖子中,我可以截取此消息,但是当我尝试使用以下内容获取bob时:
string str = Marshal.PtrToStringAuto(m.WParam); // where m = the Message object
我没有在str。中获取bob。
我认为这必须是因为我在一个线程的堆栈上引用了“bob”字符串,并且该引用在不同的线程堆栈中绝对没有意义。但如果是这样的话,这些wparam和lparam指针是否真的只用于在同一个线程中传递的消息?
编辑*更正:按线程我的意思是过程。这是在进程之间传递字符串的问题,而不是线程。
答案 0 :(得分:1)
HGLOBALs在任何方面都不再是全球性的。从win16开始。并且HWND_BROADCAST看起来就像是将消息发送到另一个进程,更不用说只是一个不同的线程了。
因此,除非您使用操作系统知道如何编组的标准消息之一,否则您需要将字符串“bob”放在不同进程可以访问的共享内存区域中。
答案 1 :(得分:0)
回答你的上一个问题。我尝试过相同的操作,当我尝试将lParam转换为字符串并在同一窗口中向后转换时,它的工作非常灵巧,但在传递到另一个窗口时却没有。所以我尝试使用SendMessage而且效果很好。
http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/
我下载了这个课,效果很好。 :)
像这样使用:
public void SendMsg(string msg)
{
MessageHelper msgHelper = new MessageHelper();
int hWnd = msg.getWindowId(null, "The title of the form you want to send a message to");
int result = msg.sendWindowsStringMessage(hWnd, 0, msg)
//Or for an integer message
result = msg.sendWindowsMessage(hWnd, MessageHelper.WM_USER, 123, 456);
}
//In your form window where you want to receive the message
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case MessageHelper.WM_USER:
MessageBox.Show("Message recieved: " + m.WParam + " - " + m.LParam);
break;
case MessageHelper.WM_COPYDATA:
MessageHelper.COPYDATASTRUCT mystr = new MessageHelper.COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
MessageBox.Show(mystr.lpData);
break;
}
base.WndProc(ref m);
}