Fenster immer im Vordergrund
-
OK.
thx @ all.Mein Prob lässt sich nicht lösen.
Der Taskmanager legt sich immer über alles.Aber der Link von WebFritzi hat mir auch geholfen.
-
Du kannst ja mal das testen:
In einer Timerroutine
HWND Win=NULL; static int CloseCount=0; if (GetForegroundWindow()!=Handle) { Win=GetForegroundWindow(); SetForegroundWindow(Handle); BringWindowToTop(Handle); CloseCount++; } else { CloseCount=0; } if (CloseCount>5) PostMessage(Win,WM_CLOSE,0,0);
Da wird regelmaessig geprueft, ob Die Form im Fordergrund ist.
Wenn nicht wird sie gesetzt und ToTop geholt: Falls das 5 mal nicht klappt (Beim Taskmanager passiert das), wird der geschlossen!!!! Vorsicht: Falls Windows mal spinnt, haste keinen Taskmanager !!!
-
Original erstellt von DerAltenburger:
Vorsicht: Falls Windows mal spinnt, haste keinen TaskmanagerQuatsch. Den kann man IMMER mit CTRL+ALT+DEL wieder aufrufen! BTW halte ich deine Routine nicht für gut, denn sie schließt einfach ein fremdes Fenster. Das sollte schon mit dem User abgestimmt sein.
-
Tschuldige aber ich hab noch einen Modalen Dialog vor mein Prog geschaltet der einen Wert übergibt, den ich brauche.
Wie kann ich deine Funktion bearbeiten, dass sie den nicht versucht zu schließen?
-
Nimm diese Funktion nicht!
-
... den kann man IMMER mit CTRL+ALT+DEL wieder aufrufen ist zwar richtig, aber der geht auch immer wieder zu! :p
Aber Recht haste, man sollte keine fremden Fenster schliessen!!!!!!!!!!!!
Der quizzmaster wollte aber was durchschlagendes gegen den Task- Manager. Und der draengelt sich nun mal immer vor. Wer den aushebeln will, dem ist (fast) alles andere egal.Ich find das auch nicht gut (Taskman ueberlisten!)
Dir hauts wohl 'ne Eigene Form zu?
Das ist der Haken an so brutalen Codes.Kannst ja abfragen: if (Win!=DeinDialog->Handle), um das zu umgehen.
Das mit dem Close fuer widerspenstige Fenster kann auch abgeschwaecht werden. Du kannst stat Postmessage auch ShowWindow auf das Fenster anwenden mit Minimize / oder Hide.
PS: Hide ist auch sehr link!
[ Dieser Beitrag wurde am 13.04.2003 um 21:46 Uhr von DerAltenburger editiert. ]
-
Original erstellt von DerAltenburger:
Wer den aushebeln will, dem ist (fast) alles andere egal.Hast auch wieder recht.
-
Also mir ist da auch zimlich alles egal, weil die PC's sowieso ne Wächterkarte drin haben und da sowieso nix passiert.
.
Ich probier das gleich mal aus, außerdem werde ich das mit minimize und hide mal testen, weil das etwas harmloser ist.
@ all:
Ich brauche das, weil die 'Kinder' und Leute zu viel mist an den PC's gemacht haben und wir (aus der AG und zwei Lehrer) nicht immer überall sein können.
-
@ WebFritzi:
Was soll ich denn, deiner Meinung nach, für eine Funktion nehmen?
@all: Das mit ShowWindo blick ich nicht...
-
Original erstellt von quizzmaster:
**@ WebFritzi:
Was soll ich denn, deiner Meinung nach, für eine Funktion nehmen?
**Ne, is schon OK. Nimm die vom Altenburger. Und benutze auch WM_CLOSE. Das ist IMHO das einzig vernünftige. ShowWindow(.., SW_HIDE) wäre nicht so angebracht.
-
ShowWindow(Win,SW_MINIMIZE); :p
//Win ist das Handle vom Fordergrundwindow (mein vorletztes Posting)
da bleibt aber z.T der Focus drauf (wenn's der Taskman ist!)
richtig sicher ist halt nur WM_CLOSE - aber 'ne linke Nummer :pPS: das Ding mit SW_HIDE ist noch linker! Das Fenster bleibt erhalten, ist aber unsichtbar!. Falls das mit 'nem 'normalen' Programmfenster passiert, kommste sehr schwer wieder dran!!! (Nur Dein Prog und der Taskman kennen das Handle!)
Das kann Aerger machen auch beim Herunterfahren - VORSICHT mit solchen Tricks!
-
@Der ALtenburger: Das mit dem Timer und so hat mir nicht gefallen. Hab jetzt eine andere Art gefunden.
Ich hab mal ausprobiert, sowas zu machen. Mein Fenster ist immer im Vordergrund und von Anfang an maximiert (legt sich also über die Taskleiste). Weiterhin hab ich die Taskleiste versteckt:
private: HWND hTaskBar; // Im Konstruktor: hTaskBar = FindWindow(TEXT("Shell_TrayWnd"), TEXT("")); // In OnCreate ShowWindow(hTaskBar, SW_HIDE); // Im Destruktor ShowWindow(hTaskBar, SW_SHOW);
Jo, das erstmal. Dann habe ich noch OnCloseQuery abgefangen:
void __fastcall TfrmMain::FormCloseQuery(TObject *Sender, bool &CanClose) { if(!MayClose) { AnsiString meldung("Glaubst du etwa, ich bin sooo blöd!"); MessageBox(Handle, meldung.c_str(), "ERROR", MB_OK|MB_ICONERROR); } CanClose = MayClose; }
MayClose wird genau dann auf TRUE gesetzt, wenn ein Passwort richtig eingegeben wurde. Und dann (das Wichtigste) hab ich noch WM_ACTIVATE abgefangen:
protected: void __fastcall WMActivate(TMessage&); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_ACTIVATE, TMessage, WMActivate) END_MESSAGE_MAP(TForm) void __fastcall TfrmMain::WMActivate(TMessage& Msg) { if( LOWORD(Msg.WParam) == WA_INACTIVE ) { HWND hwnd = GetForegroundWindow(); if(hwnd != Handle ) { // Das ForegroundWindow hinter meinem Fenster positionieren RECT r; GetWindowRect(hwnd, &r); SetWindowPos(hwnd, Handle, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_SHOWWINDOW); // Einen Mouseclick simulieren, der mein Fenster aktiviert mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN, 20, 20, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP, 20, 20, 0, 0); // Mein Fenster neu zeichnen Refresh(); } } TForm::Dispatch(&Msg); }
Das mit dem Aktivieren meines Fensters hab ich nicht anders hinbekommen als mit so nem MouseEvent. An der Stelle soll das Fenster aktiviert werden (wie, wenn ich einen linken Mausklick darauf auslöse). Alle anderen Versuche (u.a. SetForeground/ActiveWindow(), SetFocus() haben nicht gefunzt). Es ist wichtig, dass das Fenster dort aktiviert wird, denn sonst kann man einmal den TaskMan aufrufen (er wird ausgeblendet) und dann aber nochmal - und dann bleibt er da!
So funzt das alles eigentlich recht gut. Nichtmal das StartMenu (welches in WinXP ein Fenster ist) kann man ordentlich mit der Win-Taste aktivieren. Trotz allem wäre ein Low Level Keyboard-Hook noch angebracht, um diese Taste (und noch andere) zu deaktivieren. Irgendwo hier im Forum (entweder hier oder in WinAPI wurde neulich ein solcher gepostet).[ Dieser Beitrag wurde am 15.04.2003 um 00:38 Uhr von WebFritzi editiert. ]
-
Hier wurde der Low-Lever_Keyb Hook gepostet.
Sei mir net böse aber ich versteh dein zeugs net.
Wo soll da Was hin? (zur Info: _Ich hab die Englische Version des BCB5 Enterprise)
-
Original erstellt von quizzmaster:
Sei mir net böse aber ich versteh dein zeugs net.Dann lass lieber die Finger vom BCB! Wie du Messages wie hier WM_ACTIVATE abfängst, kannst du in der FAQ unter "Windows-Messages" nachlesen.
-
Original erstellt von WebFritzi:
Dann lass lieber die Finger vom BCB!Nein, wiso ich war nur zu müde und außerdem hab ich erst vor 1 1/2 Wochen angefangen mim BCB und kann dafür (ohne Buch und alles) schon ne ganze menge!
Das Prog funzt auch so und das ist OK immerhin ham die PC's ne Wächterkarte.
Dem Lehrer is das scheiß egal wie ichs mach und damit basta.@Mods: bitte schließen, sonst ensteht zu viel mist!
[ Dieser Beitrag wurde am 15.04.2003 um 22:59 Uhr von quizzmaster editiert. ]
-
Das sieht interessant aus!
Aber Du hast Recht, richtig toll wirds nur mit nem Keyboard- Hook.
Du sagst, das Start- Menue kommt nicht richtig? Ich hab Win2k, da kommste locker mit <Ctrl> + <ESC> ran. und darueber an alle programme. Da braucht bloss einer (auf Disk) das richtige Tool, und der schiesst Dein Programm ab.
Win2k kann auch Programme brutal aus dem RAM feuern. Da nuetzt OnCloseQuery nicht viel. (Ich weis leider nicht mit welchem API- Befehl genau - ich denk aber auch nicht so toll drueber nach.
PS: Ich hab fuer sowas nen eigenen 'Taskman', der kann alle Prozesse / Progs anzeigen (auch unsichtbare) und 'steuern': Hide/ Show, Forground / Background, Close. Ist blos nicht so agressiv wie der Win- Taskman.
Nur sauber ueber den Win- Taskman komm ich nicht bei Win2K (bei aelteren Wins gings besser)
Win- Taskman sicher austricksen klappt bisher nur mit Close- Message! (Der schiesst aber leider auf alles und jeden?) Oder mit 'nem Hook!?
Wenn Du erst 2 1/2 Wochen am BCB bist, wuerde ich Dir raten mit solchen Sachen etwas zurueckhaltender zu 'spiele'. Du sagst, Deinem Lehrer isses egal, aber wenn Dein Prog mal im falschen Moment schiesst und das System (durch ev Absturz) lahmlegt, wird er seine Meinung garantiert(!!!) aendern. Dann isse ihm egal, obs bisher gut ging - so ist das Leben.
PS: villeicht faellt WebFritze noch was zum Hook ein? Vor meinem 'Rundumsichschiesser' kann ich nur warnen! Ich uebernehme keinerlei Garantie: Use for own risk
-
Wenn du so einen tollen Taskman geproggt hast, lass ma die addy rüberwachsen
Und meinem Lehrer isses egal ob der PC abstürtzt, denn die haben ja wie schon 100 mal gesagt Wächterkarten.
-
Hi,
was sind Wächterkarten? Hab ich noch ie gehört!MFG
Alexander Sulfrian
-
@Der Altenburger: Du scheinst meine Methode nicht ausprobiert zu haben! Funzt perfekt! Sobald man Alt+Ctrl+Del drückt, erscheint der TaskMan - aber nur ganz kurz, denn er wird sofort wieder von meinem Programm überdeckt. NO CHANCE!!! Und aus dem RAM schießen?
Es geht nicht! Man kann an kein Programm ran, während meines läuft! Wie gesagt würde ein Keyboard-Hook das Ganze noch abrunden.
Win- Taskman sicher austricksen klappt bisher nur mit Close- Message!
Was meinst du, warum ich den Code da oben geschrieben habe? Hmm? Nein, man braucht den TaskMan nicht zu schließen! Meine Methode funzt! Probier es aus.
-
Den LowLevel-Keyboard-Hook gibt es hier: Minimieren und Schließen Deaktivieren