IsWindow – Verificando se handle existe
Tudo certo delpheiros?!
O assunto que vou tratar hoje, é sobre um pequeno problema que me ocorreu estes dias… Eu tinha um handle de uma janela, mas queria saber se ela ainda existia.
Muito bem, muitos devem estar pensando nessa hora, por que não usa o FindWindow?! É simples! No FindWindow você passa como parâmetro o nome da classe e o caption dela – eis meu problema – mas a possibilidade de vir uma outra janela com os mesmo parâmetros era muito grande… E eu queria a quela, que eu já havia pego. Pois bem, foi aí que encontrei o FindWindow.
O método FIndWindow é simples de usa veja a sintax a baixo:
BOOL IsWindow(HWND hWnd);
Você só precisa passar o handle, que retornará um true ou false.
Vamos colocar a mão na massa!
Crie um novo projeto VCL Forms Application:
E no form que ja vem criado, coloque dois SpeedButton(ou qualquer outro tipo de botão):
E crie outro form com um Label no meio, com caption “Hello World!”:

E adicione o seguinte código no Form1:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, Unit2; type TForm1 = class(TForm) SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); private hHandle: HWND; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.SpeedButton1Click(Sender: TObject); var frm: TForm2; begin frm := TForm2.Create(nil); frm.Show; hHandle := frm.Handle; end; procedure TForm1.SpeedButton2Click(Sender: TObject); begin if hHandle > 0 then begin if IsWindow(hHandle) then ShowMessage('Janela existe!') else ShowMessage('Janela não existe.'); end; end; end.
Analisando o código do Form1:
Na procedure SpeedButton1Click, estamos criando um novo form e colocando o seu handle em uma váriavel local.
E na procedure SpeedButton2Click, estamos implementando o IsHandle.
Coloque o seguinte código no Form2:
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Label1: TLabel; procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; end.
Analisando o código do Form2:
A única coisa que foi feita no Form2, foi mudar o Action para caFree(para que quando o formulário for fechado ele também seja destruído, e não persista) no evento FormClose.
Resultado:
Quando você for executar o exemplo vera que quando o Form2 estiver a aberto o IsWindow voltara com True e quando estiver fechado(e destruído) voltara com False.
Você até pode pensar que o exemplo foi simples, mas agora imagine que você automatizou o processo de download(exemplo no IE), e quer pegar a janela de progresso para saber em quantos porcentos esta e se o download ja acabou? O úsuario pode dar mais downloads, e novas janelas virem com mesmo nome e classe, mas você quer aquela em especifica… [É... acho que falei muito... mas em um próximo artigo demonstro como fazer download automatico pelo IE
]
Enfim… era isso. E um bom final de semana á todos!
Abraço,
Mello.

