Usando as APIs para “Procurar” e “Mover” janelas do Windows
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.
Adriano Santos

Deixe seu comentário