Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Активация формы [D5, Win95/98, WinME]


sergserg ©   (2002-10-03 17:17:00) 

Здравствуйте уважаемые.
Вот возник вопрос.Есть работающее приложение.В нем несколько форм. Одна форма sayontop и вот необходимо чтобы при потере фокуса этой формы она опять стала активной (ввод был направлен в нее) Момент потери активации формы я отлавливаю через wm_activatepp а вот как сделать форму снова активной не получается. SetForegroundWindow() не помогает на первом контроле формі появляется ободок (дескать готов к вводу) а весь ввод с клаві по прежнему направлен на другое приложение.
Помогите. Очень надо!!!


diesel   (2002-10-17 09:52:00) [1]

странная фигня: скомпиляли в джаве шняжку, вытаскивающую и использующую SetForegroundWindow из user32.dll, работает 100%-но и на 98-ых, и на ХП, и на 2000-ых...
Делфи -- сакс?


sergserg   (2002-10-09 08:45:00) [2]

diesel-у Вообщем так в приложении ловим сообщение Wm_activateapp
если Wpatam =0 значит активируется другое приложение и тогда мы запускаем таймер допустим на 50 мл сек и в таймере пишем
AttachThreadInput(LPARAm (берем из EM_ACTIVATEAP),
GetWindowThreadProcessID(form3.handle,nil),true);
SETForeGroundWindow(form.handle)
AttachThreadInput(LPARAM,
GetWindowThreadProcessID(form3.handle,nil),false);
Если все делать в общод таймера фокус уходит в некуда. Но єтот способ не помогает для фара не работает и в случае свернутого окна.
Насчет SelectWindows - оч интересно. Надо покопаться.


diesel   (2002-10-08 07:23:00) [3]

Есть какая-то функция SelectWindow, в help"е не описана. Не могу только понять, какой модуль надо use, чтобы можно было её использовать.


diesel   (2002-10-08 05:55:00) [4]

блин, совсем плохо. messagedlg и showmessage даже не выводят аппликатион на верх з-ордера, не говоря уже про активацию. Райзить еггог тоже не помогает.

Люди, ну подкиньте работающую идею ;(


diesel   (2002-10-08 05:41:00) [5]

_dr, в хелпе много такого написано (Activates and displays the window). Однако на заборе тоже написано,.. а там, как известно, дрова. Никакие манипуляции с ShowWindow не помогают.

sergserg, мысли не понял, но последнее аналогично: фокус уходит неизвестно куда, либо остаётся у активного приложения.

вчера отмёл ещё один вариант: отсылку сообщений wm_killfocus и wm_setfocus. Есть ещё идеи?


sergserg   (2002-10-07 17:05:00) [6]

diesel-у да немногоя ошибся обработку
Wnd := GetForeGroundWindow;
AttachThreadInput(GetWindowThreadProcessID(Wnd,nil),
GetWindowThreadProcessID(form3.handle,nil),true);
form3.setfocus;
AttachThreadInput(GetWindowThreadProcessID(Wnd,nil),
GetWindowThreadProcessID(form3.handle,nil),false);
писал в таймере которій запускался через надцать милисекунд после WM_ACTIVATEAPP. и потом оключался.
Иначе фокус уходил неизвестно куда. Нет его ни в приложении ни в форме????.(подозреваю очередь сообщений )


_dr   (2002-10-07 15:15:00) [7]

а как насчет
ShowWindow(Handle, SW_SHOWNORMAL)? - покажет и активирует окно


diesel   (2002-10-07 11:20:00) [8]

Попробовал и этот вариант, не помогло.

Что, никто ничего дельного и работающего предложить не может?
PS. Сделать такое точно можно (Winpopup и Heroes of Might and Magic такое делают)


diesel   (2002-10-07 05:53:00) [9]

Что-то подобное тоже пробовал, не помогало. Сегодня попробую ещё раз.

PS. Ни у кого других вариантов нет?


sergserg   (2002-10-04 15:23:00) [10]

Попробовал следующее
Wnd := GetForeGroundWindow;
AttachThreadInput(GetWindowThreadProcessID(Wnd,nil),
GetWindowThreadProcessID(form3.handle,nil),true);
form3.setfocus;
AttachThreadInput(GetWindowThreadProcessID(Wnd,nil),
GetWindowThreadProcessID(form3.handle,nil),false);
Для виндозовских приложений работае. А вот для Far не всегда. Люди помогииииите.........


diesel   (2002-10-04 12:48:00) [11]

Абсолютно аналогичная фигня. Пробовал много вариантов, сейчас уже не припомню все:
SetForegroundWindow с использованием SystemParametersInfo (с каким-то там параметром)
SetFocus
SetActiveWindow
какая-то апи-функция с изменением z-индекса
ещё какие-то, не помню
помогло только одно: сначала закрываем активное окно, потом SetFocus и SetForegroundWindow

в остальных случаях приложение просто выводится на передний план и флэшится в таскбаре.
порекомендуйте чаво-нибудь.


sergserg   (2002-10-03 19:47:00) [12]

Сейчас ради примера взял чистую форму.+ Две кнопки+лайбел. Обрабатываю сообщение WM_ACTIVATEAPP если приложение становится не активным в лейбел пишу сообщение затем setforegroundwindow(form1.handle). Запускаю клацаю мышей на раб стол. На форме появляется знак что она не активна и мигает иконка в таскбаре. М все а курсор как на раб столе был так и остался.
SetActiveWindow() тоже не помог и SEtForus - никаких реакций.


Song   (2002-10-03 19:38:00) [13]

Ну попробуйте SetActiveWindow()


sergserg   (2002-10-03 19:07:00) [14]

Не получается может из за того что форма не главная. Кнопа обводится а при нажатии клавшь действия происходят в др программе.


Song   (2002-10-03 18:34:00) [15]

Я не сталкивался с такими случаями когда SetFocus мне не помогал установить фокус ввода (чтобы там находился курсор)


sergserg   (2002-10-03 18:29:00) [16]

SetFocus не помогает.
Как писал Юрий Зотов
"Возврат фокуса - Дельфишный SetFocus или SetFocus из API. Ошибка в
том, что Вы не управляете фокусом, а просто ставите TopMost всему
родительскому окну. Но, ведь если при этом фокус имеет одно из его
дочерних окон, то родительское уже и так наверху. Поэтому ничего и
не происходит, хотя функция, конечно, отрабатывает нормально"
так как же активировать форму ?


Song   (2002-10-03 18:13:00) [17]

SetFocus


Игорь Шевченко   (2002-10-03 17:24:00) [18]

В кладовке, в разделе "Готовые программы" есть программа StayOnTop - может, что оттуда пригодится ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо