![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрет получения фокуса программой [D7, WinXP]
Focus77 © (2010-04-21 16:17:00)Всем привет!
Как сделать так, чтобы окно программы не принимало фокус при клике на нем? Т.е., например, открыт блокнот и моя программа. В данный момент блокнот является активным окном.
При клике на окошке моей программы фокус должен остаться там где был (без мигания заголовка).
backtheryophag (2013-01-05 14:13:00) [1]на таймер делаем form1.enabled:=false;
Anatoly Podgoretsky (2011-05-20 10:03:00) [2]В Интернете достаточное количество рабочих экранных клавиатур!!!
Тарас (2011-05-20 06:09:00) [3]А у меня немножко другая задача. Есть форма, на ней много эдитов и комбобоксов. Надо запретить фокус части этих дочерних окон, так, чтоб на них даже курсор не вставал, а другие дочерние окна должны фокус получать.
Focus77 (2010-04-22 09:03:00) [4]
> А зачем тогда своя программа?
> куча дополнительных кнопок? ;)
И куча ненужных/опасных кнопок и размер маловат - пальцем не потыкаешь.
brother (2010-04-22 05:25:00) [5]> А зачем тогда своя программа?
куча дополнительных кнопок? ;)
Германн (2010-04-22 00:53:00) [6]
> Focus77 (21.04.10 17:02) [4]
>
> Не нужно делать поспешных выводов.
> Программа реализует экранную клавиатуру для тачскрин экрана.
>
> В качестве примера можно рассмотреть экранную клавиатуру
> винды
А зачем тогда своя программа?
Focus77 (2010-04-21 22:25:00) [7]
procedure TSomeControl.WMMouseActivate(var Message: TMessage);
begin
Message.Result:=MA_NOACTIVATE;
end;
Почти, но не совсем то. При клике на моем окошке оба окна становятся неактивными.
> WS_EX_NOACTIVATE ?
>
> --
> Regards, LVT.
Да! То, что нужно!
Всем спасибо за участие и помощь!
Рабочий код (может кому пригодится):
type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
procedure CreateParams(var Params: TCreateParams); override;
.....
..
implementation
{$R *.dfm}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle + WS_EX_NOACTIVATE;
end;
Dimka Maslov (2010-04-21 20:51:00) [8]procedure TSomeControl.WMMouseActivate(var Message: TMessage);
begin
Message.Result:=MA_NOACTIVATE;
end;
Leonid Troyanovsky (2010-04-21 19:06:00) [9]
> Focus77 (21.04.10 16:17)
> Как сделать так, чтобы окно программы не принимало фокус
> при клике на нем?
WS_EX_NOACTIVATE ?
--
Regards, LVT.
Юрий Зотов (2010-04-21 18:17:00) [10]Причина вот в чем: не
> Запрет получения фокуса программой [D7, WinXP]
> Focus77 (21.04.10 16:17)
а так: "Запрет получения фокусом программы".
:o)
Focus77 (2010-04-21 17:32:00) [11]Может действительно попробовать глабальный хук на мышь, т.е. если
PMouseHookStruct(lParam)^.hwnd принадлежит моему окну, то не вызывать следующий обработчик?
Focus77 (2010-04-21 17:29:00) [12]
> Правильно. Но в сообщении есть хэндл только что деактивированного
> окна - кто мешает вернуть фокус обратно?
Да-да, я уже прошел через это. Фокус вернуть можно, но:
1. Видно мигание заголовка
2. Если курсор ввода был, например, в адресной строке браузера, то при потере фокуса и обратном его возвращении весь текст в этой строке выделяется.
Юрий Зотов (2010-04-21 17:26:00) [13]
> Focus77 (21.04.10 17:23) [7]
Правильно. Но в сообщении есть хэндл только что деактивированного окна - кто мешает вернуть фокус обратно?
Focus77 (2010-04-21 17:23:00) [14]>Гораздо проще ловить активацию своего окна.
Проще. Только нужный результат не достигается.
Прежде чем происходит активация моего окна, происходит деактивация другого. Вот именно эту самую деактивацию и нужно отменить.
oldman (2010-04-21 17:22:00) [15]
> Юрий Зотов © (21.04.10 17:16) [5]
> Гораздо проще ловить активацию своего окна.
Проще, батенька, проще.
Глобальный хук на мышиный клик.
При клике обрабатываем координаты развернутых окон и их перекрытие.
Если клик пришелся таки на суперпуперклаву, обрабатываем событие.
:)))))))))))))))))))))
Юрий Зотов (2010-04-21 17:16:00) [16]> Focus77 (21.04.10 16:45) [2]
> нужно как-то перехватывать WM_KILLFOCUS для чужого окна?
Гораздо проще ловить активацию своего окна.
Focus77 (2010-04-21 17:02:00) [17]Не нужно делать поспешных выводов.
Программа реализует экранную клавиатуру для тачскрин экрана.
В качестве примера можно рассмотреть экранную клавиатуру винды (специальные возможности) - она обрабатывает нажатия своих кнопок, но фокус при этом никуда не гуляет.
oldman (2010-04-21 16:48:00) [18]Просто идиотизм какой-то.
А если закрыть блокнот?
А как закрыть твою супер-пупер-программу?
А зачем тогда она вообще нужна на экране? Выведи ее в трей и не выводи оттуда.
Focus77 (2010-04-21 16:45:00) [19]:) Почти.
Только фокус окна, которое было активно до клика все таки теряется.
Я так предполагаю, что нужно как-то перехватывать WM_KILLFOCUS для чужого окна? Возможно ли это?
oldman (2010-04-21 16:38:00) [20]Form1.Enabled:=false;
:)