Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать, чтобы с формы нельзя было никуда переулючиться...


3d ©   (2002-09-29 16:20:00) 

Народ, помогите, как сделать, чтобы с формы нельзя было никуда переулючиться, до тех пор пока на ней не выполнят предписанные программой действия (не Modal Window). Например, когда выскакивает важное системное сообщение, в котором пока не нажмёшь ОК нельзя переключиться на любое другое окно или рабочий стол.


Ученик   (2002-09-29 21:25:00) [1]

Ученик © (29.09.02 20:23)

private
{ Private declarations }
FWindowList : Pointer;

type
PTaskWindow = ^TTaskWindow;
TTaskWindow = record
Next: PTaskWindow;
Window: HWnd;
end;

var
TaskWindowList: PTaskWindow = nil;

function DoDisableWindow(Window: LongInt; Data: LongInt): Bool; stdcall;
var
P: PTaskWindow;
begin
if (Window <> Data) and (Window <> GetWindowLong(Data, GWL_HWNDPARENT)) and
IsWindowVisible(Window) and IsWindowEnabled(Window) then
begin
New(P);
P^.Next := TaskWindowList;
P^.Window := Window;
TaskWindowList := P;
EnableWindow(Window, False);
end;
Result := True;
end;

function DisableTaskWindows(ActiveWindow: HWnd): Pointer;
begin
TaskWindowList := nil;
try
EnumWindows(@DoDisableWindow, ActiveWindow);
Result := TaskWindowList;
except
EnableTaskWindows(TaskWindowList);
raise;
end
end;

procedure EnableTaskWindows(WindowList: Pointer);
var
P: PTaskWindow;
begin
while WindowList <> nil do
begin
P := WindowList;
if IsWindow(P^.Window) then EnableWindow(P^.Window, True);
WindowList := P^.Next;
Dispose(P);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FWindowList := DisableTaskWindows(Handle)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
EnableTaskWindows(FWindowList);
FWindowList := nil
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if FWindowList <> nil then
EnableTaskWindows(FWindowList)
end;


Юрий Зотов   (2002-09-29 20:56:00) [2]

После чего программа, считающая, что ее окна и есть самые важные во всей системе будет начисто снесена. Получится - "за что боролись, на то и напоролись".

Если действительно нужно вывести важное сообщение, используйте MessageBox с флагом MB_SYSTEMMODAL. Нормальной программе этого вполне достаточно.


TTCustomDelphiMaster   (2002-09-29 20:38:00) [3]

И тысячи испуганых юзверей побегут к админам с криком "У меня комп завис!!!".


Ученик   (2002-09-29 20:23:00) [4]

Как идея, запретить (через EnableWindow) все окна кроме своего.


3d   (2002-09-29 19:36:00) [5]

На любое, будь то открытая в окне папка или окно программы. Нечто подобное есть при открытии окна Open/Save Dialog или при важных системных сообщениях, где пока не нажмёшь Save/Open/OK и т.д., либо Cansel, никуда не переключишся будет только звук типа Ding.


Song   (2002-09-29 19:30:00) [6]

В смысле на чужое окно-то?


3d   (2002-09-29 19:29:00) [7]

PaRL

Модальные окна как раз для этого и предназначены.

-----------------------------------------------------------------
Я пробовал сделать форму модальной (Form1.ShowModal), но с неё вполне можно переключиться на другое окно. Может я что-то делаю не так, напишите pls кто-нибудь код.


Manulo   (2002-09-29 19:11:00) [8]

Есть способ... Заблокируй клаву и мышку! Правда при его использовании ты врядли нажмёшь ок! :=)


PaRL   (2002-09-29 16:22:00) [9]

Модальные окна как раз для этого и предназначены.


Наверх

Титульная страница Поиск, карта сайта Написать письмо