PDA

Visualizza la versione completa : [C] Controllare se in esecuzione un programma


fasterrr
07-03-2011, 17:49
Mi spiego...ho due programmi (primo.exe e secondo.exe), e sul secondo programma devo svolgere delle azioni solo se primo.exe aperto.
Intendo:
if(primo.exe apero)
fai questo

Cosa va dentro l'if? In rete non ho trovato niente...
Tnx :zizi:

lolide
07-03-2011, 19:35
Non una cosa SO indipendente, quindi non portabile.
Leggi qui (http://www.eggheadcafe.com/software/aspnet/32531818/find-the-running-process-using-win32-api.aspx) per il metodo usando le win32 API, su windows.

fasterrr
08-03-2011, 16:20
Grazie per la risposta...ma come faccio ad usare le API?
il codice

#include<windows.h>
#include<stdio.h>
#include<tlhelp32.h> //trovata su internet, perch dava errore pure su PROCESSENTRY32 pe32;

void print_system_processes_list(){

PROCESSENTRY32 pe32;
ZeroMemory(&pe32,sizeof(PROCESSENTRY32));
pe32.dwSize = sizeof(PROCESSENTRY32);

int nProcessNameLength = 0;

char lpszProcessNameBuffer[MAX_PATH];
ZeroMemory(lpszProcessNameBuffer,sizeof(char)*MAX_ PATH);

char lpszComputerNameBuffer[MAX_PATH];
ZeroMemory(lpszComputerNameBuffer,sizeof(char)*MAX _PATH);
DWORD dwCNB = sizeof(char)*MAX_PATH;

char lpszUserNameBuffer[MAX_PATH];
ZeroMemory(lpszUserNameBuffer,sizeof(char)*MAX_PAT H);
DWORD dwUNB = sizeof(char)*MAX_PATH;

GetUserName(lpszUserNameBuffer,&dwUNB);
GetComputerName(lpszComputerNameBuffer,&dwCNB);

printf("\n\nRunning processes on system: %s\n",lpszComputerNameBuffer);
printf("\nCurrent user context: %s\n",lpszUserNameBuffer);

get_longest_process_name_length(&nProcessNameLength);
nProcessNameLength = nProcessNameLength + 3;


printf("\n");

HANDLE hProcSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

if(hProcSnapShot == NULL){
DWORD nErr = GetLastError();

printf("Process enumeration failed. Reason: %d\n",nErr);
print_last_error_message(nErr);

}

if(Process32First(hProcSnapShot,&pe32) == TRUE)
{
trim_process_name(pe32.szExeFile,lpszProcessNameBu ffer,pe32.th32ProcessID);
strip_extension_from_executable(pe32.szExeFile, lpszProcessNameBuffer);
printf("%s;%d;%d;%d\n",lpszProcessNameBuffer,pe32.th32ProcessID,pe32.th3 2ParentProcessID,pe32.pcPriClassBase);

while(Process32Next(hProcSnapShot,&pe32) == TRUE)
{
trim_process_name(pe32.szExeFile,lpszProcessNameBu ffer,pe32.th32ProcessID);
strip_extension_from_executable(pe32.szExeFile, lpszProcessNameBuffer);
printf("%s;%d;%d;%d;%d\n",lpszProcessNameBuffer,pe32.th32ProcessID,pe32.th3 2ParentProcessID,pe32.pcPriClassBase,pe32.cntThrea ds);

}
}

CloseHandle(hProcSnapShot);

}

int main(void)
{
print_system_processes_list();
}

e gli errori sono`get_longest_process_name_length' was not declared in this scope
`print_last_error_message' was not declared in this scope
`trim_process_name' was not declared in this scope
`strip_extension_from_executable' was not declared in this scope
Sto usando g++ (su dev-c++)
Cosa devo includere? Scusate se forse una domanda banale :confused:

deleted_29
08-03-2011, 20:08
Se il programma ha una finestra facile.
se la finestra poi ha il titolo fisso banale.

fasterrr
09-03-2011, 13:57
Si la finestra del programma di cui devo controllare se in esecuzione ha un titolo (una parte del titolo fissa).
Puoi spiegare come si fa a controllare se in esecuzione?
Grazie :zizi:

deleted_29
10-03-2011, 10:37
se ha un titolo fisso ti basta usare FindWindow per trovarne l'handle.
se torna zero=> non c'

se il titolo NON fisso (ad esempio perch c' dentro il nome del file aperto), devi ciclare su tutte le finestre,
partendo con una getwindow dell'handle della tua applicazione
corrente, con hwnd_first, poi ne prendi il titolo
(getwindowtext), e lo confronti come sottostringa con quello che ti interessa
(esempio: se con notepad apri il file pippo.txt la title diventa "pippo - Blocco note". Se cercassi - come nel primo esempio- "Blocco note" falliresti)

Loading