![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
SlaUr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 18.9.2003 Репутация: 3 Всего: 5 |
Как правильно оследить ,то что мое приложение активизировано.Возможно я делаю неправильно:
В таймере отслеживаю property Application.Active, и если оно меняется с False на True выполняю свои действия. Возможно есть более правильное решение(например существует какое-нибудь событие). Это сообщение отредактировал(а) SlaUr - 15.6.2004, 08:03 |
|||
|
||||
Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
Используй события OnActivate и OnDeactivate объекта Application, если не поможет, то за место таймера событие OnIdle объекта Application.
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
SlaUr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 18.9.2003 Репутация: 3 Всего: 5 |
Извените,опять чайниковский вопрос (стыдно задавать). Если кликнуть на событии onActivate в форме , возникает следующий код:
А что я должен написать , чтобы поймать событие Application.onActivate? (мне нужно с этим наконец-то разобраться) |
||||
|
|||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 мучить события любых других компонентов... |
|||
|
||||
SlaUr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 18.9.2003 Репутация: 3 Всего: 5 |
Maverick Спасибо за подробный ответ.
|
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
Всегда рад....
Вспомнил еще один способ... Может проще будет... Есть такой компонент - ApplicationEvents на вкладке Additional.... Он, по-моему, тоже может на события Application влиять... Но я им не пользовался никогда, говорить не буду... |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
есть ещё третий способ:
procedure MWActivateApp (var Msg: TMessage); message WM_ACTIVATEAPP; ... -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
SlaUr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 18.9.2003 Репутация: 3 Всего: 5 |
x77 Спасибо ,вроде тоже работает.Только оно (сообщение) возникает еще и при деактивации формы (но мне это не важно).
Это сообщение отредактировал(а) SlaUr - 15.6.2004, 15:24 |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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, отрабатываются именно в нём:
а AppEvents просто присваивает собственные Notifier'ы событиям внутренней переменной Application. так что на самом деле, способ всего один - WM_ACTIVATEAPP, всё остальное - для удобства ![]() Добавлено @ 15:41 пока писал, забыл, что хотел сказать. чтобы двойной сработки не было, проверяй Msg.wParam на 0 (деактивация) или >0 (активация). т.е., по сути, boolean. -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
bear |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
bear, речь шла не о запуске приложения, а об активации уже запущенного. т.е., по сути, о преключениях между главными формами разных приложений.
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |