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;
ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
WNDCLASSEX wndclass;
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;
if(!RegisterClassEx(&wndclass)) {
MessageBox(0, "Die Fensterklasse konnte nicht registriert werden.", "Fehler", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
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)
{
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;
}
if(InitKeyboard() == S_FALSE) {
MessageBox(0, "Tastatur konnte nicht initialisiert werden.", "Fehler", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
return;
}
}
HRESULT InitKeyboard(void)
{
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;
}
g_pKeyboard->SetDataFormat(&c_dfDIKeyboard);
g_pKeyboard->SetCooperativeLevel(MainWindowHandle, DISCL_FOREGROUND | DISCL_EXCLUSIVE);
g_pKeyboard->Acquire();
return S_OK;
}