Aber mich interessiert brennend, wozu du so eine radikale Maßnahme ergreifen möchtest. Systemmodale Fenster werden üblicherweise nur bei schwerwiegenden Systemfehlern verwendet, bei denen auch die Interaktion mit anderen Fenstern kritisch sein kann, solange die Fehlersituation nicht geklärt ist.
Die Installationsprogramme, die du als Beispiel genannt hast, fallen alle in die Kategorie der anwendungsmodalen Fenster - du kannst während der laufenden Installation jederzeit zu anderen offenen Anwendungen wechseln.
Wie bekomme ich dann mein Fenster modal oder wie bekomme ich es so das es so lange im Vordergrund bleibt bis ich es beende?
Kann man seiner eigenen Anwendung eine Nachricht schicken das es nun den Fokus erhalten hat und anderen Anwendung das sie ihn verloren haben? Wäre das ein Ansatz?
///////////////////////////////////////////////////////////////
ShowCursor(FALSE);
Hinstance = hinstance;
// Get the Systemresolution
ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
WNDCLASSEX wndclass;
// Fill the WNDCLASSES structure
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hIcon = 0;
wndclass.hIconSm = 0;
wndclass.hCursor = 0;
wndclass.hInstance = Hinstance;
wndclass.lpfnWndProc = Handler;
wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.style = CS_OWNDC | CS_NOCLOSE | CS_HREDRAW | CS_VREDRAW;
wndclass.lpszClassName = "WINDOW_CLASS";
wndclass.lpszMenuName = 0;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
// Register the Window
if(!RegisterClassEx(&wndclass)) {
MessageBox(0, "Die Fensterklasse konnte nicht registriert werden.", "Fehler", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
// Create the Window
if((MainWindowHandle = CreateWindowEx(0,"JV_WINDOW_CLASS", "HOAX", WS_VISIBLE | WS_POPUP,
0, 0, ScreenWidth, ScreenHeight, 0, 0, Hinstance, 0)) == 0) {
MessageBox(0, "Das Fenster konnte nicht erstellt werden.", "Fehler", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
///////////////////////////////////////////////////////////////
Was muss ich hier ändern?
Meine DirectInput initialisierung sieht momentan so aus:
///////////////////////////////////////////////////////////////
void InitDirectInput(void)
{
// DirectInput-Objekt erzeugen
if(FAILED(DirectInput8Create(Hinstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pDI, NULL))) {
MessageBox(0, "DirectInput-Objekt konnte nicht erzeugt werden.", "Fehler", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
return;
}
// Keyboard initialisieren
if(InitKeyboard() == S_FALSE) {
MessageBox(0, "Tastatur konnte nicht initialisiert werden.", "Fehler", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
return;
}
}
HRESULT InitKeyboard(void)
{
// Keyboard-Objekt erzeugen
g_pDI->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL);
if(NULL == g_pKeyboard) {
MessageBox(0, "Keine Tastatur gefunden.", "Fehler", MB_ICONERROR | MB_OK);
PostQuitMessage(0);
return S_FALSE;
}
// Datenformat festlegen
g_pKeyboard->SetDataFormat(&c_dfDIKeyboard);
// festlegen, wie DirectInput Zugriff auf das Gerät erhält
g_pKeyboard->SetCooperativeLevel(MainWindowHandle, DISCL_FOREGROUND | DISCL_EXCLUSIVE);
// akquirieren des Gerätes
g_pKeyboard->Acquire();
return S_OK;
}
///////////////////////////////////////////////////////////////