Re: системно-модальное диалоговое окно
От: z_yura  
Дата: 26.03.02 23:36
Оценка: 6 (1)
Здравствуйте 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 — все остальное молча замерает.

Когда надоест — делаешь все в обратном порядке.
Re[3]: системно-модальное диалоговое окно
От: Shtas  
Дата: 28.03.02 14:27
Оценка: 6 (1)
Здравствуйте Алекс, Вы писали:

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);


Вот это у меня работает.... :)
системно-модальное диалоговое окно
От: Shtas  
Дата: 26.03.02 14:41
Оценка:
Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно,
пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на
рабочем столе пока его не закроют.
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, ....)
;)
Re: системно-модальное диалоговое окно
От: Azrael  
Дата: 26.03.02 14:50
Оценка:
Здравствуйте Shtas, Вы писали:

S>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно,

S>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на
S>рабочем столе пока его не закроют. :maniac:
S>Style: Overlapped
S>Установлен атрибут System modal
S>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но
S>есть возможность задвинуть его куда-нить и нормально работать дальше...

Отхватывай сообщения типа килфокус и мув виндов. Когда это происходит, то SetForegroundWindow(...) и MoveWindow(0,0, ....)
;)
Re[2]: системно-модальное диалоговое окно
От: Shtas  
Дата: 26.03.02 15:03
Оценка:
Здравствуйте Azrael, Вы писали:

A>Здравствуйте Shtas, Вы писали:


S>>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно,

S>>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на
S>>рабочем столе пока его не закроют.
S>>Style: Overlapped
S>>Установлен атрибут System modal
S>>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но
S>>есть возможность задвинуть его куда-нить и нормально работать дальше...

A>Отхватывай сообщения типа килфокус и мув виндов. Когда это происходит, то SetForegroundWindow(...) и MoveWindow(0,0, ....)


Вот прекрутил и все равно нифига:

BOOL CALLBACK DlgProc (HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
     switch (iMsg)
          {
          case WM_INITDIALOG :
               return FALSE ;

        case WM_COMMAND :
               switch (LOWORD (wParam))
                    {
                    case IDOK:                        
            MessageBox(NULL,"Let's go!","Event",MB_OK|MB_ICONERROR);            
                    case IDCANCEL :
            EndDialog (hDlg, 1) ;
                return TRUE;
                    }
        break;

    case WM_KILLFOCUS:
        {
            SetForegroundWindow(hDlg);
        return TRUE;                
        }
          }
     return FALSE;
     }


Диалоговое окно создаю при помощи DialogBox(...)
Re[3]: системно-модальное диалоговое окно
От: Gambler  
Дата: 26.03.02 15:09
Оценка:
Здравствуйте Shtas, Вы писали:

S>Здравствуйте Azrael, Вы писали:


A>>Здравствуйте Shtas, Вы писали:


S>Вот прекрутил и все равно нифига:


S>
S>    case WM_KILLFOCUS:
S>        {
S>            SetForegroundWindow(hDlg);
S>        return TRUE;                
S>        }
S>          }
S>     return FALSE;
S>     }

S>


S>Диалоговое окно создаю при помощи DialogBox(...)


Ты не поняль, глобальный ХУК надо вещать, но только фигня это всё.
-------------------------------------------------------------------

Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
Re[4]: системно-модальное диалоговое окно
От: Azrael  
Дата: 26.03.02 15:22
Оценка:
Здравствуйте Gambler, Вы писали:

G>Здравствуйте Shtas, Вы писали:


S>>Здравствуйте Azrael, Вы писали:


A>>>Здравствуйте Shtas, Вы писали:


S>>Вот прекрутил и все равно нифига:


S>>
S>>    case WM_KILLFOCUS:
S>>        {
S>>            SetForegroundWindow(hDlg);
S>>        return TRUE;                
S>>        }
S>>          }
S>>     return FALSE;
S>>     }
S>>


S>>Диалоговое окно создаю при помощи DialogBox(...)


G>Ты не поняль, :no: глобальный ХУК надо вещать, но только фигня это всё.

Зачем хук? Просто в этом коде надо Movewindow даюавить
А если охото навредить юзеру недав ему работать спокойно, тои весь икран залить черным цветом, предварительно получив дескриптор окна десктапа.
Re[2]: системно-модальное диалоговое окно
От: KA it-knowledge-base.blogspot.com
Дата: 26.03.02 15:37
Оценка:
Здравствуйте Azrael, Вы писали:

