请问VB如何用API: getmessage获取字符串?

刚学VB,像设置建立两个工程(一个VB6,一个.net环境),实现简单的发送字符串。
大概流程是:
在工程1(VB6)中 利用 i = SendMessage(hwnd2, WM_SETTEXT, 0, "aaa"),把字符串“aaa”发送到工程2
然后在工程2(VB.net) i=GetMessage( lpMsg,hWnd1,0,0) 来获得工程1发出的消息。
但问题来了,貌似这样只能取到“aaa”字符串的指针(lpMsg),请问怎样能去得到这个字符串啊??
或者有什么其他方法也请告诉我,能发送字符串就好,DDE就免了(.net用不了),共享内存试了好久也不成功。。。
对了,如果说sendmessage到工程2的textbox也免了,我需要50毫秒发送一条消息,这么快的速度,textbox直接就卡死了

第1个回答  2013-02-25
你这个问题难度远多于你给的分数,刚好近段做了一个C#相关例子。应该实现起来都一样,我说一下你的实现方法,你参考一下了:
首先是发送端:
用API“FindWindow”找到接收端句柄 →定义COPYDATASTRUCT结构,用SendMessage发送信息。
C#例子:
public const int WM_COPYDATA = 0x004A;
string str = “发送信息”;
//填充COPYDATA结构
COPYDATASTRUCT cds= new COPYDATASTRUCT();
cds.cbData = Encoding.Default.GetBytes(strText).Length; //长度 注意不要用strText.Length;
cds.lpData = strText; //内容
SendMessage("接收端的窗口句柄", WM_COPYDATA, hwndSendWindow, ref cds);

其次接收端:
重写信息循环(WndProc)→判断是否是WM_COPYDATA 信息,从内存返回COPYDATASTRUCT 结构数据(使用Marshal.PtrToStructure()函数)→内存复制后解码得到目标数据。
C#例子:
if (msg.Msg == WM_COPYDATA )
{
//获取数据
COPYDATASTRUCT cds = new COPYDATASTRUCT ();
cds = (COPYDATASTRUCT )Marshal.PtrToStructure(msg.LParam, typeof(COPYDATASTRUCT ));

if (cds.cbData > 0)
{
byte[] data = new byte[cds.cbData];
Marshal.Copy(cds.lpData, data, 0, cds.cbData);
Encoding unicodeStr = Encoding.ASCII;
str = new string(unicodeStr.GetChars(data));
//m.Result = (IntPtr)1;
}
}

你看一下,是否能给你一点帮助了。。
第2个回答  2013-02-26
1,根本就不应该用 GetMessage来获取队列消息,窗口的主线程 有个 GetMessage 循环来取消息了,你再来一个,有可能根本就取不到 WM_SETTEXT 这个消息,
2,既然 “aaa” 字符串的指针都得到了,并且这个指针就是在这个进程地址空间当中,所以用 lstrcpyn 这个函数来获取,
3,既然是获取消息,那么就该修改程序的窗口过程,指向自己的那个处理窗口的函数,来处理消息,
4,至于卡死,就是用了 GetMessage这个函数的问题,这个函数本身就是堵塞函数,消息队列中没有消息的时候就处于等待状态。
实例如下,都是 VB6 的工程,
第一个工程,添加一个 Timer 控件
'------------------------------------------------窗口代码
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Dim i As Long
Private Sub Form_Load()
Timer1.Enabled = True
Timer1.Interval = 50
End Sub
Private Sub Timer1_Timer()
i = i + 1
SendMessage hwnd2, 12, 0, "窗口1-" & i ‘ hwnd2 为第二个工程中窗口句柄
If i = &HFFFFFFF Then i = 0
End Sub
第二个工程
'------------------------------------------------窗口代码
Private Sub Form_Load()
c = SetWindowLong(Me.hwnd, -4, AddressOf proc)
End Sub
'------------------------------------------------模块代码
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As Any, ByVal iMaxLength As Long) As Long
Public c As Long
Public Function proc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If Msg = 12& Then
Dim a As String * 255
lstrcpyn a, ByVal lParam, 255
Debug.Print a ' 把结果打印在debug 面板上
End If
proc = CallWindowProc(c, hwnd, Msg, wParam, lParam)
End Function
相似回答