Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отследить активизацию приложения 
:(
    Опции темы
SlaUr
Дата 15.6.2004, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Как правильно оследить ,то что мое приложение активизировано.Возможно я делаю неправильно:

В таймере отслеживаю property Application.Active, и если оно меняется с False на True выполняю свои действия.
Возможно есть более правильное решение(например существует какое-нибудь событие).

Это сообщение отредактировал(а) SlaUr - 15.6.2004, 08:03
PM MAIL   Вверх
Alex
Дата 15.6.2004, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Используй события OnActivate и OnDeactivate объекта Application, если не поможет, то за место таймера событие OnIdle объекта Application.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
SlaUr
Дата 15.6.2004, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Код
Используй события OnActivate



Извените,опять чайниковский вопрос (стыдно задавать).

Если кликнуть на событии onActivate в форме , возникает следующий код:

Код

type
 TForm1 = class(TForm)
   procedure FormActivate(Sender: TObject);
   .....


procedure TForm1.FormActivate(Sender: TObject);
begin
тут пишем свой код
end;


А что я должен написать , чтобы поймать событие Application.onActivate?
(мне нужно с этим наконец-то разобраться)





PM MAIL   Вверх
Maverick
Дата 15.6.2004, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Оформляешь отдельно процедуру, называешь как хочешь, желательно. чтоб потом понял что это.... Включаешь ее в класс формы, может необязательно, но я всегда так делаю....

Будет в разделе interface
(в зависимости от целей процедуры выбери private или public)
вот такое объявление

procedure MyProcedure(Sender : TObject);

А в разделе implementation

procedure TfmMain.MyProcedure(Sender:TObject);
begin
//вот тут должен быть твой код...
end;

После этого событию OnActivate необходимо присвоить эту процедуру... Это можно сделать с Дельфийской простотой... Лучше в OnCreate главной формы, но, в принципе, где захочешь... Можно в коде главного проекта....
Project->ViewSource...

procedure TfmMain.FormCreate(Sender: TObject);
begin
Application.OnActivate := MyProcedure;
end;

Аналогично, можно в runtime мучить события любых других компонентов...


--------------------
smile
PM ICQ GTalk   Вверх
SlaUr
Дата 15.6.2004, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Maverick Спасибо за подробный ответ.

PM MAIL   Вверх
Maverick
Дата 15.6.2004, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Всегда рад....

Вспомнил еще один способ... Может проще будет...
Есть такой компонент - ApplicationEvents на вкладке Additional.... Он, по-моему, тоже может на события Application влиять... Но я им не пользовался никогда, говорить не буду...


--------------------
smile
PM ICQ GTalk   Вверх
x77
Дата 15.6.2004, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



есть ещё третий способ:

procedure MWActivateApp (var Msg: TMessage); message WM_ACTIVATEAPP;
...


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
SlaUr
Дата 15.6.2004, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



x77 Спасибо ,вроде тоже работает.Только оно (сообщение) возникает еще и при деактивации формы (но мне это не важно).

Это сообщение отредактировал(а) SlaUr - 15.6.2004, 15:24
PM MAIL   Вверх
x77
Дата 15.6.2004, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



SlaUr, всё верно. wParam, он же fActive (boolean) определяет, что произошло: активация или деактивация, а второй параметр - lParam, он же dwThreadId, содержит идентификатор потока - владельца окна, которое активируется при fActive = TRUE или деактивируется, если fActive = FALSE. При смене активного окна сообщение посылается дважды: сначала приложению, которое теряет фокус (fActive = FALSE), потом приложению, которое его получает (fActive = TRUE).

строго говоря, оно не "тоже работает", а только оно и работает. если ты посмотришь код TApplication, там есть процедурина, переопределяющая WndProc. в ней прописан case Msg of. погляди на этот кейс. все события уровня приложения, то, что висит в AppEvents, отрабатываются именно в нём:

Код

       ...
       WM_ACTIVATEAPP:
         begin
           Default;
           FActive := TWMActivateApp(Message).Active;
           if TWMActivateApp(Message).Active then
           begin
             RestoreTopMosts;
             PostMessage(FHandle, CM_ACTIVATE, 0, 0)
           end
           else
           begin
             NormalizeTopMosts;
             PostMessage(FHandle, CM_DEACTIVATE, 0, 0);
           end;
         end;
         ...


а AppEvents просто присваивает собственные Notifier'ы событиям внутренней переменной Application.

так что на самом деле, способ всего один - WM_ACTIVATEAPP, всё остальное - для удобства smile.gif
Добавлено @ 15:41

пока писал, забыл, что хотел сказать. чтобы двойной сработки не было, проверяй Msg.wParam на 0 (деактивация) или >0 (активация). т.е., по сути, boolean.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
bear
Дата 17.6.2004, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 15.6.2004

Репутация: нет
Всего: нет



Вот еще пример, отслеживание запуска любого риложения через глобальную ловушку:
library Project2;


{$R *.res}

uses
windows,
SysUtils,
messages,
Dialogs,Unit2;

var
SaveExitProc : Pointer;
ClassName:array[0..255] of AnsiChar;
// дескрипторы ловушек
HKill: hHook = 0;


function CBTProc(code: integer; wParam: integer; lParam: integer): integer stdcall;
var Hour,Min,Sec,NSec:word;FlagName,FlagTime:boolean;
begin
FlagTime:=false;FlagName:=false;
if code >= 0 then begin
if Code=HCBT_CREATEWND then begin
Result:=1;
GetClassName(wParam, ClassName, 256);//На примере"Косынки"
if AnsiStrComp(ClassName, PChar('Solitaire'))=0 then FlagName:=true;
//Закрываем приложение
if FlagName then PostMessage(wParam,WM_CLOSE,0,0)end end
end;
Result:=CallNextHookEx(hKill, Code, wParam, lParam);
end;
procedure KillGame;stdcall;
begin
DestroyWindow((FindWindow(ClassName,nil)))
end;

procedure StartKill;stdcall;
// установка ловушки
begin
HKill :=SetWindowsHookEx(WH_CBT, @CBTProc, hInstance, 0);
if HKill = 0 then
MessageBox(0, 'Ловушка не установилась!', 'Ошибка', mb_Ok);
end;

procedure RemoveHookKill;stdcall;
// удаление ловушки
begin
if HKill<>0 then
begin
UnhookWindowsHookEx(HKill);
HKill := 0
end;
end;

procedure RemoveAllHooks;stdcall;
// удаление всех установленных ловушек
begin
OKBottomDlg.Free;
if HKill<>0
then UnhookWindowsHookEx(HKill);
ExitProc := SaveExitProc;
end;

exports
StartKill,
KillGame,
RemoveHookKill;

begin
// задание процедуры выхода, снимающей ловушки
SaveExitProc := ExitProc;
ExitProc := @RemoveAllHooks;
end.

PM MAIL   Вверх
x77
Дата 17.6.2004, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



bear, речь шла не о запуске приложения, а об активации уже запущенного. т.е., по сути, о преключениях между главными формами разных приложений.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1256 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.