Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно,
пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на
рабочем столе пока его не закроют.
Style: Overlapped
Установлен атрибут System modal
Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но
есть возможность задвинуть его куда-нить и нормально работать дальше...
Re: системно-модальное диалоговое окно
От:
Аноним
Дата:
26.03.02 14:50
Оценка:
Здравствуйте Shtas, Вы писали:
S>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно, S>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на S>рабочем столе пока его не закроют. :maniac: S>Style: Overlapped S>Установлен атрибут System modal S>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но S>есть возможность задвинуть его куда-нить и нормально работать дальше...
Отхватывай сообщения типа килфокус и мув виндов. Когда это происходит, то SetForegroundWindow(...) и MoveWindow(0,0, ....)
;)
Здравствуйте Shtas, Вы писали:
S>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно, S>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на S>рабочем столе пока его не закроют. :maniac: S>Style: Overlapped S>Установлен атрибут System modal S>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но S>есть возможность задвинуть его куда-нить и нормально работать дальше...
Отхватывай сообщения типа килфокус и мув виндов. Когда это происходит, то SetForegroundWindow(...) и MoveWindow(0,0, ....)
;)
Здравствуйте Azrael, Вы писали:
A>Здравствуйте Shtas, Вы писали:
S>>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно, S>>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на S>>рабочем столе пока его не закроют. S>>Style: Overlapped S>>Установлен атрибут System modal S>>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но S>>есть возможность задвинуть его куда-нить и нормально работать дальше...
A>Отхватывай сообщения типа килфокус и мув виндов. Когда это происходит, то SetForegroundWindow(...) и MoveWindow(0,0, ....)
S>Диалоговое окно создаю при помощи DialogBox(...)
Ты не поняль, глобальный ХУК надо вещать, но только фигня это всё.
-------------------------------------------------------------------
Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
Здравствуйте Gambler, Вы писали:
G>Здравствуйте Shtas, Вы писали:
S>>Здравствуйте Azrael, Вы писали:
A>>>Здравствуйте Shtas, Вы писали:
S>>Вот прекрутил и все равно нифига:
S>>
S>>Диалоговое окно создаю при помощи DialogBox(...)
G>Ты не поняль, :no: глобальный ХУК надо вещать, но только фигня это всё.
Зачем хук? Просто в этом коде надо Movewindow даюавить
А если охото навредить юзеру недав ему работать спокойно, тои весь икран залить черным цветом, предварительно получив дескриптор окна десктапа.
[skipped]
A>Отхватывай сообщения типа килфокус и мув виндов. Когда это происходит, то SetForegroundWindow(...) и MoveWindow(0,0, ....) A>
IMHO Вместо того, чтобы ловить WM_MOUSEMOVE, лучше попробовать повзоиться с WM_GETMINMAXINFO
// #import <windows.bas> class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
case WM_INITDIALOG :
SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
break;
И нифига... все равно окно не блокирует работу пользователя...
Может потому что у меня NT, точнее XP и здесь для этого права нужны какие-нить???
В MSDN или в VC++ захожу в "Справка" потом в "О программе" появляется окошко, в котором пока на Ok
не кликну нифига сделать не дают. У MS все работает, а у меня нет... :???:
Здравствуйте Аноним, Вы писали:
А>Здравствуйте KMiNT21, Вы писали:
S>>>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на
А> case WM_INITDIALOG :
А> SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
А> break;
А>
А>И нифига... все равно окно не блокирует работу пользователя...
Да это вообще полный бред, к системным модальным окнам никакого отношения.
А>Может потому что у меня NT, точнее XP и здесь для этого права нужны какие-нить???
Эт вряд ли.
А>В MSDN или в VC++ захожу в "Справка" потом в "О программе" появляется окошко, в котором пока на Ok А>не кликну нифига сделать не дают. У MS все работает, а у меня нет...
Да ну. А меня (Win2k) — пожалуйста. Разве что при открытом "About" в MSDN в VC не переключишься (в остальные программы — пожалуйста), но, опять же, причем тут system modal?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
А>>И нифига... все равно окно не блокирует работу пользователя...
S> Да это вообще полный бред, к системным модальным окнам никакого отношения.
А>>Может потому что у меня NT, точнее XP и здесь для этого права нужны какие-нить??? S> Эт вряд ли.
А>>В MSDN или в VC++ захожу в "Справка" потом в "О программе" появляется окошко, в котором пока на Ok А>>не кликну нифига сделать не дают. У MS все работает, а у меня нет... :???: S> Да ну. А меня (Win2k) — пожалуйста. Разве что при открытом "About" в MSDN в VC не переключишься (в остальные программы — пожалуйста), но, опять же, причем тут system modal?
Да, эт я прошляпил, действительно куда угодно по Alt+Tab'у переключаешься... А вот как бы сделать,
что б нельзя было переключаться. Т.е. именно модальное для всех оконных программ на десктопе...
Здравствуйте Shtas, Вы писали:
S>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно, S>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на S>рабочем столе пока его не закроют. :maniac: S>Style: Overlapped S>Установлен атрибут System modal S>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но S>есть возможность задвинуть его куда-нить и нормально работать дальше...
Есть один злобный вариант наверняка (дедушка научил :) ):
1. ставишь своему процессу (или запускаешь новый) приоритет HIGH_PRIORITY_CLASS (SetPriorityClass).
2. ставишь главному потоку процесса (обрабатывающему сообщения) приоритет THREAD_PRIORITY_HIGHEST (или другой высокий; но злоупотреблять не советую) (SetThreadPriority).
3. из главного цикла программы (обработки сообщений) выкидываешь WaitMessage
4. получаешь удовольствие... :)
Именно так работает процесс, который в Win9x появляется по Alt+Ctrl+Del — все остальное молча замерает.
Здравствуйте z_yura, Вы писали:
ZY>Здравствуйте Shtas, Вы писали:
S>>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно, S>>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на S>>рабочем столе пока его не закроют. S>>Style: Overlapped S>>Установлен атрибут System modal S>>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но S>>есть возможность задвинуть его куда-нить и нормально работать дальше...
ZY>Есть один злобный вариант наверняка (дедушка научил ): ZY> 1. ставишь своему процессу (или запускаешь новый) приоритет HIGH_PRIORITY_CLASS (SetPriorityClass). ZY> 2. ставишь главному потоку процесса (обрабатывающему сообщения) приоритет THREAD_PRIORITY_HIGHEST (или другой высокий; но злоупотреблять не советую) (SetThreadPriority). ZY> 3. из главного цикла программы (обработки сообщений) выкидываешь WaitMessage ZY> 4. получаешь удовольствие...
ZY>Именно так работает процесс, который в Win9x появляется по Alt+Ctrl+Del — все остальное молча замерает.
ZY>Когда надоест — делаешь все в обратном порядке.
Здравствуйте Shtas, Вы писали:
S>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно, S>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на S>рабочем столе пока его не закроют. :maniac: S>Style: Overlapped S>Установлен атрибут System modal S>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но S>есть возможность задвинуть его куда-нить и нормально работать дальше...
А ты в придачу ставь глобальные хуки на мышь, и клаву. А ctrl+alt+del, alt+tab, и подобные сочетания вырубаются отсыланием на десктоп сообщения, что хранитель экрана активен (сообщение я щас вспомнить не могу :( ,но это поправимо... :) ) :))
Здравствуйте Алекс, Вы писали:
S>>>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но S>>>есть возможность задвинуть его куда-нить и нормально работать дальше...
ZY>>Есть один злобный вариант наверняка (дедушка научил :) ): ZY>> 1. ставишь своему процессу (или запускаешь новый) приоритет HIGH_PRIORITY_CLASS (SetPriorityClass). ZY>> 2. ставишь главному потоку процесса (обрабатывающему сообщения) приоритет THREAD_PRIORITY_HIGHEST (или другой высокий; но злоупотреблять не советую) (SetThreadPriority). ZY>> 3. из главного цикла программы (обработки сообщений) выкидываешь WaitMessage ZY>> 4. получаешь удовольствие... :)
ZY>>Именно так работает процесс, который в Win9x появляется по Alt+Ctrl+Del — все остальное молча замерает.
Толи это в XP не прет, толи я что-то не так делаю... нифига не выходит... :(
Вобщем пойдя путем аналогий, я присмотрелся, к процедуре логина в NT и нашел, что
она то, что мне нужно. Я просто создаю новый, личный, ни кем не занятый десктоп, на нем выдаю мое
диалоговое окно и затем закрываю его. У пользователя даже Ctrl+Alt+Del выскакивает не на моем десктопе,
а на default.
HDESK hdeskSave,hdeskUser;
//Creating separate desctop
hdeskUser = CreateDesktop(DESKTOP_NAME, //имя десктопа
NULL,
NULL,
0, //нельзя хукать наш процесс на их десктопе DESKTOP_CREATEWINDOW|DESKTOP_ENUMERATE|DESKTOP_READOBJECTS|DESKTOP_SWITCHDESKTOP,
NULL); //десктоп не наследуется дочерними процессамиif (hdeskUser == NULL)
{
mb("Can't create desktop");
return;
}
if(!SetThreadDesktop(hdeskUser)) mb("Can't set desktop");
SwitchDesktop(hdeskUser);
DialogBox(...); //Наш диалог
SwitchDesktop(hdeskSave);
SetThreadDesktop(hdeskSave);
CloseDesktop(hdeskUser);