WM_CLOSE Abfangen bzw schließen des programmes verbieten
-
Guten Tag,
ich schreibe momentan ein Programm das während einer bestimmten Phase nicht beendet werden darf, sonst könnte es für den user zu datenverlust führen.
wie kann ich das jetzt realisieren. ich habe im internet zwar schon ne menge gefunden aber es hat nichts funktioniert was aber auch an mir liegen kann
ich hoffe auf schnelle hilfe
danke
-
case WM_CLOSE: return (0L);
-
sieht gut aus^^ aber wie binde ich das ein? Also was setze ich bei switch als bedingung ein?
und wo muss das in mein programm also wie funktioniert das, dass der das mitbekommt wenn das signal kommt? oder gibt es was das direkt von anfang an definiert wie das Programm auf die nachricht reagieren soll ?
ich hab bei Win Api noch nicht sooooo viel erfahrung..........ich hab nur ein bischen mit der Registry rumgefummelt...
-
Bei Nachrichtenabfrage kann bei switch nur "switch (msg)" stehen.
Die Abfrage der Bedingung machst Du unter WM_CLOSE:
case WM_CLOSE: if(...//Bedingung) { return 0; } else: { return 1; }oder so ähnlich.
-
jetzt steh ich glaub ich wirklich aufm schlauch da kommt dann das msg undefined ist. Eigentlich müsste ich aber alles was ich brauche includet haben was muss ich dann noch definieren?
nehmen wir mal ein programm was 10 mal hallo sagen soll und in der zeit nicht beendet werden darf dann hätte ich da...
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
cout<<"hallo\n";
}wo muss jetzt das switch hin und was muss drinstehen ich denke zwar wenn ihr mir es sagt werde ich mir mit der hand vor den kopf schlagen aber ich riskiere es....

-
Mir scheint, Du bist noch nicht reif für so ein Programm. Du solltest Dir noch mal ein Tutorial antun. Ausgaben und Botschaftsabfragen finden nicht in der WinMain statt, sondern in der CALLBACK WindProc(). Außerdem werden Ausgaben nicht mit cout gemacht, sondern mit BeginPaint/ TextOut oder DrawText...EndPaint- und vorher muß ein DeviceContext erstellt werden... Ist eben alles nicht so einfach bei Windows.

-
ok könnte sein das du recht hast jetzt wo ich das hier gelesen und nicht verstanden habe ist mir das auch schon durch den kopf gegangen

-
Hier n paar Tutorials:
http://www.henkessoft3000.de/
http://www.win-api.de/
http://www.willemer.de/informatik/windows/winprg.htm
-
ich habe in einem der Tutorials ein Problem und zwar mit
wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
und
TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20);ich bekomme folgende Fehler:
[Linker error] undefined reference toCreateSolidBrush@4' und [Linker error] undefined reference toTextOutA@20'kann sich das jemand erklären? weil ansonsten denke ich funzt alles
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Das mit dem Background habe ich dadurch geloest das ich einfach mal GetStockObject weggelassen habe und jetzt funzt eis ohne probleme aber das mit dem Text habe ich noch nicht hinbekommen^^
-
Prinz Martin schrieb:
[...]
ich bekomme folgende Fehler:
[...]Welchen Kompiler benutzt du denn ?
Also in der MSDN steht eigentlich welche Librarys du linken musst.
-
So in den letzten tagen hatte ich weniger zeit aber auc hdas problem ist jetzt glöst ich hatte bei meinem Dev C++ angegeben ich mache eine konsoenanwendung statt eine windows anwendung jetzt geht es
Aber ich habe ein weiteres diesmal Programmtechnisches Problem:
wie kann ich wenn ich in einem child oder hauptfenster auf einen button klicke, das andere Fenster auf SW_HIDE setzen. mit dem eigenen Fenster also da wo der button drin ist ist das ja kein problem aber da einfach das update vom anderen fenster reinschreiben geht nicht weil der hwnd da nicht kennt. Ist ja auch ganz klar eigentlich.
kann ich das da einfach irgendwo definieren oder muss ich das anders machen?
-
Du musst nur irgendwo her das Fenster-Handle bekommen. Entweder du speicherst es dir irgendwo, worauf du dann in deiner WndProc zugreifen kannst, oder du holst es dir über FindWindow(Ex)

-
LRESULT CALLBACK ChildProc (HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc;
PAINTSTRUCT ps;
static HWND hwndButton1;switch (message)
{
case WM_PAINT:
return 0;case WM_CREATE:hwndButton1 = CreateWindow ( "button", "click",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
150, 20, 100, 40, hwnd2, NULL,
(HINSTANCE) GetWindowLong (hwnd2, GWL_HINSTANCE), NULL);
return 0;case WM_COMMAND:
ShowWindow (FindWindow(NULL, "Fensterklasse"), SW_HIDE);
UpdateWindow (FindWindow(NULL, "Fensterklasse"));case WM_CLOSE:;
case WM_DESTROY:;
}return DefWindowProc (hwnd2, message, wParam, lParam);
}so hab ich es jetzt mal probiert und der läuft auch durch also es gibt keinen fehler aber leider funktioniert es auch nicht. wo könnte der Fehler liegen? ich such auch noch mal weiter vielleicht finde ich es ja selbst
EDIT EDIT EDIT EDIT
doch es geht ^^
FindWindow(NULL, "Fensterklasse")
ich musste nur die "NULL" und "Fensterklasse" vertauschen
