Каким образом можно спрятать
приложение от показа при нажатии Alt+Tab?
Пример (работает только в Win'95):Прислал Сергей 14.10.2001
var WnHnd : Integer;
. . . .
WnHnd :=GetWindowLong(Application.Handle, GWL_EXSTYLE);
WnHnd :=WnHnd or WS_EX_TOOLWINDOW;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);
. . . .
...
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
{ вызов унаследованного
обpаботчика }
if M.Result=htClient then { Мышь сидит
на
окне?
}
M.Result :=htCaption;
{ Если да - то пусть Windows думает, что }
{ мышь на caption
bar
}
end;
........................................................
a) Создайте форму со размером maximized и без
системных кнопок.
b) В обработчике FormDeactivate для формы вызовите
метод setFocus - это предотвратит
Ctrl + Esc: Form1.SetFocus;
c) В обработчике события FormActivate, нужно присвоить
метод Deactivate для приложения :
Application.onDeactivate :=FormDeactivate;
d) Создайте всплывающее меню (popup) с единственным
пунктом. В свойствах данного пункта нужно
установить Visible=False. Создайте процедуру для
этого пункта меню, делающую что-нибудь
тривиальное типа x :=1 (для того, чтобы Delphi не
удалил эту процедуру).
e) Присвойте созданное Popup меню форме (свойство
Popupmenu).
f) Задайте горячую клавишу (shortcut) для Popup меню в
методе FormActivate как показано ниже:
NullItem1.shortcut :=ShortCut(VK_Tab, [ssAlt]);
(!!!: NullItem1 нужно заменить на название созданного
вами объекта - пункта меню)
procedure TForm1.FormCreate(Sender: TObject);
i Style: Longint;
begin
Style :=GetWindowLong(Handle, GWL_STYLE);
SetWindowLong(Handle, GWL_STYLE, Style And Not WS_SYSMENU);
end;
procedure TForm1.FormKeyDown(Sender: TObject; i Key: Word; Shift: TShiftState);
begin
if (Key=VK_F4) and (ssAlt in Shift) then begin
MessageBeep(0); Key :=0;
end;
end;
А следующий текст убирает команду закрыть из
системного меню и одновременно делает серой
кнопку закрыть в заголовке формы:
procedure TForm1.FormCreate(Sender: TObject);
i hMenuHandle:HMENU;
begin
hMenuHandle :=GetSystemMenu(Handle, FALSE);
IF (hMenuHandle <> 0) THEN
DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);
end;
События нажатия на системные кнопки
формы (минимизация, закрытие...)
Прислал Aries 31.10.2001
Хотелось бы чтобы при нажатии на кнопку minimize
программа исчезала из таскбара.
При нажатии на эти кнопки происходит сообщение
WM_SYSCOMMAND, его то и надо перехватить.
При этом:
uCmdType=wParam; // type of system command requested
xPos=LOWORD(lParam); // horizontal postion, in screen coordinates
yPos=HIWORD(lParam); // vertical postion, in screen coordinates
Пример:
Type TMain=class(TForm)
....
protected
Procedure WMGetSysCommand(var Message :TMessage); message WM_SYSCOMMAND;
end;
.....
//------------------------------------------------------------------------
// Обработка сообщения WM_SYSCOMMAND (перехват минимизации окна)
//------------------------------------------------------------------------
Procedure TForm1.WMGetSysCommand(var Message : TMessage) ;
Begin
IF (Message.wParam=SC_MINIMIZE) Then Form1.Visible:=False
Else Inherited;
End;
Скурихин А.М 2.11.2001
Ниже приведён пример формы на которую можно
перетаскивать файлы. В данном случае они
открываються.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,StdCtrls, ShellAPI {ПОДКЛЮЧИТЬ};
type
TForm1=class(TForm)
FileList: TMemo;
FileNameLabel: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
protected
{Наша процедура обработки
необходимого сообщения}
procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles;
end;
i
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMDropFiles(var Msg: TMessage);
i
Filename: array[0 .. 256] of Char;
Count : integer;
begin
{ Получаем количество
перетащенных файлов ) }
nCount :=DragQueryFile( msg.WParam, $FFFFFFFF,
acFileName, cnMaxFileNameLen);
{ Получаем имя первого из них }
DragQueryFile( THandle(Msg.WParam),
0, { номер файла }
Filename,SizeOf(Filename) ) ;
{ И открываем его }
with FileNameLabel do begin
Caption :=LowerCase(StrPas(FileName));
FileList.Lines.LoadfromFile(Caption);
end;
{ Говорим windows что сообщение
обработано }
DragFinish(THandle(Msg.WParam));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Говорим Windows, что на нашу форму
можно бросать файлы }
DragAcceptFiles(Handle, True);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Как создать свою кнопку в заголовке
формы (на Caption Bar)
Прислал Aries
3.11.2001 Непосредственно такой функции вроде
нет, но можно изловчиться. Нарисовать там кнопку
вручную и обрабатывать команды нажатия мышки на
Caption Bar.
Пример.
unit Main;
interface
uses
Windows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1=class(TForm)
procedure FormResize(Sender: TObject);
private
CaptionBtn : TRect;
procedure DrawCaptButton;
procedure WMNCPaint(var Msg : TWMNCPaint); message WM_NCPaint;
procedure WMNCActivate(var Msg : TWMNCActivate); message WM_NCACTIVATE;
procedure WMSetText(var Msg : TWMSetText); message WM_SETTEXT;
procedure WMNCHitTest(var Msg : TWMNCHitTest); message WM_NCHITTEST;
procedure WMNCLButtonDown(var Msg : TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
public
{ Public declarations }
end;
i
Form1: TForm1;
implementation
const
htCaptionBtn=htSizeLast + 1;
{$R *.DFM}
procedure TForm1.DrawCaptButton;
i
xFrame, yFrame, xSize, ySize : Integer;
R : TRect;
begin
//Dimensions of Sizeable Frame
xFrame :=GetSystemMetrics(SM_CXFRAME);
yFrame :=GetSystemMetrics(SM_CYFRAME);
//Dimensions of Caption Buttons
xSize :=GetSystemMetrics(SM_CXSIZE);
ySize :=GetSystemMetrics(SM_CYSIZE);
//Define the placement of the new caption button
CaptionBtn :=Bounds(Width - xFrame - 4*xSize + 2,
yFrame + 2, xSize - 2, ySize - 4);
//Get the handle to canvas using Form's device context
Canvas.Handle :=GetWindowDC(Self.Handle);
Canvas.Font.Name :='Symbol';
Canvas.Font.Color :=clBlue;
Canvas.Font.Style :=[fsBold];
Canvas.Pen.Color :=clYellow;
Canvas.Brush.Color :=clBtnFace;
try
DrawButtonFace(Canvas, CaptionBtn, 1, bsAutoDetect, False, False, False);
//Define a smaller drawing rectangle within the button
R :=Bounds(Width - xFrame - 4 * xSize + 2,
yFrame + 3, xSize - 6, ySize - 7);
with CaptionBtn do
Canvas.TextRect(R, R.Left + 2, R.Top - 1, 'W');
finally
ReleaseDC(Self.Handle, Canvas.Handle);
Canvas.Handle :=0;
end;
end;
procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);
begin
inherited;
DrawCaptButton;
end;
procedure TForm1.WMNCActivate(var Msg : TWMNCActivate);
begin
inherited;
DrawCaptButton;
end;
procedure TForm1.WMSetText(var Msg : TWMSetText);
begin
inherited;
DrawCaptButton;
end;
procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);
begin
inherited;
with Msg do
if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then
Result :=htCaptionBtn;
end;
procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);
begin
inherited;
if (Msg.HitTest=htCaptionBtn) then
ShowMessage('You hit the button on the caption bar');
end;
procedure TForm1.FormResize(Sender: TObject);
begin
//Force a redraw of caption bar if form is resized
Perform(WM_NCACTIVATE, Word(Active), 0);
end;
end.
Исползование обработчика OnHint при
наличии нескольких форм.
Online Help и в Visual Component Library Reference описан пример
обработчика события OnHint объекта TApplication. Пример
показывает, как можно использовать панель для
отображения подсказок (hint), связанных с другими
компонентами. В примере обработчик OnHint
устанавливается во время обработки события OnCreate
для формы; в программе, включающей более чем одну
форму, будет трудно использовать эту технику.
Перемещение присваивания обработчика OnHint из
события OnCreate формы в событие OnActivate позволит
различным формам данного приложения работать с
подсказками, как им нужно. Ниже приведен
измененный пример из OnLine Help и VCL Reference.