Форум: "Основная";
Текущий архив: 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