Jump to content
Fórum Script Brasil
  • 0

Impedir Proteção De Tela


McBlade

Question

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 to comment
Share on other sites

20 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...