ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

HWND (Janela) a partir de um determinado PID do Windows!

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Qui Ago 02, 2012 10:27 am    Assunto: HWND (Janela) a partir de um determinado PID do Windows! Responder com Citação

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! Wink

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qui Ago 02, 2012 12:36 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Qui Ago 02, 2012 1:23 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Qui Ago 02, 2012 3:48 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qui Ago 02, 2012 6:21 pm    Assunto: Responder com Citação

Os aplicativos DOS são 16 bits, neste caso é necessário utilizar a técnica de thunking, para 16/32 bits.
veja este link, tem um artigo a respeito:

http://www.delphipages.com/articles/16-bit_thunking_with_32-bit_delphi-9183.html


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Sex Ago 03, 2012 10:09 am    Assunto: Responder com Citação

johnny-walker escreveu:
Os aplicativos DOS são 16 bits, neste caso é necessário utilizar a técnica de thunking, para 16/32 bits.
veja este link, tem um artigo a respeito:

http://www.delphipages.com/articles/16-bit_thunking_with_32-bit_delphi-9183.html


bye

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB