Mikas Posted September 11, 2006 at 08:47 AM Report Share #49600 Posted September 11, 2006 at 08:47 AM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now