Newsgroup: it.comp.programmare.win32
Titolo: Dialog system modal

Ho la necessita' di mostrare una dialog che blocchi qualsiasi attivita' di
sistema finche' non viene chiusa.
So che in Win16 era semplicemente realizzabile, mentre in Win32 le dialog
system modal sono state abolite. Ho cercato un po' per la rete ma non ho
trovato alcuna soluzione, si trovano solo tecniche per fare finestre "always
on top". Qualcuno puo' aiutarmi?
grazie e ciao
merlinO

 on top". Qualcuno puo' aiutarmi?
Non vedo questa cosa complicata...
 SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);

>  SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
Scusa, leggendo di fretta avevo capito che il "Qualcuno puo' aiutarmi" era
riferito alle finestre "always on top".
Cosa intendi in particolare per bloccare qualunque attività di sistema?

  SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
Questo lo sa... Ma non penso blocchi tutti gli altri processi... ;-PPP
-- 
Luc.

 ha scritto:

Ho gia' provato a intervenire sulla OnCommand per bloccare tramite un flag
l'esecuzione dei comandi e OnKillFocus per ripristanare il focus ogni volta
che la finestra lo perde ma non ha funzionato :(
merlinO

 Questo lo sa... Ma non penso blocchi tutti gli altri processi... ;-PPP
Leggi tutti i msg prima di fare post inutili...
ciao

 Cosa intendi in particolare per bloccare qualunque attività di sistema?
che l'utente non deve poter interagire con le altre applicazioni finche' non
ha chiuso la dialog, perche' protrebbe eseguire operazioni in contrasto con
quelle che sta eseguendo la mia applicazione...
grazie e ciao
merlinO

 Leggi tutti i msg prima di fare post inutili...
Mi ero appena sincronizzato ed il tuo 2o post non era ancora arrivato. 
Quindi non farmi perdere tempo con queste mie ovvietà...
-- 
Luc.

 quelle che sta eseguendo la mia applicazione...
Io ho una mia classettina che fa un mestiere simile e l'avevo utilizzata
sotto Windows 98, andrebbe riveduta per XP e compagnia bella...te la posto
in ogni caso...
//    Header
class CDisableWindows
{
public:
 void SetMainApp(CWnd *pMainApp) { m_MainApp = pMainApp; }
 void EnableAll();
 void DisableAll();
 BOOL IsDisable() { return m_bHide; }
 CBDisableWindows();
 virtual ~CBDisableWindows();
private:
 CWnd * m_MainApp;
 void InitList();
 void ShowWindows(BOOL Show = TRUE);
 BOOL m_bHide;
 POSITION psList;
 CWnd *pWnd;
 CList <CWnd *,CWnd *> m_List;
};
//    Source
CBDisableWindows::CBDisableWindows()
{
 m_MainApp = NULL;
 m_bHide = FALSE;
}
CBDisableWindows::~CBDisableWindows()
{
 if(m_bHide)
  EnableAll();
}
void CBDisableWindows::DisableAll()
{
 InitList();
 CWnd* Tray=CWnd::FindWindow(_T("Shell_TrayWnd"),NULL);
 CWnd* Progman=CWnd::FindWindow(_T("Progman"),NULL);
 if (Tray) Tray->ShowWindow(SW_HIDE);
 if (Progman) Progman->ShowWindow(SW_HIDE);
 int Dummy;
 // Disabilita Ctrl/Alt/Canc
 SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,&Dummy,0);
 // Disabilita Alt-Tab (Switch)
 SystemParametersInfo(SPI_SETFASTTASKSWITCH,1,&Dummy,0);
 ShowWindows(FALSE);
 m_bHide = TRUE;
}
void CBDisableWindows::InitList()
{
 HWND p = ::GetDesktopWindow();
 pWnd = pWnd->FromHandle(p);
 pWnd = pWnd->GetTopWindow();
 while( pWnd && (! pWnd->IsWindowVisible()) )
 {
  pWnd = pWnd->GetNextWindow();
 }
 if (pWnd)
 {
  psList = m_List.AddHead(pWnd);
  while (pWnd = pWnd->GetNextWindow())
  {
   if(pWnd != m_MainApp)
    if (pWnd->IsWindowVisible())
     psList = m_List.InsertAfter(psList,pWnd);
  }
 }
}
void CBDisableWindows::EnableAll()
{
 // Se non è ancora stato disabilitato tutto,non bisogna tentare di eseguire
la riabilitazione
 if (! m_bHide)
  return;
 CWnd* Tray=CWnd::FindWindow(_T("Shell_TrayWnd"),NULL);
 CWnd* Progman=CWnd::FindWindow(_T("Progman"),NULL);
 if (Tray) Tray->ShowWindow(SW_SHOW);
 if (Progman) Progman->ShowWindow(SW_SHOW);
 int Dummy;
 // Abilita Ctrl/Alt/Canc
 SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,&Dummy,0);
 // Abilita Alt-Tab (Switch)
 SystemParametersInfo(SPI_SETFASTTASKSWITCH,0,&Dummy,0);
 // Abilita tutte le finestre
 ShowWindows();
 m_bHide = FALSE;
}
void CBDisableWindows::ShowWindows(BOOL Show)
{
  for (POSITION Pos = m_List.GetHeadPosition(); Pos; m_List.GetNExt(Pos))
   m_List.GetAt(Pos)->ShowWindow(Show ? SW_SHOW : SW_HIDE);
}
//////////////////////////////
Fai conto che l'ho scritta molto tempo fa , ero ancora "giovincello nella
programmazione" all'epoca (d'altra parte avevo 18 anni circa), ma giricchia
e penso ti possa aiutare...
Ovviamente io ci metterei anche un bel
  SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE) &
(~WS_CAPTION | WS_BORDER));
  SetWindowPos(&wndTopMost, 0, 0,
GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN), SWP_NOZORDER);
Soccia che divertimento...
Ma ciao!

 Ma ciao!
ciao
merlinux

> Pensare che anch'io una volta avevo 18anni ;p
Ora io sono molto, molto, molto invecchiato...22 anni ;p