[skipped]

A>Отхватывай сообщения типа килфокус и мув виндов. Когда это происходит, то SetForegroundWindow(...) и MoveWindow(0,0, ....)

A>
IMHO Вместо того, чтобы ловить WM_MOUSEMOVE, лучше попробовать повзоиться с WM_GETMINMAXINFO
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re: системно-модальное диалоговое окно - SetWindowPos
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 26.03.02 15:52
Оценка:
Здравствуйте Shtas, Вы писали:

S>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на


Примерно так:

SetWindowPos(g_hwndMain,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
KMiNT21' Blog
http://kmint21.info/ru/
Re[2]: системно-модальное диалоговое окно - SetWindowPos
От: Аноним  
Дата: 26.03.02 16:33
Оценка:
Здравствуйте KMiNT21, Вы писали:

S>>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на



KMNT>SetWindowPos(g_hwndMain,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);



     case WM_INITDIALOG :
      SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
    break;


И нифига... все равно окно не блокирует работу пользователя...
Может потому что у меня NT, точнее XP и здесь для этого права нужны какие-нить???
В MSDN или в VC++ захожу в "Справка" потом в "О программе" появляется окошко, в котором пока на Ok
не кликну нифига сделать не дают. У MS все работает, а у меня нет... :???:
Re[3]: системно-модальное диалоговое окно - SetWindowPos
От: Sergey Россия  
Дата: 26.03.02 17:00
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте KMiNT21, Вы писали:


S>>>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на



KMNT>>SetWindowPos(g_hwndMain,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);



А>
А>     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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: системно-модальное диалоговое окно - SetWindowPos
От: Аноним  
Дата: 26.03.02 17:06
Оценка:
Здравствуйте Sergey, Вы писали:

А>>И нифига... все равно окно не блокирует работу пользователя...


S> Да это вообще полный бред, к системным модальным окнам никакого отношения.


А>>Может потому что у меня NT, точнее XP и здесь для этого права нужны какие-нить???

S> Эт вряд ли.

А>>В MSDN или в VC++ захожу в "Справка" потом в "О программе" появляется окошко, в котором пока на Ok

А>>не кликну нифига сделать не дают. У MS все работает, а у меня нет... :???:
S> Да ну. А меня (Win2k) — пожалуйста. Разве что при открытом "About" в MSDN в VC не переключишься (в остальные программы — пожалуйста), но, опять же, причем тут system modal?

Да, эт я прошляпил, действительно куда угодно по Alt+Tab'у переключаешься... А вот как бы сделать,
что б нельзя было переключаться. Т.е. именно модальное для всех оконных программ на десктопе...
Re[2]: системно-модальное диалоговое окно
От: Алекс Россия http://wise-orm.com
Дата: 27.03.02 05:42
Оценка:
Здравствуйте 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>Когда надоест — делаешь все в обратном порядке.


Круто!
Re: системно-модальное диалоговое окно
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 27.03.02 07:49
Оценка:
Здравствуйте Shtas, Вы писали:

По поводу subj:
я думал нужно как раз OnTop сделать, а "системено-мод." — это так, к слову пришлось.

А раз уж все так серьезно, то нужно делать как screen-saverы делают.
... запамятовал функцию... see in help.
KMiNT21' Blog
http://kmint21.info/ru/
Re: системно-модальное диалоговое окно
От: Аноним  
Дата: 27.03.02 10:38
Оценка:
Здравствуйте Shtas, Вы писали:

S>Наверно это просто, но вот не знаю как. Необходимо чтобы появившееся диалоговое окно,

S>пока оно не будет закрыто, было выше всех других окон и не давало ничего сделать на
S>рабочем столе пока его не закроют. :maniac:
S>Style: Overlapped
S>Установлен атрибут System modal
S>Но не смотря на последнее, окно хотя и распологается постоянно выше всех остальных, но
S>есть возможность задвинуть его куда-нить и нормально работать дальше...

А ты в придачу ставь глобальные хуки на мышь, и клаву. А ctrl+alt+del, alt+tab, и подобные сочетания вырубаются отсыланием на десктоп сообщения, что хранитель экрана активен (сообщение я щас вспомнить не могу :( ,но это поправимо... :) ) :))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.