gpt4 book ai didi

c# - PostMessage 无法传递字符串 C#

转载 作者:行者123 更新时间:2023-11-30 18:09:57 29 4
gpt4 key购买 nike

这是我的原型(prototype):

    [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

我没有得到 bob。

我认为这一定是因为我在一个线程的堆栈上引用了“bob”字符串,而该引用在另一个线程的堆栈中绝对没有任何意义。但如果是这样的话,这些 wparam 和 lparam 指针真的只用于在同一线程中传递的消息吗?

编辑*更正:我所说的线程是指进程。这是在进程之间而不是线程之间传递字符串的问题。

最佳答案

回答你的最后一个问题。我已经尝试过相同的方法,当我尝试将 lParam 转换为字符串并在同一窗口中向后转换时,它的工作非常温和,但在传递到另一个窗口时却没有。所以我尝试改用 SendMessage,效果很好。

http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/

我下载了这个类(class),效果很好。 :)

像这样使用:

    public void SendMsg(string msg)
{
MessageHelper msgHelper = new MessageHelper();
int hWnd = msgHelper.getWindowId(null, "The title of the form you want to send a message to");
int result = msgHelper.sendWindowsStringMessage(hWnd, 0, msg);
//Or for an integer message
result = msgHelper.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);
}

关于c# - PostMessage 无法传递字符串 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066658/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com