Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.007 c
3-58022
Wolverin
2002-06-27 16:01
2002.07.18
Опять БД


1-58101
ИгорьК
2002-07-08 14:09
2002.07.18
Показать форму из трэя!


14-58279
lipskiy
2002-06-19 22:13
2002.07.18
Кому между делом нечем заняться? Заходите сюда!


1-58194
PETR
2002-07-06 12:08
2002.07.18
Привет народ !


1-58050
Doctor Deejay
2002-07-02 00:19
2002.07.18
кнопка прямо на рабочем столе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский