Buscar

Usando as apis para procurar e mover janelas do windows

Código

//Por Adriano Santos

{
Neste artigo vou mostar como usar algumas APIs do Windows para mover a caixa de Diálogo chamada pela função SelectDirectory.

A caixa de diálogo em questão, quando chamada, se abre alinhada ao canto direito inferior do Windows, próximo ao relógio. Com algumas técnicas, vamos poder movê-la em tempo de execução para uma nova posição. Para isso vamos usar as seguintes APIS:

FindWindow    : Usada para localizar a janela.
GetWindowRect  : Usada para recuperar a posição em que a janela foi aberta.
MoveWindow    : Para mover a caixa de diálogo para a posição desejada, no nosso caso, centro do desktop.

A primeira coisa que devemos fazer é desenhar o form de exemplo.

Abra o Delphi e em um novo projeto insira os seguintes componentes:

ü      1 TButton. Mude sua propriedade Name para btnSelecionar e Caption para Selecionar Diretório.

ü      1 TEdit com o Name de edCaminho. Limpe a propriedade Text.

ü      1 TTimer da paleta System com o nome de tmAjustar.

ü      Configure o form como no exemplo da figura 1.

 

ü      Mude a propriedade Enabled do TTimer para False e Interval coloque 100.



Feito isso, declare na cláusula "uses" do form a unit FileCtrl.

Para o evento onClick do btnSelecionar digite o algoritimo da Listagem 1;

}


procedure TForm1.btnSelecionar1Click(Sender: TObject);
var
  Dir : String;
begin
  tmAjustar.Enabled := True;
  if SelectDirectory('Selecione um diretório.','',Dir) then
    edCaminho.Text := Dir;
end;

{No evento onTimer do objeto TTimer digite o código da Listagem 2;
}

procedure TForm1.tmAjustarTimer(Sender: TObject);
var
  tmHandle : THandle;
  tmRect   : TRect;
  tmAltura, tmLargura, tmNovoLeft, tmNovoTop : Integer;
begin
  {Declare a unit FileCtrl no uses do Form}
  tmHandle := FindWindow(Nil,'Procurar Pasta');
  if tmHandle > 0 then
  begin
    {Aqui eu pego os valores do Rect da Janela localizada, desta forma eu posso
    obter Left, Top, Bottom, Rigth e Etc}

    GetWindowRect(tmHandle,tmRect);
    {Aqui eu pego a altura e largura da Janela localizada}
    tmAltura   := tmRect.Right-tmRect.Left;
    tmLargura  := tmRect.Bottom-tmRect.Top;
    {Aqui eu defino o novo left e top, que serão no meio da tela do "WINDOWS"}
    tmNovoLeft := (Screen.Width div 2)  - (tmLargura div 2);
    tmNovoTop  := (Screen.Height div 2) - (tmAltura div 2);
    {Aqui eu envio uma mensagem para a janela indicando qual o novo destino}
    MoveWindow(tmHandle,tmNovoLeft,tmNovoTop,tmRect.Right-tmRect.Left,
      tmRect.Bottom-tmRect.Top,True);
    tmAjustar.Enabled := False;
  end;
  Screen.Cursor := crDefault;
end;

{Vamos as explicações:

Primeiro nós precisamos de um manipulador do tipo THandle, obtido através da api FindWindow:
}

tmHandle := FindWindow(Nil,'Procurar Pasta');

{A variável tmHandle recebe o “handle” da janela cujo o Caption é:

Procurar Pasta. O primeiro parâmetro de FindWindow é a classe da janela procurada. Como não sabemos passamos Nil.

Depois disso verificamos se o tmHandle é maior que zero, ou seja, se a janela foi encontrada. Em caso positivo, usamos a API GetWindowRect. Essa api armazena em uma variável do tipo TRect a informações suficientes para mais tarde movermos a janela.

GetWindowRect(tmHandle,tmRect);

O primeiro parâmetro, como podemos ver, é o manipulador Handle obtido mais acima. O segundo é a própria variável TRect.

Isso foi feito porque para mover a janela com MoveWindow, que veremos logo adiante, são necessários os novos Tamanhos e Posições. Para sabermos essas informações efetuamos alguns cálculos, veja:

Aqui eu pego a altura e largura da Janela localizada}

tmAltura   := tmRect.Right-tmRect.Left;
tmLargura  := tmRect.Bottom-tmRect.Top;
{Aqui eu defino o novo left e top, que serão no meio da tela do "WINDOWS"}
tmNovoLeft := (Screen.Width div 2)  - (tmLargura div 2);
tmNovoTop  := (Screen.Height div 2) - (tmAltura div 2);

{Com base nas informações recebidas em tmRect, calculamos a largura e altura da janela. Depois calculamos o novo left e top, usando o tamanho do Screen. Neste caso estamos enviando a janela para o centro do Desktop.

Agora só nos resta fazer a chamada a API MoveWindow, veja:

Aqui eu envio uma mensagem para a janela indicando qual o novo destino}

MoveWindow(tmHandle,tmNovoLeft,tmNovoTop,tmRect.Right-tmRect.Left,
  tmRect.Bottom-tmRect.Top,True);

{Explicando: o primeiro parâmetro é o manipulador Handle, ou seja, a própria janela. Os parâmetros seguintes são, respectivamente, Left, Top, Largura, Altura e se a janela deve ser “repintada”.

Por fim, desativamos o Timer, usado somente no instante em que a janela é chamada.
}

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Object pascal
Adicionada dia: 17/01/04
Por: Carlos Augusto Trudo
Visualizada: 7017 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009