我看到一种方法:
[DllImport("user32.dll", EntryPoint="SendMessageA")]
private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
上面这种方法把lParam直接定义成string,在调用的时候是成功的
string strReceive = "advise";
SendMessage((int)Handle, WM_USER, 0, strReceive);
但是在消息响应那里,该怎么把这个字符串取出来呢?
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case frmMain.WM_USER:
string str = m.lParam.ToString();//这个方法不对,请指教
MessageBox.Show(str); break;
default:
base.DefWndProc(ref m);
break;
}
}请大大们帮我解答,谢谢!
[DllImport("user32.dll", EntryPoint="SendMessageA")]
private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
上面这种方法把lParam直接定义成string,在调用的时候是成功的
string strReceive = "advise";
SendMessage((int)Handle, WM_USER, 0, strReceive);
但是在消息响应那里,该怎么把这个字符串取出来呢?
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case frmMain.WM_USER:
string str = m.lParam.ToString();//这个方法不对,请指教
MessageBox.Show(str); break;
default:
base.DefWndProc(ref m);
break;
}
}请大大们帮我解答,谢谢!
解决方案 »
- XtraReport的问题
- GridView的HyperLinkField的URL参数,有办法是行号吗?
- 求救!!不明白为什么不能这样
- 如何使用下载下来的窗体美化控件(附地址)
- 高分,求一个VS2003安装盘中的一个文件,600k,谁发给我给谁分!
- C# SOCKETS编程接受数据问题
- 去微软面试,其中的一道题目
- 我应该怎样改代码才能使文章段和段之间排版正常啊?
- 各位高手,请教个简单的问题,本人蛮菜的,刚步入编程初步~~~希望大家支持
- ado.net连接ORACLE出错怎么解决?
- 在javascript中,声明一个变量时,用一个空的{}给变量赋值是什么意思?比如:
- 在javascript中,声明一个变量时,用一个空的{}给变量赋值是什么意思?比如:
//这个方法相当恐怖,
public static extern int SendMessage(IntPtr hWnd,
uint Msg, int wParam, int lParam);static string myText;
const int WM_USER = 0x0400;
private void button1_Click(object sender, EventArgs e)
{
myText = "Zswang 路过" + DateTime.Now.ToLongTimeString();
SendMessage(Handle, WM_USER, 0, 0);
}protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_USER:
MessageBox.Show(myText);
break;
default :
base.WndProc(ref m);
break;
}
}
跨进程再说
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
unsafe static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, void* lParam);
//----------------------------------------------------------
unsafe
{
string strReceive = "advise";
fixed (char* ptr = &(strReceive.ToCharArray()[0]))
{
SendMessage(Handle, 0x0400, IntPtr.Zero, ptr);
}
}
//----------------------------------------
if (m.LParam != IntPtr.Zero && m.Msg == 0x0400)
{
unsafe
{
char* ptrLParam = (char*)m.LParam.ToPointer();
string s = "";
for(int i=0;i<6;i++)
s+=ptrLParam[i].ToString();
MessageBox.Show(s);
}
}
接收消息可通过重写DefWndProc来实现protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
case WM_USER: // 任何消息 int iWPara = (int)m.WParam; MyStruct myStr = new MyStruct(); Type myType=myType.GetType(); myType = (MyStruct)m.GetLParam(myType);
break; default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}但是对于一些非自定义的消息, 如WM_SETTEXT,或者一些第三方应用所发出的消息,其中的LParam中可能包含的是一个指向字符串的指针,如char *,那么这时候如何取得LParam中的实际数据呢?以一自定义消息为例,通过该消息的m.LParam.ToString()得知存储的数据类型为"String",但是使用GetLParam获取会出现错误,因为GetLParam只接受结构类型,那怎么办呢?那就是使用Marshal.Copy,将数据从非托管内存指针复制到托管 8 位无符号整数数组.如下:byte[] ch = new byte[256]System.Runtime.InteropServices.Marshal.Copy(m.LParam,ch,0,255);string str = System.Text.Encoding.Default.GetString(ch);这样,就成功获得了m.LParam所包含的字符数据
string myStr="Test LParam";
int testBytes=Encoding.Default.GetByteCount(myStr);
SendMessage(Handle,0,IntPtr.Zero,myStr);然后, 在WndProc里面, Case WM_USER:
byte[] myBytes=new byte[testBytes];
Marshal.Copy(m.LParam,myBytes,0,testBytes);
string myTestResult=Encoding.Default.GetString(myBytes);
break;
string myStr="Test LParam";
int testBytes=Encoding.Default.GetByteCount(myStr);
SendMessage(Handle,0,IntPtr.Zero,myStr);然后, 在WndProc里面, Case WM_USER:
byte[] myBytes=new byte[testBytes];
Marshal.Copy(m.LParam,myBytes,0,testBytes);
string myTestResult=Encoding.Default.GetString(myBytes);
break;
因为我不想使用Unsafe 代码,所以GenLinux的回答不是正解,在C#中,我认为Unsafe代码也是要尽量避免的吧。