使用SendMessage传送字符串

varlj 2008-07-12 08:05:06
我需要使用一个自定义事件,使用SendMessge传递消息

[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd,int Msg,int wParam,int lParam );


然后使用这样的代码发送字符串:

SendMessage(handle,msg,Marshal.StringToHGlobalAnsi("hello").ToInt32(),0);


如下代码取得数据:
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case 123:
String ss = Marshal.PtrToStringAnsi(m.LParam).ToString();
MessageBox.Show(ss);
break;
default:
base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
break;
}
}

但是这样的代码,消息是能够收到,但是取不到我传递的值
以前用VC反正是DWORD,强制转换够好,C#要怎么做呢
...全文
491 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
heroxxx 2008-07-16
  • 打赏
  • 举报
回复
为什么我在windows程序中使用这样的代码,
[DllImport("user32.dll",EntryPoint="SendMessage")]
public static extern int SendMessage(int hWnd,int Msg,int wParam,int lParam);

却编译却得到如下错误提示:
错误 1 应输入 class、delegate、enum、interface 或 struct
错误 2 修饰符“extern”对该项无效

gomoku 2008-07-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 varlj 的回复:]
汗,完全一样的代码啊……
不过我是不同进程间的,这会不会是原因呢?
[/Quote]

StringToHGlobalAnsi("hello")得到的指针,到了另外一个进程就完全没有意义了(每个进程都有自己的‘虚拟’内存空间)。
要传递简单字符串,可以使用WM_COPYDATA消息,该消息比较特殊,windows系统会负责拷贝需要传递的数据,从而使另外一个进程可以收到数据。
具体使用你可以google WM_COPYDATA。
varlj 2008-07-13
  • 打赏
  • 举报
回复
原来如此,谢谢
可惜COPYDATA我不能用,因为同时会有好几个发生
现在用Mutex锁定一个文件用来交换数据
varlj 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 JeffChung 的回复:]
不同进程的话,是不是你的消息常数定义的跟系统的冲突了的关系?
WM_CONTEXTMENU = 0x007B; //123

一般定义用户自定义消息要大于0x400,你改下试试
[/Quote]

谢谢JeffChung这么热心的回答

public const int WM_USER = 0x400;
public const int WM_ADD_TASK = WM_USER + 1;

其实我的目的很简单,就是实现进程间通信……汗了
刚GOOGLE了一下,看到消息队列,兴冲冲的试了下,才发现还要安装组件……
JeffChung 2008-07-12
  • 打赏
  • 举报
回复
不同进程的话,是不是你的消息常数定义的跟系统的冲突了的关系?
WM_CONTEXTMENU = 0x007B; //123

一般定义用户自定义消息要大于0x400,你改下试试
varlj 2008-07-12
  • 打赏
  • 举报
回复
汗,完全一样的代码啊……
不过我是不同进程间的,这会不会是原因呢?
varlj 2008-07-12
  • 打赏
  • 举报
回复
怪了,我新建立了一个工程,用上面的代码,也可以啊……我再检查检查看
JeffChung 2008-07-12
  • 打赏
  • 举报
回复
除了那个倒没发现其他有什么问题,我照着写测试了,可以的啊

[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
private void button3_Click(object sender, EventArgs e)
{
int msg = 123;
SendMessage(Handle.ToInt32(), msg, Marshal.StringToHGlobalAnsi("hello").ToInt32(), 0);
}

protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case 123:
string ss = Marshal.PtrToStringAnsi(m.WParam).ToString();
MessageBox.Show(ss);
break;
default:
base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
break;
}
}
varlj 2008-07-12
  • 打赏
  • 举报
回复
反正我的目的,就是要把一个字符串,通过SendMessage方法传过去
varlj 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 JeffChung 的回复:]
string ss = Marshal.PtrToStringAnsi(m.WParam).ToString(); //你发送消息的时候用的是wParam!
[/Quote]

不好意思,那个是我写示例代码的时候弄错了,实际写的就是WParam,取得的,还是""
JeffChung 2008-07-12
  • 打赏
  • 举报
回复
string ss = Marshal.PtrToStringAnsi(m.WParam).ToString(); //你发送消息的时候用的是wParam!

111,048

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