如何发送消息(如WM——MOUSEMOVE)(100分)

  • 主题发起人 主题发起人 Jamw
  • 开始时间 开始时间
J

Jamw

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]请问,如何用SENDMESSAGE发送消息。例如我要向窗体发送WM——MOUSEMOVE消息。
它带了三个参数。而用SENDMESSAGE时除了句柄和消息名,就只剩下两个参数的位置了。
我如何将三个参数填到两个位置上去?
 
实际上还是两个参数:wParam和lParam,所谓三个参数是由于lParam参数本身带了两个值。
它的低位字是鼠标的X座标,高位字是鼠标Y座标。lParam参数可以写成MAKELPARAM(X, Y)
 
能举个实例吗?比如移到0,0
我用的时候老提示STACK OVER
 
是STACK OVERFLOW
 
procedure TForm1.Button2Click(Sender: TObject);
begin
; sendmessage(handle,wm_mousemove,0,0);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
; Y: Integer);
begin
; showmessage('sdf');
end;
 
TO Brave: 还是提示STACK OVERFLOW
我还试过这么写的。
(0,0)座标是放在变量tmp中的。
SENDMESSAGE(FORM1。HANDLE,WM_MOUSEMOVE,0,MAKELPARAM(X, Y));
不管怎么试,都是提示STACK OVERFLOW
 
我试的没有问题,可能是你的formmousemove事件产生了循环调用吧
 
Brave说的对,你把那一句写在了哪个事件里?

不过Brave给出的例子可不太好操作啊:)需要鼠标和键盘配合,不然就出不来了。
 
你们好像搞错了吧,WM_MOUSEMOVE是个通知消息,是鼠标移动后通知窗口的消息,
不是可以移动鼠标的消息。
 
呵呵,有道理,我也没有注意到Jamw提到了“比如[red]移到[/red]0,0”。
我们只是就事论事,不知道Jamw到底要实现什么样的效果?
 
不好意思 ,是我弄错了。要用发消息的方法实现移动窗体该如何作呢?
我要实现:
在窗体移动时,如果窗体左边界小于30,则左边界等于0;
 
参考一下这段完整的pas文件代码——
代码:
unit Unit1;

interface

uses
 ; Windows, Messages, Forms;

type
 ; TForm1 = class(TForm)
 ;  ; procedure FormCreate(Sender: TObject);
 ; protected
 ;  ; LastX: Integer;
 ;  ; procedure WMMoving(var Message: TMessage); message WM_MOVING;
 ;  ; procedure WMMove(var Message: TWMMouse); message WM_MOVE;
 ; end;

var
 ; Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ; LastX := Left;
end;

procedure TForm1.WMMoving(var Message: TMessage);
var
 ; R: TRect;
begin
 ; with Message do begin
 ;  ; R := PRect(lParam)^;
 ;  ; if (R.Left < 30) and (R.Left < LastX) then begin
 ;  ;  ; OffSetRect(R, -R.Left, 0);
 ;  ;  ; CopyRect(PRect(lParam)^, R);
 ;  ;  ; Result := 1;
 ;  ; end else inherited;
 ;  ; LastX := R.Left;
 ; end;
end;

procedure TForm1.WMMove(var Message: TWMMouse);
begin
 ; inherited;
 ; if Left < 30 then Left := 0;
end;

end.
 
请问,为什么要用到WMMove。
ONCRETE中不赋值好象也可以达到同样的效果,它起什么作用?
 
之所以用到WM_MOVE,是因为上述代码的具体效果是当窗体的左边界落入屏幕左侧30个像素
之内的“粘附区”的时候,仅当用户拖动窗体继续左移的情况下窗体才会贴在最左边;
如果窗体被拖右移,我们应该认为用户想将窗体拖离左侧粘附区,这样在WM_MOVING消息
的处理中就不应该强迫窗口的左边置0,否则理论上窗口将永远无法离开左侧30个像素之外了。
但如果只是这样,无法保证用户在粘附区之内向右拖动窗口并最终仍停在粘附区内的时候
仍旧可以达到归0的效果——对WM_MOVE消息的处理就是为了保证这种情况下的正确效果。

LastX这个变量是用来判定窗口是否正在进行左移用的,它的值就是窗口上一次移动后的Left值。
在OnCreate里给它赋值是为了保证逻辑上的清晰,不赋初值的话第一次用到它的时候它是个随机数。
 
多人接受答案了。
 
后退
顶部