消息问题,那位高手指点指点,寥寥数语而已 (50分)

  • 主题发起人 主题发起人 汪向阳
  • 开始时间 开始时间

汪向阳

Unregistered / Unconfirmed
GUEST, unregistred user!
我用自己的窗口过程替代应用程序的窗口过程,并且不返回原来窗口过程的地址,
为什么单击窗体的关闭按扭时,仍然可以关闭窗体;
示例如下:
新建一个应用程序,在窗体中放button1,button2按扭,单元整个代码如下(copy即可):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
function NewWndProc(Handle: hWnd; Msg, wParam, lParam: Longint): Longint;stdcall;
var
Form1: TForm1;

implementation

{$R *.dfm}

function NewWndProc(Handle: hWnd; Msg, wParam, lParam: Longint): Longint;
begin
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetWindowLong(Application.Handle, gwl_WndProc,
Integer(@NewWndProc));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
postmessage(application.handle,wm_close,0,0);
end;
end.
单击按扭2,退出
我先单击按扭1,再单击按扭2,不退出
无论何时单击关闭按扭,退出————————为什么?


 

Perform(wm_close,0,0);
 
我的意思不是要关闭窗体,而是为什么替代了应用程序的窗口过程,系统仍然能够
处理消息,例如关闭窗体,系统仍然能够执行
 

SetWindowLong(Handle, gwl_WndProc,
Integer(@NewWndProc));
 
“单击关闭按扭”触发的是WM_SYSCOMMAND消息而非WM_CLOSE,而你的方法似乎拦截不到
WM_SYSCOMMAND。

private
Procedure WMSysCommand(Var message : TMessage) ; Message WM_SYSCOMMAND ;
...
Procedure TForm1.WMSysCommand(Var Message : TMessage) ;
begin

if (Message.WParam = SC_CLOSE) then
begin
...
end
else
Inherited;

end;
 
别弄混了,application.handle不等于form1.handle
按叉叉是发送消息给form1,而不是application.
所以要SetWindowLong(form1.Handle, gwl_WndProc, Integer(@NewWndProc));
影子说的也对
 
楼上的兄弟说的对
Form1.Handle<>Application.Handle
 
明白,是属于最优切割问题.有个大矩形,里面放好多小矩形,怎么排列?比那个FW要简单
 
应该设置主窗口的 WndProc,你设置的是 Application 的
 
我的意思是:应用程序的窗口过程会循环检测消息,检测到,翻译消息,发送消息(通过
用户模块的协助,由系统调用),通过case来判定消息,找到,调用相应的处理过程,找不
到,由系统调用默认的处理过程,在SetWindowLong(Application.Handle, gwl_WndProc,
Integer(@NewWndProc))函数中,我用Application.handle的意思是用自己的窗口过程
NewWndProc替代应用程序的窗口过程,并且在自己的窗口过程的处理中,不返回原来窗口
过程的地址,这样,原来窗口过程也就没有机会处理,而我在我自己的窗口什么事也不做,
这样,是不是就是说我的应用程序已经屏蔽了所有的消息,为什么点击叉叉按钮还有反应,
请大侠指点指点,楼上的zw84611说的不错,我没有拦截到WM_SYSCOMMAND消息,但向上面
那样处理以后,为什么拦截不到呢?
 
我试过了,楼上的几位大侠说用handle替代application.handle都对,
向这样说,一个应用程序难道不是只有一个窗口过程吗?还是每个窗口都
有一个窗口过程
 
多人接受答案了。
 
后退
顶部