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

Вниз

Как не дать юзеру сбить фокус с моего окна?   Найти похожие ветки 

 
Premium ©   (2002-06-29 23:18) [0]

САБЖ


 
lak_b ©   (2002-06-30 00:20) [1]

поставь таймер в 1 милесекунду и делай примерно след.

SetForegroundWindow(wnd);

wnd - хедл твоего окна
эта процедурка вроде вытаскивает наверх окошко...


 
kaif ©   (2002-06-30 04:18) [2]

Я бы такую программу в жизни на свой комп не поставил.:(
Вы что, хотите чтобы все юзеры разбежались?


 
Anatoly Podgoretsky ©   (2002-06-30 12:37) [3]

kaif © (30.06.02 04:18)
Не волнуйсяЮ самый верный путь не сбить фокус, это поместить эту программу в корзину


 
Cobalt ©   (2002-06-30 13:07) [4]

А я просто Alt+F4 нажму.
P.S. скоро появиться вопрос "Как перехватить нажатие Alt+F4"?
А то ведь некоторые умные еще и Ctrl+Alt+Del могут нажать ;))


 
Юрий Зотов ©   (2002-06-30 18:29) [5]

> А то ведь некоторые умные еще и Ctrl+Alt+Del могут нажать

И правильно сделают, пожалуй. А потом - в корзину. И тоже правильно сделают.


 
Proton ©   (2002-06-30 19:27) [6]

зачем таймер - onDeactivate - событие - когда юзер ущел с окна вот и активируй его снова
SetForegroundWindow(form1.handle);
// ты наверной знаеш что это плохой тон не давать юзверю пользоваться маздазадачночстью (вдруг ему надо громкость в проигрывателе убавить)
пишеш очередную программу-паразит ?


 
Premium ©   (2002-06-30 21:35) [7]

Проблема гораздо банальнее чем вы думаете. У соседа новый компьютер и младщая сестра. Как вы понимаете это две не совместимые вещи. Вот и попросил он меня написать програмку которая бы спрашивала пароль и т.д. Я так сказать "ученичёк".
Вот и задал вопрос на форуме.

Кстати "..толи ветер нынче пьян, толи леший нынче пьян..", но всё ещё можно перейти в другое окно...


 
Premium ©   (2002-06-30 21:49) [8]

Пардон :)
то-ли ветео нынче пьян, то-ли леший нынче рьян.


 
Юрий Зотов ©   (2002-06-30 21:51) [9]

Выставьте пароль в CMOS - и ничего писать не надо. Гораздо проще и гораздо надежнее будет.

А SetForegroundWindow под 2k/XP/ME запросто может и не сработать, так уж они устроены. Есть недокументированная функция SwitchToThisWindow, но это уже другая тема.


 
Premium ©   (2002-06-30 21:59) [10]

to Юрий Зотов
Тут уже дело принципа.
Китайский солдат сам придумывает препятствия и сам их преодолевает :)

Win98 SE. Без FIXов


 
Юрий Зотов ©   (2002-06-30 22:04) [11]

Не помню точно, но, кажется, и под 98 тоже не сработает.


 
Premium ©   (2002-06-30 22:08) [12]

А можно ли блокировать мыш над всем экранои кроме свого окна?


 
SPeller ©   (2002-06-30 22:15) [13]

Да поставь окну размеры во весь экран, TOPMOST и ScreenSaverRunning и чтоб нельзя было выйти без пароля и всё. Зачем геморроиться через Active/не active window ?


 
Pat ©   (2002-06-30 22:19) [14]

>Premium ©
Когда-то давно писал подобную программку. Могу выслать исходники...только уж очень криво написана она :-))


 
Юрий Зотов ©   (2002-06-30 22:21) [15]

Можно - поставить глобальный хук на мышь. Но остается еще клавиатура, на которую тоже придется ставить глобальный хук. И есть еще замечательные аккорды Alt+Tab и Ctrl+Esc (клавиша Win).

Заметьте, как резко начинает усложняться программа. Ради чего?


 
SPeller ©   (2002-06-30 22:27) [16]

2 Юрий Зотов © (30.06.02 22:21)

Какие хуки?? :) Гемору то сколько. SPeller © (30.06.02 22:15). А если не надо чтобы во весь экран, то ClipCursor и всё. Делов то.


 
Premium ©   (2002-06-30 22:28) [17]

to Юрий Зотов
Для ощущения собственной значительности.

