各位老师好,请教一个问题,我有时候在编程的时候需要处理一些通过消息传遍过来的数据,这些数据每次里面有字符串,要是数字还好处理字符串就比较难处理,
我收集了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;