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

20/08/2004

0

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


Responder

Posts

20/08/2004

Tatuweb

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.


Responder

21/08/2004

Kroki

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.


Responder

21/08/2004

Rômulo Barros

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.


Responder

21/08/2004

Alves

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 ???


Responder

21/08/2004

Kroki

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..


Responder

21/08/2004

Rômulo Barros

No meu caso, utilizo XP.


Responder

21/08/2004

Alves

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..



Responder

21/08/2004

Beppe

[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?


Responder

21/08/2004

Rômulo Barros

[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:


Responder

21/08/2004

Rômulo Barros

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:


Responder

21/08/2004

Beppe

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;



Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar