Jump to content

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


Mikas

Recommended Posts

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...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.