Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2009, 13:22   #11
regman
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 90
По умолчанию

Вернулся я к примеру Пепел Феникса с помощью procedure AppDeactivate(Sender: TObject);

Вот код

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ...................
  Application.OnDeactivate := AppDeactivate;
  ....................
end;

procedure TForm1.AppDeactivate(Sender: TObject);
begin
  GetActiveTimer.Enabled:=True;
end;

procedure TForm1.GetActiveTimerTimer(Sender: TObject);
begin
  if Application.Active = false then
  begin
    Application.BringToFront;
    GetActiveTimer.Enabled:=False;
  end;
end;
Таймер срабатывает. Но только 1 раз почему-то. Тоесть жму на фоновое окно среды разработки Делфи - срабатывает таймер и моя прога опять становится активной и принимает комманды. Но если я опять щелкну мышью разок по фоне, то после этого никакой реакции. Что тут я упустил??

BaronTreep

Попробовал реализовать через GetKeyState. Вылез трабл следующий. Если передержать малость нажатой клавишу Ф2, то таймер сработает несколько раз. Выискивать нужный интервал срабатывания таймера - не выход.
Apache/2.2.23 (Win32) PHP/5.3.18
Win7Pro 64
Vertrigo

Последний раз редактировалось Stilet; 10.08.2009 в 11:41.
regman вне форума Ответить с цитированием
Старый 29.07.2009, 13:57   #12
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Конечно не выход. Решить можно так:

Код:
var
  Brk  : Boolean;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (-GetKeyState(VK_F4) in [127, 128]) then begin
     if not Brk then begin
        Brk  := True;
        ShowMessage('Press');
     end;
  end else
     Brk := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Brk := False;
end;
вместо ShowMessage ставьте ваш код, при нажатии он будет выполнятся только раз. Еще можно и вовсе избавится от таймера - создать отдельный поток и внём запустить цикл, но это не обязательно.
BaronTreep вне форума Ответить с цитированием
Старый 29.07.2009, 14:13   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может всетки хук поставить и не париться?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2009, 14:56   #14
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Хуки систему вешают - представьте сколько Windows приходится сообщений прокручивать, а тут ещё хуки все ставят...
BaronTreep вне форума Ответить с цитированием
Старый 29.07.2009, 15:03   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Хуки систему вешают
Глупости. Сколько ими пользовался никогда система в отказ не уходила.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2009, 21:05   #16
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Сообщение от regman Посмотреть сообщение

Код:
procedure TForm1.GetActiveTimerTimer(Sender: TObject);
begin
  if Application.Active = false then
  begin
    Application.BringToFront;
    GetActiveTimer.Enabled:=False;
  end;
end;
Таймер срабатывает. Но только 1 раз почему-то.
Что тут я упустил??
Выделенная строка ОСТАНАВЛИВАЕТ таймер
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.07.2009, 10:37   #17
regman
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 90
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Выделенная строка ОСТАНАВЛИВАЕТ таймер
он у меня активируется при деактивации самой формы
Apache/2.2.23 (Win32) PHP/5.3.18
Win7Pro 64
Vertrigo
regman вне форума Ответить с цитированием
Старый 30.07.2009, 19:45   #18
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

а есть ли уверенность что деактивация формы происходит уже после выключения таймера.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.08.2009, 17:45   #19
regman
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 90
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а есть ли уверенность что деактивация формы происходит уже после выключения таймера.
какой-то вопрос непонятный.

есть код таймера, который стартует при запуске программы (однооконной).

Код:
OnTimer:
var
hc: hwnd;
begin
hc:=GetForegroundWindow;
if hc <> hw then SetForegroundWsndow(hw);
end;

OnCreate:
hw:=Form1.Handle;
Тоесть сравниваем хэндл главной формы и хэндл текущий.

Задача та же - держать прогу под фокусом поверх всех остальных приложений. Проблема - функция SetForegroundWsndow(hw) срабатывает первый раз нормально, а последующие нет, а именно - если теряется фокус целевой программы (например клик мышкой по фоновой программе), то во второй раз окно не становится активным, а только мигает на панели задач, а сам фокус остается на только что кликнувшей программе. Вопрос - почему не работает?? Я так понял изменяется еще кое-что в программе при потере фокуса, а что именно я не знаю.

На решение этой проблемы вроде бы натолкнулся здесь http://programmersforum.ru/showthread.php?t=14681, но предложенный код работает аналогично, тоесть изменений ноль.

Код:
SetWindowPos(tMain_form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
Apache/2.2.23 (Win32) PHP/5.3.18
Win7Pro 64
Vertrigo

Последний раз редактировалось Stilet; 10.08.2009 в 11:42.
regman вне форума Ответить с цитированием
Старый 08.08.2009, 00:00   #20
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Нужно только вот это написать:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetForegroundWindow <> Handle then
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE)
  else
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;
И ещё - в фокусе оказываются сразу два окна (такое впечатление). Могут быть глюки.
BaronTreep вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянный запрос о выполнении действия (NOD32) Ronni10 Безопасность, Шифрование 2 19.12.2008 17:19
Передача данных из одной таблицы в другую, при выборе одной ячейки MickMick Microsoft Office Excel 6 06.10.2008 13:57
Acer постоянный AUTO config Carbon Компьютерное железо 4 25.04.2008 22:54
Фокус? AlexandrDel Помощь студентам 3 17.12.2006 01:54