标题:为何接收不到WM_COPYDATA消息?
只看楼主
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
结帖率:100%
已结贴  问题点数:20 回复次数:7 
为何接收不到WM_COPYDATA消息?
testCopyData.rar (16.82 KB)

附件中的Sample文件夹中的例子可以正常的接收到wm_copydata消息
但在另外的程序中用几乎同样的代码却不能成功。
想破脑袋也想不出为什么?

Sample中的例子完全参照http://support.做的

[ 本帖最后由 jiashie 于 2010-5-31 10:58 编辑 ]
搜索更多相关主题的帖子: COPYDATA 
2010-05-31 09:51
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
得分:0 
为了便于比较,我又创建了一个Sample2文件夹。几乎一样的代码,一份是正常运行的代码,另一份是参照正常的代码,只是规范了变量名等,然后通过更改编译参数来选择编译不同部位的代码,居然copy过来的代码是正常的,改了几个变量名的就不行。代码中找不出任何有影响的差异啊》?!!!!
疯了~~~~
Sample2.rar (4.77 KB)
2010-05-31 14:59
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
得分:0 
各位走过路过的大侠啊,不要吝啬你的高见 啊,感激不尽~~~~~~
千古奇案啊~~
2010-05-31 15:07
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:20 
乍弄得这么复杂.用ActiveX EXE不更好。我仔细看看。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-06-01 13:02
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
得分:0 
唉,问题仍然没解决,结贴。幸好有ioriliao的回贴,不然就只有我自己在自问自答了,还不知道怎么给分呢。
2010-06-03 15:13
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:0 
看了一下,你的消息根本就没有发送出去。也就是说SendMessage直接就出错返回了。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-06 10:28
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
得分:0 
回复 6楼 东海一鱼
用spy++监视,确实是没有发出去
但是,为什么没发出去。代码上看不出明显的差别啊。
2010-07-06 11:32
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:0 
这也正是我困惑的地方,按说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 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-06 11:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-308773-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.228466 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved