关于PostMessage和PeekMessage(再加50) (5分)

  • 主题发起人 主题发起人 phenix_sd
  • 开始时间 开始时间
P

phenix_sd

Unregistered / Unconfirmed
GUEST, unregistred user!
type
MyArr=array[0..255] of char;
PMyArr=^MyArr;

procedure TForm1.Button2Click(Sender: TObject);
var str:MyArr;
begin
str:='lol';
PostMessage(HWND_BROADCAST,WM_SETTEXT,0,integer(@str));
end;

procedure TForm1.Button1Click(Sender: TObject);
var Buffer:MSG;
begin
PeekMessage(Buffer,0,WM_SETTEXT,WM_SETTEXT,PM_NOREMOVE);
edit2.Text:=PMyArr(buffer.lParam)^;//Label
end;

edit2.Text出不来,编译通过,运行时//label处报错,
调试时发现PMyArr(buffer.lParam)^全#0,就是说没赋值,why????????

 
是了,不用你peek消息的,你哪来得及peek,人家已经在消息循环里面处理了
你在钩子里面等待就是了
 
那如果已经处理了WM_SETTEXT消息,并移走的话从form1到edit1,2等的标签
不都要变成我设的'lol'了吗?
我初学消息,很想搞明白,多谢了
 
归根到底你不是要用钩子吗,你不用自己去发消息,往上面写字就是了
 
那为什么下面的代码不行????
function GetTextHookProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var buffer:TMSG;
st:array[0..255] of char;
begin
st:='hello';
buffer:=PMSG(lParam)^;
if nCode<0 then
begin
result:=CallNextHookEx(hhk,nCode,wParam,lParam);
end
else if (buffer.message=WM_SETTEXT) then
begin
SendMessage(form1.edit2.handle,WM_SETTEXT,0,integer(@st));//测试,没反应
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Buffer:MSG;
begin
hhk:=SetWindowsHookEx(WH_GETMESSAGE,GetTextHookProc,Hinstance,0);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
UnHookWindowsHookEx(hhk);
close;
end;
 
接受答案了.
 
跨进程的hook必须使用file mapping,定义跨进程可使用的内存区域
你收缩 CreateFileMapping 可以找到很多相关的内容
 
比如: http://www.delphibbs.com/delphibbs/dispq.asp?lid=635375
 
后退
顶部