![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать, чтобы с формы нельзя было никуда переулючиться...
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]Модальные окна как раз для этого и предназначены.