Você está aqui: Inicio -> Dicas e Truques -> C++ -> Usando a função EnumWindows() da API do Windows para obter uma lista das janelas visíveis
Usando a função EnumWindows() da API do Windows para obter uma lista das janelas visíveis
Esta dica foi visualizada 277 vezes
Não encontrou o que estava procurando? Experimente nossa busca
Termo(s) da busca:

Categoria: Win32 API (Windows API)
Sub-Categoria: Formulários e Janelas [Veja dicas relacionadas]


Usando a função EnumWindows() da API do Windows para obter uma lista das janelas visíveis

A função EnumWindows() é usada quando precisamos obter uma lista de todas as janelas de nível alto (top-level) visíveis na tela (ainda que minimizadas ou sobrepostas pelas janelas de outros programas).

Esta função opera juntamente com uma função de CALLBACK EnumWindowsProc() que deve ser fornecida por nossos programas C++. Veja o protótipo da função EnumWindows():

BOOL EnumWindows(
   WNDENUMPROC lpEnumFunc,
   LPARAM lParam
);

Veja que o primeiro parâmetro da função é um ponteiro para a função de callback definida em nossa própria aplicação. Esta função de callback é chamada uma vez para cada janela encontrada. O segundo parâmetro é um valor a ser fornecido também por nossa aplicação. Geralmente fornecemos o valor 0 para este parâmetro.

Veja agora o protótipo da função de callback EnumWindowsProc():

BOOL CALLBACK EnumWindowsProc(
  HWND hwnd,
  LPARAM lParam
);

Esta função de callback possui dois parâmetros. O primeiro (hwnd) guarda o handle para a janela encontrada na iteração atual. O segundo parâmetro (lParam) é o valor fornecido à função EnumWindows() no momento de sua chamada. Para continuar e exibir os dados da próxima janela, a função de callback deve retornar TRUE. Para interromper a listagem, basta retornar o valor FALSE.

Veja um programa no qual listamos todas as janelas visíveis na tela, incluindo seu handle, id do processo, título e caminho e nome do executável:

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <psapi.h>

/*
  Este exemplo usa o header <psapi.h>
  É necessário fazer uma referência à psapi.lib 
*/

using namespace std;

// função de CALLBACK usada para listar todas as janelas
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam){
  CHAR temp[255];
  DWORD dwThreadId, dwProcessId;
  HINSTANCE hInstance;
  HANDLE hProcess;

  if(!hWnd)
    return TRUE; // não é uma janela
  if(!IsWindowVisible(hWnd))
    return TRUE; // é janela, mas não está visível
  if(!SendMessage(hWnd, WM_GETTEXT, sizeof(temp), (LPARAM)temp))
    return TRUE; // é janela, está visível, mas não possui título

  // obtém o handle da instância da janela
  hInstance = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
  // obtém o id da thread que criou este processo
  dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessId);
  // abre o processo
  hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);

  // exibe o handle da janela
  cout << "Handle: " << hWnd << endl;
  
  // exibe o ID do processo
  cout << "Id do processo: " << dwProcessId << endl;
  
  // exibe o título da janela
  cout << "Titulo da janela: " << temp << endl;
  
  // obtém o nome do executável ou DLL
  if(GetModuleFileNameEx(hProcess, hInstance, temp, sizeof(temp)))
    cout << "Executavel: " << temp << endl;
  else
    cout << "Nao foi possivel obter a informacao\n";

  cout << "\n" << endl;

  CloseHandle(hProcess);
  return TRUE;
}

int main(int argc, char *argv[]){
  // vamos listar todas as janelas visíveis
  EnumWindows(EnumWindowsProc, 0);
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Note que alguns programadores C/C++ fornecem o valor NULL como segundo argumento para uma chamada à EnumWindows(). No Dev-C++ 4.9, teremos uma mensagem de advertência se fizermos isso. Veja:

[Warning] passing NULL used for non-pointer converting 2 of 
'BOOL EnumWindows(BOOL (*)(HWND__*, LPARAM), LPARAM)' 
 
Veja mais Dicas & Truques na sub-categoria: Formulários e Janelas
Veja mais Dicas & Truques de C++
Veja mais Dicas & Truques de outras linguagens
C# (CSharp) - Usando herança em C#
 
 
Visão Tributária - Curso de Nota Fiscal Eletrônica em Goiânia - GO
Referências
Tipos de dados da linguagem Java
Palavras-chave e palavras reservadas da linguagem Java
Tipos de dados da linguagem PHP
 
Dicas e truques de Java
Dicas e truques de C++
Dicas e truques de Delphi
http://www.arquivodecodigos.net
2000 - 2010 - Todos os direitos reservados a Osmar J. Silva
Todo o conteúdo deste site, quando não devidamente observado, pertence a seus idealizadores e não
poderá ser usado para outras finalidades senão estudo e aprimoramento de técnicas de programação.
Certifique-se de ler as notas legais antes de proceder com o acesso e leitura do
conteúdo disponibilizado nestas páginas.

Fale Conosco: (62) 3261-7018 / (62) 8185-0734
E-Mail: suporte@recomende.com
MSN: osmar@recomende.com (só para negócios, por favor)

Desenvolvedor Responsável: Osmar J. Silva