Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Активизация окон с помощью SetForegroundWindow


Автор: IvanVL 7.11.2005, 08:47
По определенному событию (которое упешно отрабатывает) хочу вывести свое окно на передний план функциями: ShowWindow(H,SW_SHOWNORMAL), SetForegroundWindow(H), вместо появления, окно начинает мигать, но не вылазеет вперед, может какие то системные настройки надо покрутить smile Помогите разобраться. smile

Автор: Rrader 7.11.2005, 09:00
SetForegroundWindow должна прекрасно работать. Есть подозрение, что это событие, о котором шла речь, вызывается много раз, вот окно и мигает smile

Автор: Snowy 7.11.2005, 09:20
Нет, Просто в XP по дефолту включена настройка "Запрещать программам похищать фокус".
Поэтому вместо фокуса она начинает мигать.

Автор: IvanVL 7.11.2005, 09:26
Цитата(Snowy @ 7.11.2005, 09:20)
Нет, Просто в XP по дефолту включена настройка "Запрещать программам похищать фокус".
Поэтому вместо фокуса она начинает мигать.

А где эта настройка находиться ? По подробней опишите, а то я такую даже ну помню, не то знаю где её поменять.
Добавлено @ 09:29
Цитата(Rrader @ 7.11.2005, 09:00)
SetForegroundWindow должна прекрасно работать. Есть подозрение, что это событие, о котором шла речь, вызывается много раз, вот окно и мигает smile

Это я тоже проверю, но позже (возможно оно и так).

Автор: Snowy 7.11.2005, 09:44
Цитата(IvanVL @ 7.11.2005, 09:26)
А где эта настройка находиться

HKEY_CURRENT_USER\Control Panel\Desktop
Параметры:
ForegroundFlashCount - сколько раз мигать (по дефолту 3)
ForegroundLockTimeout - если поставить в 0, то будет сразу вылазить, без миганий.

Но лучше воспользоваться стилем окна "StayOnTop"
Так корректней, чем менять настройки системы.

Автор: Демо 7.11.2005, 10:01
К сожалению, решение этой проблемы не найдено до сих пор, поэтому есть один трюк, который позволит решить вопрос:
Пример одной реализации:

Код
 
procedure NotifyUser;
const
  PROGRAM_ALREADY_RUN = 'Программа уже запущена';
begin
  //В Windows 2000 и выше Microsoft изменила поведение SetForegroundWindow.
  //Вызов MessageBox это в общем-то трюк, используемый для того,
  //чтобы гарантированно вывести главное окно на передний план
  MessageBox(0,PROGRAM_ALREADY_RUN,PChar(ParamStr(0)), MB_ICONSTOP or MB_OK
    or MB_SYSTEMMODAL);
  SetForegroundWindow(Application.Handle);
  if assigned(Application.MainForm) then
    ShowWindow(Application.MainForm.Handle, SW_SHOW);
end;
(c) Author: c2005 Vladimir G. Yudin aka y-soft



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

Автор: Snowy 7.11.2005, 10:14
Можно еще поменять стиль окна на fsStayOnTop, а потом обратно.
Тоже работает. И без всяких боксов.

Автор: Демо 7.11.2005, 10:33
Цитата(Snowy @ 7.11.2005, 11:14)
Можно еще поменять стиль окна на fsStayOnTop, а потом обратно.
Тоже работает. И без всяких боксов.


Хорошая мысль. Надо проверить.
А фокус ввода при этом окно получит?
И еще надо восстановить точно предыдущий стиль.

Автор: IvanVL 7.11.2005, 11:07
Спасибо за помощь

Автор: Girder 7.11.2005, 11:28
AttachThreadInput: http://forum.vingrad.ru/index.php?showtopic=56552&view=findpost&p=450839

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)