С клавиатурой проблем нет, а вот банальным щелчком мыши вне окна портится это самое ощущение:((((

to Pat
Если вас не затруднит.



 
Юрий Зотов ©   (2002-06-30 22:37) [18]

> ... ClipCursor и всё.

Нажимаю Alt+Tab. Или Ctrl+Esc. И спокойно запускаю что угодно и во что угодно переключаюсь. И чихать мне на ClipCursor вместе с мышью.


 
Premium ©   (2002-06-30 22:40) [19]

Вот как я справлялся с клавиатурой:

SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);


 
Юрий Зотов ©   (2002-06-30 22:43) [20]

И что? Ну скрыли Вы свой процесс, что дальше? Кто помешает мне войти в главное меню, что угодно оттуда запустить и в него переключиться? Не вводя никаких паролей.


 
Premium ©   (2002-06-30 22:46) [21]

Я говорю про "аккорды". А вот дальше я и пришел на форум...


 
SPeller ©   (2002-06-30 22:56) [22]

Господа, вот вам РЕАЛЬНЫЙ пример, только что проверял:

procedure TForm1.FormCreate(Sender: TObject);
var rc:trect;
begin
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,nil,0);
rc:=rect(left,top,left+width,top+height);
ClipCursor(@rc);
Application.OnMessage:=MessageHandler;
end;

procedure TForm1.MessageHandler(var Msg: TMsg; var Handled: Boolean);
begin
if (msg.hwnd=handle)and(msg.message in WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,
WM_NCRBUTTONDOWN,WM_NCRBUTTONUP]) then handled:=true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,nil,0);
ClipCursor(nil);
end;


Объясняю что к чему. Во-первых, SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,nil,0) запрещает ВСЕ виндовые клавиши (Alt+Ctrl+Del, Alt+Tab, Alt+Esc, Ctrl+Esc b т.д.). Во-вторых, ClipCursor(@rc) запрещает передвижение указателя мыши дальше пределов формы. В третьих, Application.OnMessage:=MessageHandler назначаем обработчик всех сообщений для формы и приложения. В нём определяем, нашему ли окну отправлено сообщение и есть ли сообщение среди тех, которые фильтруем. Отлавливаем те, которые могут инициировать перемещение окна, из-за чего ClipCursor теряет своё действие и отсечение курсора надо ставить заново. В добавок, невозможно закрыть окно на "крестик", только по Alt+F4. Ну вот в принципе и всё, и никаких вам хуков.


 
SPeller ©   (2002-06-30 22:57) [23]

Очепяточка маленькая:
if (msg.hwnd=handle)and(msg.message in [WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,...


 
SPeller ©   (2002-06-30 23:03) [24]

Ну и в добавку: "запрещаем" Alt+F4 и закрываем окно только по нажатию на кнопку на форме.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if tag=0 then canclose:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tag:=1;
close;
end;


 
Premium ©   (2002-06-30 23:19) [25]

Ругается на эту строку:
if (msg.hwnd=handle)and(msg.message in WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,
WM_NCRBUTTONDOWN,WM_NCRBUTTONUP]) then handled:=true;


 
Pat ©   (2002-06-30 23:22) [26]

>Premium © ушло на hir@ukr.net


 
SPeller ©   (2002-06-30 23:24) [27]

Правда можно вызвать системное меню, в котором выбрать Переместить и накроется весь ClipCursor. Тогда либо в свойствах фомы убираем параметр biSystemMenu либо отлавливаем (не через хуки!!! :)) нажание клавиши Alt и F10:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key in [121,18] then key:=0;
end;


При этом для надёжности в свойство OnKeyUp надо тоже поставить эту процедуру.


 
SPeller ©   (2002-06-30 23:26) [28]

2 Premium © (30.06.02 23:19)

Что пишет?


 
Anatoly Podgoretsky ©   (2002-06-30 23:26) [29]

А скобка где? [


 
Premium ©   (2002-06-30 23:27) [30]

:)))))


 
Юрий Зотов ©   (2002-06-30 23:29) [31]

На правду похоже, но не совсем - задача снимается двойным щелчком по иконке в заголовке формы.

Вероятно, WM_NCLBUTTONDBLCLK все же не хватает. А еще проще обрабатывать только WM_NCHITTEST и возвращать HTCLIENT.


 
Premium ©   (2002-06-30 23:42) [32]

После закрытия приложения наблюдается оченб интересный эффект:
курсор мыши не выходит зпределы области где находилось окно,
и не вызываются "аккорды".


 
Юрий Зотов ©   (2002-06-30 23:52) [33]

Не назначен обработчик OnDestroy.


 
Vitalyfr   (2002-07-07 07:18) [34]

А может при закрытии снова запустить прогу ? Тогда не alt - f4 не ctr-alt-del, не помогут.



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

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

Наверх




Память: 0.55 MB
Время: 0.014 c
3-57981
ASK
2002-06-26 11:35
2002.07.18
В DBLookupComboBox строку из 2-х столбцов таблицы


1-58163
Still Swamp
2002-06-29 14:25
2002.07.18
Отрисовка на MDIParentForm


7-58339
Reket
2002-04-22 11:14
2002.07.18
Как перехватить поток данных идущих через LPT порт?


6-58237
Vlad___
2002-05-08 11:20
2002.07.18
HTTP Proxy + собственный протокол


14-58292
Fredericco
2002-06-21 13:07
2002.07.18
Три дня мурыжу протокол, между устройством и прогой для него..