Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.05.20;
Скачать: CL | DM;

Вниз

Запрет получения фокуса программой   Найти похожие ветки 

 
Focus77   (2010-04-21 16:17) [0]

Всем привет!

Как сделать так, чтобы окно программы не принимало фокус при клике на нем? Т.е., например, открыт блокнот и моя программа. В данный момент блокнот является активным окном.
При клике на окошке моей программы фокус должен остаться там где был (без мигания заголовка).


 
oldman ©   (2010-04-21 16:38) [1]

Form1.Enabled:=false;
:)


 
Focus77   (2010-04-21 16:45) [2]

:) Почти.
Только фокус окна, которое было активно до клика все таки теряется.
Я так предполагаю, что нужно как-то перехватывать WM_KILLFOCUS для чужого окна? Возможно ли это?


 
oldman ©   (2010-04-21 16:48) [3]

Просто идиотизм какой-то.
А если закрыть блокнот?
А как закрыть твою супер-пупер-программу?
А зачем тогда она вообще нужна на экране? Выведи ее в трей и не выводи оттуда.


 
Focus77   (2010-04-21 17:02) [4]

Не нужно делать поспешных выводов.
Программа реализует экранную клавиатуру для тачскрин экрана.
В качестве примера можно рассмотреть экранную клавиатуру винды (специальные возможности) - она обрабатывает нажатия своих кнопок, но фокус при этом никуда не гуляет.


 
Юрий Зотов ©   (2010-04-21 17:16) [5]

> Focus77   (21.04.10 16:45) [2]
> нужно как-то перехватывать WM_KILLFOCUS для чужого окна?

Гораздо проще ловить активацию своего окна.


 
oldman ©   (2010-04-21 17:22) [6]


> Юрий Зотов ©   (21.04.10 17:16) [5]
> Гораздо проще ловить активацию своего окна.


Проще, батенька, проще.
Глобальный хук на мышиный клик.
При клике обрабатываем координаты развернутых окон и их перекрытие.
Если клик пришелся таки на суперпуперклаву, обрабатываем событие.
:)))))))))))))))))))))


 
Focus77   (2010-04-21 17:23) [7]

>Гораздо проще ловить активацию своего окна.

Проще. Только нужный результат не достигается.
Прежде чем происходит активация моего окна, происходит деактивация другого. Вот именно эту самую деактивацию и нужно отменить.


 
Юрий Зотов ©   (2010-04-21 17:26) [8]


> Focus77   (21.04.10 17:23) [7]


Правильно. Но в сообщении есть хэндл только что деактивированного окна - кто мешает вернуть фокус обратно?


 
Focus77   (2010-04-21 17:29) [9]


> Правильно. Но в сообщении есть хэндл только что деактивированного
> окна - кто мешает вернуть фокус обратно?


Да-да, я уже прошел через это. Фокус вернуть можно, но:
1. Видно мигание заголовка
2. Если курсор ввода был, например, в адресной строке браузера, то при потере фокуса и обратном его возвращении весь текст в этой строке выделяется.


 
Focus77   (2010-04-21 17:32) [10]

Может действительно попробовать глабальный хук на мышь, т.е. если
PMouseHookStruct(lParam)^.hwnd принадлежит моему окну, то не вызывать следующий обработчик?


 
Юрий Зотов ©   (2010-04-21 18:17) [11]

Причина вот в чем: не
>  Запрет получения фокуса программой [D7, WinXP]
> Focus77   (21.04.10 16:17)

а так: "Запрет получения фокусом программы".
:o)


 
Leonid Troyanovsky ©   (2010-04-21 19:06) [12]


> Focus77   (21.04.10 16:17)  

> Как сделать так, чтобы окно программы не принимало фокус
> при клике на нем?

WS_EX_NOACTIVATE ?

--
Regards, LVT.


 
Dimka Maslov ©   (2010-04-21 20:51) [13]

procedure TSomeControl.WMMouseActivate(var Message: TMessage);
begin
Message.Result:=MA_NOACTIVATE;
end;


 
Focus77   (2010-04-21 22:25) [14]


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;



 
Германн ©   (2010-04-22 00:53) [15]


> Focus77   (21.04.10 17:02) [4]
>
> Не нужно делать поспешных выводов.
> Программа реализует экранную клавиатуру для тачскрин экрана.
>
> В качестве примера можно рассмотреть экранную клавиатуру
> винды

А зачем тогда своя программа?


 
brother ©   (2010-04-22 05:25) [16]

> А зачем тогда своя программа?

куча дополнительных кнопок? ;)


 
Focus77   (2010-04-22 09:03) [17]


> А зачем тогда своя программа?


> куча дополнительных кнопок? ;)


И куча ненужных/опасных кнопок и размер маловат - пальцем не потыкаешь.


 
Тарас   (2011-05-20 06:09) [18]

А у меня немножко другая задача. Есть форма, на ней много эдитов и комбобоксов. Надо запретить фокус части этих дочерних окон, так, чтоб на них даже курсор не вставал, а другие дочерние окна должны фокус получать.


 
Anatoly Podgoretsky ©   (2011-05-20 10:03) [19]

В Интернете достаточное количество рабочих экранных клавиатур!!!


 
backtheryophag   (2013-01-05 14:13) [20]

на таймер делаем form1.enabled:=false;



Страницы: 1 вся ветка

Текущий архив: 2018.05.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.004 c
2-1462800607
dmk
2016-05-09 16:30
2018.05.20
Угловые квадранты


11-1267173617
QAZ
2010-02-26 11:40
2018.05.20
SortData + Tlist


2-1462472932
Дмитрий
2016-05-05 21:28
2018.05.20
Замена строк по словарю замен


2-1463377126
selfi
2016-05-16 08:38
2018.05.20
Не ясная работа страницы в TWebbrowser


1-1271852224
Focus77
2010-04-21 16:17
2018.05.20
Запрет получения фокуса программой