Mes cieux d'âmes,
Je vous reviens avec une merveilleuse question, sur laquelle je me casse la tête depuis quelques heures... J'm'en va vous expliquer :
Mon but est de pouvoir mettre en veille un poste (veille normale ou veille prolongée), et de le reveiller; jusque là, j'y parviens, j'arrive à mettre en veille et à le reveiller en choisissant mon interval, par exemple 10secondes, pour ce faire, j'utilise cette procedure :
//Mise en veille
procedure standby;
begin
if IsPwrSuspendAllowed then
SetSuspendState(false, false, false) //le premier parametre, s'il vaut true alors Veille prolongée
else
MessageDlg('La mise en veille n'est pas gérée sur ce system.', mtWarning, [mbOK], 0);
end;
Pour déclencher la remise en route, j'utilise les evenement "d'alimentation" et les thread de cette manière :
//Cette fonction va detecter la mise en veille (ou veille prolongée), et va lancer le thread avec le délai avant la remise en route
procedure TForm1.WMPowerBroadcast(var Msg: TMessage);
begin
//Check for suspend operation
case Msg.wParam of
//Query for allowing suspend
PBT_APMQUERYSUSPEND : ;
PBT_APMSUSPEND : TWakeupThread.Create(-400000000); // Ici je detecte la veille
// Resuming from event, we want monitor display
PBT_APMRESUMEAUTOMATIC : SetThreadExecutionState(ES_DISPLAY_REQUIRED);
PBT_APMSTANDBY : TWakeupThread.Create(-400000000); //detect veille prolongée
end;
// Set message result
Msg.Result:=1;
end;
//Création du thread
constructor TWakeupThread.Create(Time: Int64);
begin
inherited Create(False);
FreeOnTerminate:=True;
FTime:=Time;
end;
//Execution
procedure TWakeupThread.Execute;
var hTimer: THandle;
begin
// Create a waitable timer.
hTimer:=CreateWaitableTimer(nil, True, 'WaitableTimer');
if (hTimer <> 0) then
begin
if (SetWaitableTimer(hTimer, FTime, 0, nil, nil, True)) then
begin
WaitForSingleObject(hTimer, INFINITE);
end;
CloseHandle(hTimer);
end;
end;
Donc en résumé, quand on detect la mise en veille, on déclanche le timer pour un délai souhaité, à la fin du délai, le paramétre à True de la fonction SetWaitableTimer permet la remise en route du system, si il était à False, ca resterai en veille...
Mais moi ce que j'aimerai, c'est remettre en route le system, à l'heure que je désire... J'ai vu dans la MSDN que le paramétre FTime de la fonction SetWaitableTimer pouvait être une heure (si j'ai bien compris) : http://msdn.microsoft.com/en-us/library/ms686289(VS.85).aspx
mais je ne parvient pas à utiliser cette fonction de cette manière et n'ai trouvé aucun exemple... Et c'est là que je solicite vos lumiéres !
J'ai pourtant essayé une methode palliative mais qui ne fonctionne pô (l'idée étant d'executer le timer avec SetWaitableTimer avec le paramétre false tant qu'il ne trouve pas dans l'heure actuelle l'heure à laquelle je veux redémarrer le system, si il le trouve il execute le timer avec le paramétre true), la voici :
//Execution
procedure TWakeupThread.Execute;
var hTimer: THandle;
begin
// Create a waitable timer.
hTimer:=CreateWaitableTimer(nil, True, 'WaitableTimer');
while (hTimer <> 0) do
begin
if (SetWaitableTimer(hTimer, FTime, 0, nil, nil, False)) then
begin
WaitForSingleObject(hTimer, INFINITE);
if pos('10:30',DateTimeToStr(gettime))<>0 then
begin
closeHandle(hTimer);
hTimer:=0;
end
end;
hTimer:=CreateWaitableTimer(nil, True, 'WaitableTimer');
if (hTimer <> 0) then
begin
if (SetWaitableTimer(hTimer, FTime, 0, nil, nil, True)) then
begin
WaitForSingleObject(hTimer, INFINITE);
end;
CloseHandle(hTimer);
end;
end;
C'était pourtant bien tenté 
Merci de vos conseils et aides précieux !
L'Armand joue, l'arme en joug...
www.art-ment.com