Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Ruhezustand blockieren-> Versuch erkennen -> selbst auslösen (https://www.delphipraxis.net/65032-ruhezustand-blockieren-versuch-erkennen-selbst-ausloesen.html)

ichbins 11. Mär 2006 11:14


Ruhezustand blockieren-> Versuch erkennen -> selbst au
 
Hi, wie geht das?

ich habe ein Programm das "vertrauliche Daten" anzeigen kann, und wenn der User jetzt den Ruhezustand auslöst, will ich das blockieren, alle Daten speichern + beenden und dann selbst den Ruhezustand auslösen, so dass nicht beim nächsten Start die Daten wieder angezeigt werden.

nen Code für Ruhezustand auslösen hab ich irgendwo hier schon mal gefunden, das ist kein Problem.

aber wie kann ich ihn blockieren und sogar einen Versuch erkennen?

[ich hoffe mal ich hab in die richtige Sparte gepostet]

DevilsCamp 10. Apr 2006 07:33

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
MSDN-Library durchsuchenWM_POWERBROADCAST ist dein Freund.

Damit brauchst du den Ruhezustand nicht blockieren, sondern einfach nur auf die Message reagieren und deine Daten "verstecken" sobald diese Nachricht kommt.

Union 10. Apr 2006 08:07

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Hi ichbins,

im Interface:
Delphi-Quellcode:
procedure WMPowerBroadcast(var Msg : TWMPower) ; message WM_POWERBROADCAST;
In der Implementation:
Delphi-Quellcode:
//------------------------------------------------------------------------
procedure TfrmMain.WMPowerBroadcast(var Msg: TWMPower);
//------------------------------------------------------------------------
// Suspend ablehnen
//------------------------------------------------------------------------
begin
   Msg.Result := BROADCAST_QUERY_DENY;
end;

DevilsCamp 10. Apr 2006 08:15

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Wie ich schon geschrieben habe:
Wenn er soweit ist, dann braucht er den Versuch doch nicht blockieren um ihn dann selber zu starten.

Problem dabei ist nämlich:
Er blockiert den Versuch in den Ruhezustand zu gehen, "versteckt" seine Daten und initiiert den Ruhezustand dann selber.
Folge: Er landet WIEDER in seiner Behandlungsroutine wo er den Ruhezustand blockiert und wieder aufruft => Endlosscheife.

Aber wenn er schon soweit ist den Versuch in den Ruhezustand zu gehen zu überprüfen, dann kann er doch dort gleich seine Daten "verstecken" und den Ruhezustand zulassen.

Union 10. Apr 2006 08:20

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Das geht nicht, da das Suspend sehr zeitkritisch ist. Wenn man die Broadcast Nachricht nicht sofort beantwortet, wird das Suspend ausgelöst, ohne dass man darüber die Kontrolle hat. Besser wäre es, die Nachricht dann zu blockieren, die "Daten zu verstecken" und ein entsprechendes Flag zu setzen. Dann die Nachricht an sich selber schicken. Da das Flag jetzt gesetzt sein sollte, wird auf die Nachricht nicht mehr reagiert.

DevilsCamp 10. Apr 2006 08:26

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Zitat:

Zitat von Union
Das geht nicht, da das Suspend sehr zeitkritisch ist. Wenn man die Broadcast Nachricht nicht sofort beantwortet, wird das Suspend ausgelöst, ohne dass man darüber die Kontrolle hat.

Wo bitte hast du das her? Laut MSDN erwartet Windows von JEDEM Programm eine Antwort. Standardmäßig dürfte ein Delphi Programm TRUE zurückliefern, da er aber auf die Nachricht reagiert, sollte Windows solange warten, bis eine Antwort zurückkommt.



<edit>
OK, hast recht. Aber er hat immerhin ZWANZIG Sekunden Zeit auf die Nachricht zu reagieren. Das osllte wohl ausreichen.
</edit>

Union 10. Apr 2006 08:31

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Das ist praktische Erfahrung. Und Windows wartet auch nicht auf jedes Programm. Sonst würde ja das Runterfahren verhindert durch Programme, die diese Message gar nicht verarbeiten.

DevilsCamp 10. Apr 2006 08:33

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Siehe mein Edit.

Das Programm hat 20 Sekunden Zeit auf PBT_APMQUERYSUSPEND zu reagieren und ebenfalls 20 Sekunden bei PBT_APMSUSPEND.

Das sollte wirklich reichen. Denn ich denke mal es geht auch deutlich schneller, wenn er das Programm beendet.

Union 10. Apr 2006 08:37

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Wo hast Du denn die 20 Sekunden her? Das ist vielleicht der Fall bei einem Shutdown, aber was ist bei Hibernation? Dort bleiben zwar die Daten erhalten (theroetisch), aber wenn man dem nicht traut oder man gerne noch eine offene SQL-Server-Verbindung schliessen möchte... Und gerade auf Laptops macht das dann whuusch und weg.

DevilsCamp 10. Apr 2006 08:39

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
 
Zitat:

Zitat von Union
Wo hast Du denn die 20 Sekunden her?

MSDN-Library durchsuchenPBT_APMQUERYSUSPEND und MSDN-Library durchsuchenPBT_APMSUSPEND

Jeweils der erste Link


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz