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

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

Запрет получения фокуса программой [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;
:)


Наверх

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