Fenster immer im Vordergrund
-
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
-
@quizzmaster: Wenn du alle diese schönen Tastenkombis unter Win9x/ME deaktivieren willst, dann musst du Windows vorgaukeln, dass der Screensaver läuft. Das geht mit SystemParametersInfo(). Und zwar so:
// Screensaver an SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, NULL, 0); // Screensaver aus SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, NULL, 0);
-
@ WebFritzi: Was denkst du? ... Das hab ich auch schon drinne.
Ich brauchs nur unter Win2k.@ Der Altenburger: Wächterkarten setzen beim reboot des PC's alles wieder so wie es war. Das heißt, wenn ich 20 dateien lösche sind die nach dem reboot wieder da.
P.S.: Wo bleibt die addy zu deinem Taskman?
-
@Quizmaster
Nach Waechterkarten hab' ICH gar nicht gefragt???
Ich weis nivht was'n addy ist, aber ich kann ja das Teil posten:
<snip>
Bei Interesse bitte per Mail an DerAltenburger wenden.
[ Dieser Beitrag wurde am 17.04.2003 um 22:22 Uhr von Jansen editiert. ]
-
Wenn das zu viel ist fuer das Forum, loesch bitte die letzten 3 Eintraege!!!
-
@Der Altenburger: Noch ganz fit, oder was!!! :o
-
@ Alexander Sulfrian: Wächterkarten setzen beim reboot des PC's alles wieder so wie es war. Das heißt, wenn ich 20 dateien lösche sind die nach dem reboot wieder da.
@ WebFritzi: Der Taskman ist echt fett. besser als der M$ von Win Me.
-
Hier mal eine ganz andere möglichkeit
du benutzt als betriebssytem win9x editierst die
system.ini und schreibst bei shell=<deine exedatei rein>aber vorsicht bau dir ein hintertürchen in deinen programm ein.
von dem du programme starten lassen kannstsomit wird nicht mehr der programmanager geladen sondern dein programm
also alle win grundfunktionen bildschirmschoner usw. laufen nicht mehrmfg VergissEs
-
@quizzmaster: Ich bezweifle, dass der besser ist als der von Windowse, denn er listet ja nicht mal die Prozesse auf - nur die Fenster. Also ist das garkein TaskManager sondern ein WindowManager (soweit ich mir den Code angesehen habe). Da ist meiner garantiert besser.
@Der Altenburger: Kannste mir das mal als EXE schicken? Ich würd ihn nämlich gerne mal mit meinem WindowManager vergleichen. Hab auch mal einen gemacht.
-
Kann ich, wird aber ev. nicht laufen bei Dir. Der ist mit BCB 4.0 gemacht, da brauchste die Bibliotheken von Borland, die sind nicht mit reingelinkt! (3.5 MB extra!- bei mir kein Problem, hab' DSL) mit
Aber Du kannst den doch selber kompilieren, sind nur die 3 Dateien (.h, .cpp und die .dfm als Textdatei)? Brauchste nur ueber ein Projekt mit einer Form kopieren!
Kanns aber auch mailen! ???
PS: Stimmt, ist genaugenommen nur ein Fenster- Verwalter! War blos mal 'ne Spielerei mit WinApi, Timer ...
Sind auch ein paar Test- Zeilen drin, um mal was zu probieren.
Das sollte nie eine Konkurenz zum System werden.