Ir para conteúdo
Fórum Script Brasil
  • 0

Impedir Proteção De Tela


McBlade

Pergunta

Saudações,

Estou desenvolvendo um software de exportações DBF para FDB e durante um while para carregar os dados num grid, ao acionar a proteção de tela, o windows trava meu programa. Não sei se é meu código ou porque são 4200 registros fazendo while e por isso pesa!

A questão é... Quem aí sabe impedir que o windows acione a proteção de tela??

Link para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

  • 0

Olá colega, o Windows manda uma msg do tipo WM_SysCommand informando em WParam SC_Screensave. É só você interceptá-la e não deixar seguir adiante.

Defina:

procedure WMSysCommand(var Msg:TMessage); message WM_SysCommand;
Depois:
procedure TForm1.WMSysCommand(var Msg:TMessage);
begin
  if Msg.WParam <> SC_Screensave then
    inherited;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Não entendi muito bem mas vou testar amanha, valeu!!!
Antes do Windows acionar a proteção de tela, ele lança uma msg p/ quem quiser saber.

Como você quer saber quando a proteção de tela irá entrar, então você deve definir uma procedure do tipo message WM_SysCommand p/ conseguir 'enxergar' essa msg. O inherited diz ao Windows p/ prosseguir c/ SC_Screensave, como não vai ser dado, então acredito que a proteção de tela não aparecerá.

Link para o comentário
Compartilhar em outros sites

  • 0

Mas eu teria que ficar chamando sempre essa função ou uma vez só basta??
Como assim ?

Os métodos do tipo message são como eventos, eles acontecem por alguma causa externa que neste caso é o Windows que faz acionar sua procedure WMSysCommand; você não precisa fazer nada, é só declarar.

Ela é pública ou privada??
Tanto faz.
Queria um exemplo de código!!!
Aquele que coloquei acima não serve ?

Link para o comentário
Compartilhar em outros sites

  • 0

Amigo testa dessa forma agora, mas a forma que o s3c passou tb funciona...

Inclua na seção uses: Windows

Na seção "private" do Form principal acrescente:
procedure AppMsg(var Msg: TMsg; var Handled: Boolean);

Na seção "implementation" acrescente (troque TForm1 para o nome do seu form principal): 

procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.Message = wm_SysCommand) and (Msg.wParam = sc_ScreenSave) then
  Handled := true;
end;

No evento "OnCreate" do form principal, coloque:
Application.OnMessage := AppMsg;

falou qualquer coisa posta ai

Alexandre - Vivendo&Aprendendo

Link para o comentário
Compartilhar em outros sites

  • 0

A sua aplicação deve estar em foco para que WM_SysCommand possa ser recebida.

Uma outra alternativa é você utilizar a unit Registry e zerar a chave do Screen Saver.

No 2000 ela está em:

HKEY_CURRENT_USER

Control Panel

Desktop

SCRNSAVE.EXE

No onCreate, zere-a; no onDestroy recoloque-a.

Link para o comentário
Compartilhar em outros sites

  • 0
A sua aplicação deve estar em foco para que WM_SysCommand possa ser recebida.

Uma outra alternativa é você utilizar a unit Registry e zerar a chave do Screen Saver.

No 2000 ela está em:

HKEY_CURRENT_USER

Control Panel

Desktop

SCRNSAVE.EXE

No onCreate, zere-a; no onDestroy recoloque-a.

Não está lá não!! Eu uso o XP que segue a mesma linha do 2000!!

Link para o comentário
Compartilhar em outros sites

  • 0
Amigo testa dessa forma agora, mas a forma que o s3c passou tb funciona...

Inclua na seção uses: Windows

Na seção "private" do Form principal acrescente:
procedure AppMsg(var Msg: TMsg; var Handled: Boolean);

Na seção "implementation" acrescente (troque TForm1 para o nome do seu form principal): 

procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.Message = wm_SysCommand) and (Msg.wParam = sc_ScreenSave) then
  Handled := true;
end;

No evento "OnCreate" do form principal, coloque:
Application.OnMessage := AppMsg;
falou qualquer coisa posta ai Alexandre - Vivendo&Aprendendo
então fiz certinho como você postou e não funcionou ainda! Olha meu Código de teste:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure AppMsg(var Msg: TMsg; var Handled: Boolean);    
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.Message = wm_SysCommand) and (Msg.wParam = sc_ScreenSave) then
    Handled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMsg;
end;

end.

Não sei mais o que está de errado!!

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Entaum...
Tente desabilitar pelo registro; procure por 'ScreenSaveActive' e deixe o valor = 0; no 2000 está em:

HKEY_CURRENT_USER

Control Panel

Desktop

Pode até funcinar porque no meu Laptop tem essa chave no registro, mas no meu PC não!!!

Então eu ainda fiko desorientado porque se uma máquina não tiver essa chave no registro e a ScreenSaver tiver ativada...

Mas fácil é desativar na mão mesmo viu galera!!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...