首页
社区
课程
招聘
[求助]Sendmessage函数返回值
发表于: 2009-12-19 19:35 10270

[求助]Sendmessage函数返回值

2009-12-19 19:35
10270
各位老师好,请教一个问题,我有时候在编程的时候需要处理一些通过消息传遍过来的数据,这些数据每次里面有字符串,要是数字还好处理字符串就比较难处理,
我收集了5种消息传递字符串的方法,结果用着都不是让我很满意

方法1:
  发送方:   
  wParam   =   GlobalAddAtom('string...')   
  PostMessage(HWnd,   WM_XYZ,   wParam,   0)   
  接收方:   
  str   =   GlobalGetAtomName(wParam)   
  GlobalDeleteAtom(wParam)

方法2:
  var   s:string   
  begin   
  setlength(s,100);   
  s:='1111111';   
  postmessage(frm_handle,wm_user+100,integer(@s[1]),0);
  
方法3:
  sTemp   :=   Pchar(sData);   
  SendMessage(wHandle,WM_SETTEXT,0,Integer(sTemp));   
    
方法4:
  1.   
  TCommInfo   =   array[0..50]   of   Char;   
  szCommInfo   :   TCommInfo;         
  SendMessage(FormHandle,   WM_COMMINFOMSG,   0,   Integer(PChar(CommInfo)));   
  2.   
  CommInfo   :   String;   
  SendMessage(FormHandle,   WM_COMMINFOMSG,   0,   Integer(PChar(CommInfo)));

方法5:
  单个字符传递
  SendMessage(whwnd,WM_CHAR   ,Integer(PChar(S)),0);  


上面是我收集的方法,

我又仔细阅读了SendMessage 的函数原型, 知道他有一个返回值
LRESULT ,我现在想实现通过SENDMESSAGE函数的返回值来传递我的参数

LRESULT SendMessage(
  HWND hWnd,      // handle to destination window
  UINT Msg,       // message
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);



MSDN里面的解释,有个朋友用中文翻译了一下


/*
这个返回值就是由相应的响应消息函数的返回值。

例如:
有自定义消息:WM_USER

其响应函数:
LRESULT Cexample::OnUser(WPARAM wParam, LPARAM lParam)

{

//….

return 0;

}

则用SendMessage(hWnd, WM_USER, wParam, lParam);消息,其返回值应该为 0.


那么我在DELPHI里面写了一个窗口子类化的函数,


//消息处理函数
function NewWndProc(WindowHandle : hWnd; Msg : LongInt; ParamW : WParam; ParamL : LParam) : LongInt ; stdcall;
 begin
    If Msg = autolg.WM_KEY_FLAG Then   //如果发送的是我的自定义消息则进入IF
    begin
          if ParamW=129990 then
          begin
            //上面的解释说是整个函数的返回值是Sendmessage
             //函数的返回值,那么我这里用
             result:=9999; //应该返回9999,可是函数返回
               //的是0,请问要求得Sendmessage返回值是在这里吗,
                //未我而来[编程群10307557] 提问
          end;


    end;


这个是我写的要求返回值的代码:
procedure TForm1.Button1Click(Sender: TObject);
var
msgType:integer;
msgN:integer;
xx:longint;
hwnd:thandle;
begin
msgType:= RegisterWindowMessage('FISH');
hwnd:=findwindow(nil,'冰淇淋');
xx:=Sendmessage(hwnd,msgtype,1122,0);
edit3.Text:=inttostr(xx);  //这里用于显示
end;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
result:=9999;
exit;
2009-12-19 22:53
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
WM_COPYDATA
不知道能不能满足你的要求
2009-12-19 23:09
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
var
//*定义一个全局变量
str:string[200];

var
s:pchar;
begin
str:= 'dasdasd';     
s:= str[1];
str[length(str)]:=#0;
postmessage(hwnd,...,...,integer(s));

end;
2009-12-20 04:30
0
雪    币: 121
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=网络游侠;729757]var
//*定义一个全局变量
str:string[200];

var
s:pchar;
begin
str:= 'dasdasd';     
s:= str[1];
str[length(str)]:=#0;
postmessage(hwnd,...,...,integ...[/QUOTE]

谢谢网络游侠,只是不知道这个消息如何接受

var
buff:pchar;
begin
new(buff);
buff=pchar(lparam);
Dispose(buff);

接收的方式好像不对! 各位大哥请明示
end;
2010-1-4 18:44
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
你自己写一个消息循环来处理你自己发来的消息!如果你应用程序向DLL发送消息的话,就需要消息循环来处理了
2010-1-14 02:56
0
游客
登录 | 注册 方可回帖
返回
//