1- Para você detectar um programa que está executando ou não é "fácil" basta usar a API FindWindow. tipo FindWindow(vbNullString, "Form1") isto retornaria um handle do windows se existisse um programa com o caption "Form1". 2 e 3 - A única forma que conheço(deve haver muitas outras) de pegar informações sobre programas rodando em memória é atraves das APIs de "Tool Help Functions" e nunca tentei cruzar as informações vindas da FindWindow com as informações destas APIs. para usar estas APIs primeiro você tem que chamar CreateToolhelp32Snapshot para criar um "snapshot" do sistema nese momento, com o retorno desta função você executaria outra API Process32First para ir ao primerio processo rodando em memória. depois navegaria pelos restantes usando Process32Next. estas funções já retornam um tipo de dados PROCESSENTRY32 que tem diversas informações sobre o programa como nome do executável, tamanho(talvez até do da memória gasta..) algo como o que segue: Const TH32CS_SNAPHEAPLIST = &H1 Const TH32CS_SNAPPROCESS = &H2 Const TH32CS_SNAPTHREAD = &H4 Const TH32CS_SNAPMODULE = &H8 Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE) Const MAX_PATH As Integer = 260 Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long 'aqui seria uma procedimento '--------------------------------------- Dim i As Integer Dim Handle As Long Dim uProcess As PROCESSENTRY32 Handle = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&) uProcess.dwSize = Len(uProcess) ReDim ProcessId(Len(uProcess)) ReDim ProcessEx(Len(uProcess)) ret = Process32First(Handle, uProcess) i = 0 Do While ret Form1.lstprocess.AddItem uProcess.szExeFile & " - " & uProcess.th32ModuleID ProcessEx(i) = uProcess.szExeFile ProcessId(i) = uProcess.th32ProcessID ret = Process32Next(Handle, uProcess) i = i + 1 Loop Form1.Label3.Caption = "Processos Total: " & i - 1 CloseHandle Handle '------------------------------------------------ '------------------------------------------------ mais ou menos por ai.. existe também outras APIs que você pode pesquisar como OpenProcess, GetProcessMemoryInfo (que verifica memória usada por um processo), GetModuleFileNameEx. enfim.. tem muita coisa que você pode pesquisar. espero ter ajudado.