在窗体上放一个ApplicationEvents控件在Additional页上 在ApplicationEvents的OnMessage事件中 begin if ((msg.message=WM_SYSCOMMAND) and (msg.wParam=SC_CLOSE)) then msg.message:=0; //屏蔽ALT+F4热键 end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if (GetKeyState($12)<0) and (GetKeyState($73)<0) then action:=canone; end;
//屏蔽Alt+F4 //以下为OnCloseQuery事件 procedure TForm1.CloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; end;
private procedure WMClose(var Message: TMessage);message WM_Close;procedure Tform1.WMClose(var Message: TMessage); begin //not response wm_close message if Message.WParam > 0 then inherited; end; //谁也关不了,除非你自己postmessage(handle,wm_close,1,0);
procedure TForm1.CloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; end;
form1.KeyPreview:=true; procedure Tform1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = VK_F4) and (ssAlt in Shift) then key:=char(0) end;
可以把Alt+F4作为一个快捷键,赋予空操作呀!
这个最好用: procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean); begin Handled := (GetKeyState(VK_MENU) < 0) and (Msg.CharCode = VK_F4); end;
procedure TForm1.CloseQuery(Sender: TObject; var CanClose: Boolean); begin abort; end;
在ApplicationEvents的OnMessage事件中
begin
if ((msg.message=WM_SYSCOMMAND) and (msg.wParam=SC_CLOSE)) then
msg.message:=0; //屏蔽ALT+F4热键
end;
begin
if (GetKeyState($12)<0) and (GetKeyState($73)<0) then action:=canone;
end;
//以下为OnCloseQuery事件
procedure TForm1.CloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=False;
end;
procedure WMClose(var Message: TMessage);message WM_Close;procedure Tform1.WMClose(var Message: TMessage);
begin
//not response wm_close message
if Message.WParam > 0 then
inherited;
end;
//谁也关不了,除非你自己postmessage(handle,wm_close,1,0);
begin
CanClose:=False;
end;
procedure Tform1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_F4) and (ssAlt in Shift) then
key:=char(0)
end;
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Handled := (GetKeyState(VK_MENU) < 0) and (Msg.CharCode = VK_F4);
end;
begin
abort;
end;
可以对wm_syscommand消息进行处理,然后就可以了,