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

Ocultar/não Ocultar Relógio Do Windows


Paulo Nobre

Pergunta

Prezados Colegas,

Tenho um programinha,um relógio deste imitando digital,para ficar

no desktop, que tem como uma das opções, esconder ou fazer aparecer

o relógio do windows.

Para quem não conhece é quer testar é o seguinte(este código não atua no registro diretamente):

Para ocultar o relógio...

ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Hide);

Para mostrar o relógio...

ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Show);

Tenho o seguinte problema:

Quando escondo o relógio ele desaparece(tudo bem) só que ao invés dos

ícones do tray se ajustarem e ocuparem logo o espaço que o relógio ocupava fica um buraco. É preciso clicar na setinha(XP) de mostrar ícones escondidos do tray para que o espaço em branco fique ocupado.

A mesma coisa quando faço o relógio aparecer(aí é pior). Ele aparece,mas apenas depois de clicar na seta do tray.

Na realidade o que preciso(acho e talvez) é de algum código tipo setfocus para está seta. Alguma código que rearume os ícones no tray. É bem provável que este código use alguma API do windows. Não tenho a mínima idéia de qual. mad.gifmad.gif

Alguém pode me ajudar.

Se alguém quiser me ajudar e ver na prática, coloque dois botões num form e cole cada código acima num botão e veja o efeito.

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Tenho o seguinte problema:

Quando escondo o relógio ele desaparece(tudo bem) só que ao invés dos

ícones do tray se ajustarem e ocuparem logo o espaço que o relógio ocupava fica um buraco. É preciso clicar na setinha(XP) de mostrar ícones escondidos do tray para que o espaço em branco fique ocupado.

A mesma coisa quando faço o relógio aparecer(aí é pior). Ele aparece,mas apenas depois de clicar na seta do tray.

Engraçado... aqui executa diferente. O relógio é imediatamente escondido, porém o "buraco" que ele preenchia permanece lá (inclusive se eu der um duplo-clique lá ele abre a janela para eu acertar a hora!). Não aparece a tal setinha (aquela que aparece para mostrar ícones ocultos). E ele volta imediatamente também.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Graymalkin,

Quando disse que ele não volta imediatamente não é quando você clica para sumir e imediatamente clica para aparecer e sim quando você clica para sumir, clica na seta(creio que é necessário ter muitos ícones no try para isso) ajeita os ícones e aí sim faz o relógio aparecer. Neste caso ele não aparece de imediato.

Fazer o quê né?

Vamos ver se alguém já mexeu com isso e me dá uma dica!

Mesmo assim obrigado por analisar o problema.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, tente mandar uma msg p/ a área de status da taskbar:

uses ShellAPI;
var NI:TNotifyIconData;
begin
ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Hide);
NI.cbSize := SizeOf(NI);
Shell_NotifyIcon(NIM_Delete, @NI);
end;

E o mesmo para mostrar o relógio.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c, estava na esperança de você ler o tópico.

Isto eu nunca saberia fazer.

Como sempre, você é dos que sempre resolvem os meus grandes "abacaxis".

Muito obrigado,vou testar.

A propósito para mostrar também usarei:

NI.cbSize := SizeOf(NI);

Shell_NotifyIcon(NIM_Delete, @NI);

É SizeOf e NIM_DELETE mesmo ou tem outro equivalente.

Estou perguntando aqui no trabalho sem testar.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, na verdade Shell_NotifyIcon é uma função da api shell32 que trabalha c/ ícones da área de status da taskbar(área do relógio). você pode inserir, deletar e modificar ícones desta área com essa função. Esse código não tem lógica alguma;

simplesmente dá uma cutucada naquela área e com isto ela é forçada a ser redesenhada.

É SizeOf e NIM_DELETE p/ os dois casos.

Convém limpar a estrutura NI antes do NI.cbSize para um caso raro do handle de algum ícone coincidir e ele ser deletado:

FillChar(NI, SizeOf(NI), 0);

NI.cbSize := SizeOf(NI);

Shell_NotifyIcon(NIM_Delete, @NI);

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c

Os códigos são os seguinte:

Ocultar o relógio:

procedure TfrmRelogio.mnuNaoMostrarWindowsClick(Sender: TObject);
begin
  reg.rootkey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('\SOFTWARE\NOBRE INFORMÁTICA\RELÓGIO',True);
  reg.WriteString('Mostrar Relógio do Windows','Não');
  frmRelogio.mnuMostrarWindows.Visible:= True;
  frmRelogio.mnuNaoMostrarWindows.Visible:= False;
  //O código abaixo é o principal para  ocultar o relógio do windows.
  ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Hide);
  FillChar(NI,Sizeof(NI),0);
  NI.cbsize:= SizeOf(NI);
  Shell_NotifyIcon(NIM_Delete,@NI);
end;
Mostrar o relógio:
procedure TfrmRelogio.mnuMostrarWindowsClick(Sender: TObject);
begin
  reg.rootkey:=HKEY_LOCAL_MACHINE;
  reg.OpenKey('\SOFTWARE\NOBRE INFORMÁTICA\RELÓGIO',True);
  reg.WriteString('Mostrar Relógio do Windows','Sim');
  frmRelogio.mnuMostrarWindows.Visible:= False;
  frmRelogio.mnuNaoMostrarWindows.Visible:= True;
  //O código abaixo é o principal para mostrar o relógio do windows.
  ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Show);
  FillChar(NI,Sizeof(NI),0);
  NI.cbsize:= SizeOf(NI);
  Shell_NotifyIcon(NIM_Delete,@NI);
end;

NI: TNotifyIconData; se encontra no Var antes de implementation

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, verifique se ele coloca um ícone junto ao relógio.

Após o ShowWindow, coloque:

  NI.cbSize := SizeOf(NI);
  NI.Wnd    := Handle;
  NI.uID    := 0;
  NI.hIcon  := Application.Icon.Handle;
  NI.uFlags := NIF_ICON;
  Shell_NotifyIcon(NIM_Add, @NI);

Se for colocado, então após Shell_NotifyIcon(NIM_Add, @NI); coloque Shell_NotifyIcon(NIM_Delete, @NI);

Se não for colocado, veja se você tem a variável NotifyIconData_V2_Size; se tiver, troque NI.cbSize := SizeOf(NI); por NI.cbSize := NotifyIconData_V2_Size;

Isto porque pode ser problema da versão da dll, o meu é o Win2000, pode ser que o XP seja diferente.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá s3c, fazendo o teste que você sugeriu...

Colocando o código após ShowWindows nos dois "eventos", mostrar e não mostrar, funciona perfeitamente.

Confirma para mim se numa linguagem não técnica o que aconteceu foi o seguinte:

"Quando você usou Shell_Notify(NIM_Add,@NI), colocando o ícone no tray acabou dando uma "cutucada" grande, que era o que precisava. Como o ícone não pode aparecer aí entra o Shell_NotifyIcon(NIM_Delete, @NI);

para retirá-lo de lá."

Seria mais ou menos isso, na linguagem da cutucada?

Brigadão por mais essa s3c.

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,3k
×
×
  • Criar Novo...