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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 23:04   #1
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Сообщение Как узнать что твоя программа потеряла фокус?

Как узнать что твоя программа потеряла фокус, когда пользователь переключается на какое-нибудь другое приложение (onDeactivate не подходит, программа имеет много окон, которые одновременно могут быть открыты)? И в результате этого программа должна выполнять какое-то действие (код).
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 07.05.2009, 00:43   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Можете использовать функцию GetForegroundWindow.
Но лучше всего делать так:
Код:
 Private
    { Private declarations }
    Procedure LastFocus(Var Mess : TMessage);
    Message WM_ACTIVATE;
...
Procedure TForm1.LastFocus(Var Mess : TMessage);
Begin
If Mess.wParam = WA_INACTIVE Then
Form1.Color:=ClInactiveCaption
Else
Form1.Color:=ClActiveCaption;
Inherited;
End;
Всегда рад помочь!

Последний раз редактировалось Terran; 07.05.2009 в 02:18.
Terran вне форума Ответить с цитированием
Старый 07.05.2009, 10:04   #3
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Спасибо, но это немного не то. Что если в приложении много окон и мы переходим от одного к другому, то будет постоянно выполняться этот код в зависимости от того, к какмому окну мы его припишем. Нужно отлавливать событие, когда фокус переводится на другое открытое приложение (в т.ч. рабочий стол, меню и панель пуск), а не окно нашего приложения. И в этом случае выполнять определенный код. Ведь можно так?
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 07.05.2009, 10:26   #4
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Это должно помочь:
Код:
 Private
    { Private declarations }
    Procedure LastFocus(Var Mess : TMessage);
    Message WM_ACTIVATEAPP;
...
Procedure TForm1.LastFocus(Var Mess : TMessage);
Begin
If Mess.wParam = WA_INACTIVE Then
Form1.Color:=ClInactiveCaption
Else
Form1.Color:=ClActiveCaption;
Inherited;
End;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 28.07.2009, 13:41   #5
regman
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 90
По умолчанию

как постоянно держать программу активной?? То есть чтобы фокус с нее не уходил?? Или при потере фокуса возвращать его обратно на главное окно программы (программа однооконная)??

BringToFront подходит???
Apache/2.2.23 (Win32) PHP/5.3.18
Win7Pro 64
Vertrigo

Последний раз редактировалось regman; 28.07.2009 в 13:49.
regman вне форума Ответить с цитированием
Старый 28.07.2009, 14:08   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как постоянно держать программу активной??
См. предидущий пост.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2009, 14:13   #7
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

а это разве в этом разделе надо было писать? тут раздел про апи функции виндовса.
lennon вне форума Ответить с цитированием
Старый 28.07.2009, 14:29   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
тут раздел про апи функции виндовса.
А сообщения разве к WIN API не относятся?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2009, 16:30   #9
regman
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 90
По умолчанию

не работает принудительный фокус с предыдущим примером... Окно то остается спереди, но оно не активно.

private
Procedure SetMainFocus(Var Mess : TMessage);
Message WM_ACTIVATEAPP;
........................
procedure TForm1.SetMainFocus(Var Mess : TMessage);
begin
If Mess.wParam = WA_INACTIVE Then
SetForegroundWindow(Form1.Handle);
End;
Apache/2.2.23 (Win32) PHP/5.3.18
Win7Pro 64
Vertrigo
regman вне форума Ответить с цитированием
Старый 05.08.2009, 23:02   #10
regman
Пользователь
 
Регистрация: 11.07.2009
Сообщений: 90
По умолчанию

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

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

OnCreate:
hw:=Form1.Handle;

Тоесть сравниваем хэндл главной формы и хэндл текущий.

Задача та же - держать прогу под фокусом поверх всех остальных приложений. Проблема - функция SetForegroundWsndow(hw) срабатывает первый раз нормально, а последующие нет, а именно - если теряется фокус целевой программы (например клик мышкой по фоновой программе), то во второй раз окно не становится активным, а только мигает на панели задач, а сам фокус остается на только что кликнувшей программе. Вопрос - почему не работает?? Я так понял изменяется еще кое-что в программе при потере фокуса, а что именно я не знаю.
Apache/2.2.23 (Win32) PHP/5.3.18
Win7Pro 64
Vertrigo
regman вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WebBrowser как узнать что страница полностью догрузилась Comer_Jus Работа с сетью в Delphi 6 01.07.2011 09:46
Как узнать деректорию откуда запущена программа? dolphin705 Общие вопросы Delphi 4 22.03.2009 19:32
Как на JavaScript узнать, что пользователь закрыл окно? Laziz JavaScript, Ajax 1 22.02.2009 21:16
DLL!!!Как узнать что PUSH-ит!!! Kuznecov Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 10.02.2009 22:04
Как узнать что в комп вставили флешку? Alex.rus Помощь студентам 5 27.09.2008 17:30