• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Mikas

Como Listar Todas as Janelas abertas e o ficheiro ao qual correspondem

1 mensagem neste tópico

O Post de hoje e baseado em algo que tive de fazer para o meu projecto de final de curso, e ja que me deu uma santa trabalheira achei que nao era ma ideia

partilha-lo convosco ja que nunca se sabe o que podem vir a necessitar.

O objectivo do seguinte codigo e listar os programas abertos (mas apenas os que apresentem janelas), bem como os ficheiros aos quais estao associados, nao necessariamente um *.exe

Para fazerem isto devem decalarar as units ShellAPI e PsAPI!!

Primeiro na seccao private, vamos declarar 2 funcoes:

private
  function IsWinNT4Plus: Boolean;
  function GetWindowFileName(const hWin: HWND): string;

Agora vamos completa-las:

function TForm1.IsWinNt4Plus: Boolean;
var
  Info: TOSVersionInfo;
begin
  FillChar(Info, SizeOf(TOSVersionInfo), 0);
  Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(Info);
  with Info do
    Result := (dwPlatformId = VER_PLATFORM_WIN32_NT) and (dwMajorVersion >= 4); 
end;

function TForm1.GetWindowFileName(const hWin: HWND): string;
var
  lpBuff: PChar;
  nCount: Integer;
  dwProcessId, dwThreadId, hInst, hProcess: Cardinal;
begin
  Result := '';
  nCount := 1024;
  GetMem(lpBuff, nCount);
  try
    if IsWinNT4Plus then
    begin
      hInst := GetWindowLong(hWin, GWL_HINSTANCE);
      dwThreadId := GetWindowThreadProcessId(hWin, dwProcessId);
      hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessId);
      if hProcess > 0 then
        try
          GetModuleFileNameEx(hProcess, hInst, lpBuff, nCount);
        finally
          CloseHandle(hProcess);
        end;
    end
    else
    begin
      GetWindowModuleFileName(hWin, lpBuff, nCount);
    end;
    Result := string(lpBuff);
  finally
    ReallocMem(lpBuff, 0);
  end;
end;

Agora vamos a funcao mais importante. Esta funcao nao deve ser declarada em nenhuma das clausulas. Deve ser apenas escrita na parte do codigo:

function Ewp(hWnd:Cardinal; lParam: Integer): longbool; stdcall;
var
  Janela, Processo: string;
begin
  Result := True;
  try
    if (IsWindowVisible(hWnd)) and (GetWindow(hWnd, GW_OWNER) = 0) then
    begin
      SetLength(Janela, Max_Path);
      SetLength(Processo, Max_Path);
      SetLength(Janela, GetWindowText(hWnd, PChar(Janela), Max_Path));
      Processo := Form1.GetWindowFileName(hWnd);
      if Janela <> '' then
      begin
        Form1.ListBox1.Items.Add(Janela);
        Form1.ListBox2.Items.Add(Processo);
        Result := True;
      end;
    end;
  except
    Exit;
  end;
end; 

Depois disto basta no sitio onde quiserem utilizar isto fazerem o seguinte:

  EnumWindows(@Ewp, 0);

E é basicamente isto. Cumprimentos...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora