Форум: "WinAPI";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
ВнизАктивация формы Найти похожие ветки
← →
sergserg (2002-10-03 17:17) [0]Здравствуйте уважаемые.
Вот возник вопрос.Есть работающее приложение.В нем несколько форм. Одна форма sayontop и вот необходимо чтобы при потере фокуса этой формы она опять стала активной (ввод был направлен в нее) Момент потери активации формы я отлавливаю через wm_activatepp а вот как сделать форму снова активной не получается. SetForegroundWindow() не помогает на первом контроле формі появляется ободок (дескать готов к вводу) а весь ввод с клаві по прежнему направлен на другое приложение.
Помогите. Очень надо!!!
← →
Игорь Шевченко (2002-10-03 17:24) [1]В кладовке, в разделе "Готовые программы" есть программа StayOnTop - может, что оттуда пригодится ?
← →
Song (2002-10-03 18:13) [2]SetFocus
← →
sergserg (2002-10-03 18:29) [3]SetFocus не помогает.
Как писал Юрий Зотов
"Возврат фокуса - Дельфишный SetFocus или SetFocus из API. Ошибка в
том, что Вы не управляете фокусом, а просто ставите TopMost всему
родительскому окну. Но, ведь если при этом фокус имеет одно из его
дочерних окон, то родительское уже и так наверху. Поэтому ничего и
не происходит, хотя функция, конечно, отрабатывает нормально"
так как же активировать форму ?
← →
Song (2002-10-03 18:34) [4]Я не сталкивался с такими случаями когда SetFocus мне не помогал установить фокус ввода (чтобы там находился курсор)
← →
sergserg (2002-10-03 19:07) [5]Не получается может из за того что форма не главная. Кнопа обводится а при нажатии клавшь действия происходят в др программе.
← →
Song (2002-10-03 19:38) [6]Ну попробуйте SetActiveWindow()
← →
sergserg (2002-10-03 19:47) [7]Сейчас ради примера взял чистую форму.+ Две кнопки+лайбел. Обрабатываю сообщение WM_ACTIVATEAPP если приложение становится не активным в лейбел пишу сообщение затем setforegroundwindow(form1.handle). Запускаю клацаю мышей на раб стол. На форме появляется знак что она не активна и мигает иконка в таскбаре. М все а курсор как на раб столе был так и остался.
SetActiveWindow() тоже не помог и SEtForus - никаких реакций.
← →
diesel (2002-10-04 12:48) [8]Абсолютно аналогичная фигня. Пробовал много вариантов, сейчас уже не припомню все:
SetForegroundWindow с использованием SystemParametersInfo (с каким-то там параметром)
SetFocus
SetActiveWindow
какая-то апи-функция с изменением z-индекса
ещё какие-то, не помню
помогло только одно: сначала закрываем активное окно, потом SetFocus и SetForegroundWindow
в остальных случаях приложение просто выводится на передний план и флэшится в таскбаре.
порекомендуйте чаво-нибудь.
← →
sergserg (2002-10-04 15:23) [9]Попробовал следующее
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-07 05:53) [10]Что-то подобное тоже пробовал, не помогало. Сегодня попробую ещё раз.
PS. Ни у кого других вариантов нет?
← →
diesel (2002-10-07 11:20) [11]Попробовал и этот вариант, не помогло.
Что, никто ничего дельного и работающего предложить не может?
PS. Сделать такое точно можно (Winpopup и Heroes of Might and Magic такое делают)
← →
_dr (2002-10-07 15:15) [12]а как насчет
ShowWindow(Handle, SW_SHOWNORMAL)? - покажет и активирует окно
← →
sergserg (2002-10-07 17:05) [13]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. и потом оключался.
Иначе фокус уходил неизвестно куда. Нет его ни в приложении ни в форме????.(подозреваю очередь сообщений )
← →
diesel (2002-10-08 05:41) [14]_dr, в хелпе много такого написано (Activates and displays the window). Однако на заборе тоже написано,.. а там, как известно, дрова. Никакие манипуляции с ShowWindow не помогают.
sergserg, мысли не понял, но последнее аналогично: фокус уходит неизвестно куда, либо остаётся у активного приложения.
вчера отмёл ещё один вариант: отсылку сообщений wm_killfocus и wm_setfocus. Есть ещё идеи?
← →
diesel (2002-10-08 05:55) [15]блин, совсем плохо. messagedlg и showmessage даже не выводят аппликатион на верх з-ордера, не говоря уже про активацию. Райзить еггог тоже не помогает.
Люди, ну подкиньте работающую идею ;(
← →
diesel (2002-10-08 07:23) [16]Есть какая-то функция SelectWindow, в help"е не описана. Не могу только понять, какой модуль надо use, чтобы можно было её использовать.
← →
sergserg (2002-10-09 08:45) [17]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-17 09:52) [18]странная фигня: скомпиляли в джаве шняжку, вытаскивающую и использующую SetForegroundWindow из user32.dll, работает 100%-но и на 98-ых, и на ХП, и на 2000-ых...
Делфи -- сакс?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c