Impedir a alteração da data e hora do sistema

Delphi

20/08/2004

Olá!

Gostaria de saber se tem criar um sistema que impeça a alteração da data e hora do sistema.

Meu sistema acerta a hora do sistema ao abrir e não quero permitir que o usuário tenha acesso a alteração enquanto o programa estiver rodando.

Alguém pode dar uma ajuda?
Valeu!

wbb


Wbb

Wbb

Curtidas 0

Respostas

Tatuweb

Tatuweb

20/08/2004

A opção mais simples é vc renomear o arquivo Timedate.cpl para qualquer outro nome que quiser e depois colocar o nome correto quando finalizar o programa. Entretanto se o seu aplicativo ou o Windows travar por algum motivo ai ferra o usuário pois ele não vai mais conseguir alterar a hora pelo Windows.

Eu acredito que deve haver um jeito de desabilitar o ajuste de data e hora pelo registro mas eu não conheço. Eu adaptei duas rotinas para desabilitar o ajuste de hora/data do Windows mas acho que esse código meio que uma gambiarra por estar dentro de um Timer... mas como funciona eu vou postar.

[b:8c9d0b68b1]1º Modo: Fechando a janela:[/b:8c9d0b68b1]
Dentro de um Timer vc verifica se a janela Data/hora está aberta ou não e se tiver vc fecha:

var
  AppHandle: THandle;
begin
  AppHandle := FindWindow (nil, ´Propriedades de Data/Hora´);
  if AppHandle <> 0 then PostMessage (AppHandle, WM_QUIT, 0, 0);
end;


[b:8c9d0b68b1]2º Modo: Desabilitando os controles da janela data/hora.[/b:8c9d0b68b1]
O código abaixo também vai dentro de um timer. Ele vai desabilitar todos os controles exceto os botões OK e Cancelar. Com isso o usuário não poderá fazer alterações.

type
  EnumClass = class
  public
    Treeview: TTreeview;
    ParentNode: TTreeNode;
  end;

function MainEnumProc (Hwnd, lParam: Longint): Boolean; stdcall;
var
  ECChild: EnumClass;
  Buffer: PChar;
begin
  ECChild := EnumClass.Create;
  Buffer := StrAlloc (501);
  try
    EnumChildWindows (Hwnd, @MainEnumProc, Longint(ECChild));
    GetClassName (Hwnd, Buffer, 500);
    if Buffer <> ´Button´ then EnableWindow (Hwnd, FALSE);
  finally
    ECChild.Free;
    StrDispose (Buffer);
  end;
  Result := True;
end;

e dentro do Timer vai:

var
  EC: EnumClass;
  wnd: HWND;
begin
  wnd :=  FindWindow (nil, ´Propriedades de Data/Hora´);
  EC := EnumClass.Create;
  try
    EnumChildWindows (Wnd, @MainEnumProc, Longint(EC));
  finally
    EC.Free;
  end;
end;


PS: O segundo código requer a unit ComCtrls declarada.


GOSTEI 0
Kroki

Kroki

20/08/2004

Tenho uma Lan e a melhor maneira ke achei foi renomear a extensao do arquivo Timedate.cpl .
No meu programa de controle adaptei uma roina que renomeia para lpc ou cpl dependendo da situacao.


GOSTEI 0
Rômulo Barros

Rômulo Barros

20/08/2004

Eu tentei renomear o arquivo Timedate.cpl manualmente e, após renomeá-lo, o windows já cria outro automaticamente. Se excluir ou recortar o arquivo acontece a mesma coisa.


GOSTEI 0
Alves

Alves

20/08/2004

E se o kra for no plompt do DOS e digitar um (C:\Date) muda a data ou
(C:\Time) Muda a Hora, e ai como fica ???


GOSTEI 0
Kroki

Kroki

20/08/2004

Esqueci de dizer que uso Win 98se,e funciona.
A respeito do dos,tambem esqueci de dizer que meu programa bloqueia o acesso ao Dos etc..


GOSTEI 0
Rômulo Barros

Rômulo Barros

20/08/2004

No meu caso, utilizo XP.


GOSTEI 0
Alves

Alves

20/08/2004

Como é feito o bloqueio??

Esqueci de dizer que uso Win 98se,e funciona. A respeito do dos,tambem esqueci de dizer que meu programa bloqueia o acesso ao Dos etc..



GOSTEI 0
Beppe

Beppe

20/08/2004

[quote:e8e889fd0e=´Undeclared Identifier´]Eu tentei renomear o arquivo Timedate.cpl manualmente e, após renomeá-lo, o windows já cria outro automaticamente. Se excluir ou recortar o arquivo acontece a mesma coisa.[/quote:e8e889fd0e]
Tentou fazer via Delphi?


GOSTEI 0
Rômulo Barros

Rômulo Barros

20/08/2004

[quote:87c019f11c=´Undeclared Identifier´]Eu tentei renomear o arquivo Timedate.cpl manualmente e, após renomeá-lo, o windows já cria outro automaticamente. Se excluir ou recortar o arquivo acontece a mesma coisa.

Tentou fazer via Delphi?[/quote:87c019f11c]

Não, via Delphi eu não testei ainda. Funciona? :wink:


GOSTEI 0
Rômulo Barros

Rômulo Barros

20/08/2004

Galera, testei com o Delphi (Windows XP) e também não deu certo. Após renomear o arquivo, automaticamente o SO criou outro arquivo idêntico ao anterior (datetime.cpl) :lol: :lol: :lol:


GOSTEI 0
Beppe

Beppe

20/08/2004

Há algum tempo atrás eu postei aqui mesmo uma ´silução´ para isto. Na época só tinha imaginado que poderia funcionar, hoje testei e deu certo.

Não é preciso, nem garante que o tempo seja adiantado, mas deve resolver o caso de vcs.

Segue o link:
http://delphiforum.icft.com.br/forum/viewtopic.php?t=30698&

E algum código:
procedure TForm1.WMTimeChange(var Message: TWMTimeChange);
var
  SysTime: TSystemTime;
begin
  inherited;
  if Now < Tempo then
  begin
    DateTimeToSystemTime(Tempo, SysTime);
    SetSystemTime(SysTime);
    Label1.Caption := FormatDateTime(´dddd, mmmm d, yyyy, hh:mm:ss AM/PM´, Now);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Tempo := Now;
end;



GOSTEI 0
POSTAR