Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Qui Ago 02, 2012 10:27 am Assunto: HWND (Janela) a partir de um determinado PID do Windows! |
|
|
Bom dia pessoal!
Passei por esse problema por alguns dias e descobri uma solução bem simples e que funciona de forma perfeita!
Sua aplicação RAD pesquisar um determinado processo na lista do Windows e recuperar (quando existir) a respectiva janela através do pid desse processo.
Vale muito a pena!
P.S.: O teste da variável MLocated é para localizar o nome de um determinado executável informado via parâmetro. Mas o registro TProcessEntry32 possui outras informações sobre o processo que podem te ajudar nessa "busca".
O exemplo é uma implementação do clique de um botão qualquer...
São dois métodos:
GetPIDExecutavel -> Recupera o PID de um processo qualquer
GetHWNDFromPID -> Recupera o HWND desse PID recuperado
Elas estão separadas para facilitar o uso.
Código: | function GetPIDExecutavel( const ANome: String ): Cardinal;
var
MContinueLoop: BOOL;
MHandle: THandle;
MProcList: TProcessEntry32;
MLocated: Boolean;
begin
result := 0;
MHandle := CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
MProcList.dwSize := SizeOf( MProcList );
MContinueLoop := Process32First( MHandle, MProcList );
while Integer( MContinueLoop ) <> 0 do
begin
MLocated := ( ( UpperCase( ExtractFileName( MProcList.szExeFile ) ) = UpperCase( ANome ) ) or ( UpperCase( MProcList.szExeFile ) = UpperCase( ANome ) ) );
if MLocated then
begin
result := MProcList.th32ProcessID;
Break;
end;
MContinueLoop := Process32Next( MHandle, MProcList );
end;
CloseHandle( MHandle );
end; |
Código: | function GetHWNDFromPID( const pid: Cardinal ): HWND;
var
MHandle: HWND;
MProcPID: Cardinal;
begin
result := 0;
MHandle := GetTopWindow( 0 );
while Boolean( MHandle ) do
begin
{ ** O retorno do método não é necessário. Apenas o seu Handle ** }
GetWindowThreadProcessId( MHandle, MProcPid );
if MProcPid = pid then
begin
result := MHandle;
Break;
end;
{ ** Recuperando a próxima janela ** }
MHandle := GetNextWindow( MHandle, GW_HWNDNEXT );
end;
end; |
A chamada:
Código: | procedure TFormModulos.Button1Click(Sender: TObject);
var
MPidExecutavel: Cardinal;
MHandle: HWND;
begin
{ ** Recuperando o PID do executável ** }
MPidExecutavel := GetPIDExecutavel( 'MeuPrograma.exe' );
{ ** Recuperando o HWND do PID ** }
MHandle := GetHWNDFromPID( MPidExecutavel );
{ ** "Brincando" com a janela ** }
if MHandle <> 0 then
begin
BringWindowToTop( MHandle );
ShowWindow( MHandle, SW_SHOW );
end;
end; |
|
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qui Ago 02, 2012 12:36 pm Assunto: |
|
|
Somente por curiosidade JCMF, vc utiliza isto em quê?
bye _________________ P.O.W.E.R B.Y D.E.L.P.H.I |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Qui Ago 02, 2012 1:23 pm Assunto: |
|
|
johnny-walker escreveu: | Somente por curiosidade JCMF, vc utiliza isto em quê?
bye |
Aqui, existe um antigo sistema em MS-DOS que ainda é utilizado por alguns clientes que não podem fazer a migração... então, a TI inventou de criar um módulo 32 bits, gráfico, que pudesse "mascarar" o menu desse sistema e só fazer as chamadas das rotinas internas, integrado ao principal (delphi).
Acontece que o DOS é executado via CMD e a única forma de saber qual é o executável rodando é pela lista de processos do windows... E para realizar a amnipulação da janela do aplicativo, era preciso recuperar o HWND dela.
Muita coisa pra pouca coisa, se é que vc entende... |
|
Voltar ao Topo |
|
 |
marcieldeg Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Qui Ago 02, 2012 3:48 pm Assunto: |
|
|
Se o aplicativo for gráfico, e você tiver o ID da thread, pode usar:
Código: | function GetWindowHandle(xThreadId: Integer): HWND;
var
xGUIInfo: TGUIThreadInfo;
begin
xGUIInfo.cbSize := SizeOf(xGUIInfo);
GetGUIThreadInfo(xThreadId, xGUIInfo);
Result := xGUIInfo.hwndActive;
end; |
Não funciona em aplicativos do DOS, por exemplo. |
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Sex Ago 03, 2012 10:09 am Assunto: |
|
|
Super interessante Johnny! Mas, pelo que entendi... isso serve para acessar funções de dll desenvolvidas em 16bits, não!?
Citação: | Overview
The intention of this article is to show how to access 16 bit dll's with applications developed in 32-bit Delphi, using undocumented functions found in KERNEL32.EXE |
|
|
Voltar ao Topo |
|
 |
|