这也正是我困惑的地方,按说SendMessage没有得到目标窗口的回应是不应该返回的(所以必须用SendMessage而不能用PostMessage)。可是你的这个代码却直接就返回了。我第一次遇到。我不懂VB,但使用c、c++、pascal、asm都没发现这个问题。我建议你用GetLastErrror来确定它为什莫出错了。并把你的答案贴出来。谢谢。
下面是我用C 和 pascal测试的代码:没有发现问题。
程序代码:
#include <windows.h>
#include <stdio.h>
int main(int argc,char* argv[])
{
COPYDATASTRUCT SendMsg;
HWND TagWnd;
char szTagWindowname[128] = {'\0'};
char szSendTxt[128] = {'\0'};
if(argc>2)
{
strcpy(szTagWindowname,argv[1]);
}
else
{
while(1)
{
flushall();
printf("请输入目标窗口的名字: \n");
scanf("%s",szTagWindowname);
if(strlen(szTagWindowname))
break;
}
}
TagWnd = FindWindow(NULL,szTagWindowname);
if(!TagWnd)
{
printf("没有找到目标窗口,程序退出\n");
exit(0);
}
printf("请输入你要发送的字符串信息(小于128字节)\n");
scanf("%s",szSendTxt);
SendMsg.dwData = 3353;
SendMsg.cbData = strlen(szSendTxt);
SendMsg.lpData = szSendTxt;
if(SendMessage(TagWnd,WM_COPYDATA,0,(LPARAM)&SendMsg))
printf("消息发送成功\n");
else
printf("消息发送失败\n");
getchar();
return 0;
}
目标:
程序代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
procedure OnMsg(var Msg: TMessage);message WM_COPYDATA;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormShow(Sender: TObject);
begin
Memo1.Clear;
end;
procedure TForm1.OnMsg(var Msg: TMessage);
var
pdata: PCopyDataStruct;
EchoStr: ansiString;
begin
pdata:= PCopyDataStruct(Msg.LParam);
if pdata.lpData <> nil then
begin
pbyte(pansichar(pdata.lpData) + pdata.cbData)^:= 0;
EchoStr:= pansichar(pdata.lpData);
Memo1.Lines.Add(EchoStr);
end;
Msg.Result:= 1;
end;
end.
[
本帖最后由 东海一鱼 于 2010-7-6 12:01 编辑 ]