[ADD] Elenco processi in corso

Discussioni sui sistemi operativi, programmi e tools.
Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

[ADD] Elenco processi in corso

Messaggioda maz85 » 23/01/2010, 21:58

Questo programmino richiamabile tramite la solita funzione per eseguire programmi su GM execute_program(...) serve per elencare in un file tutti i processi correnti.
In pratica quando lo richiamate crea un file chiamato "plist" in cui vengono elencati i nomi dei processi in corso.
Cosa potete farne?
- potete elencare i processi in corso leggendo questo file tramite GM;
- potete richiamare ogni tot il programma per aggiornare questo file;
- potete usare le funzioni stringa di GM per cercare nel file se un processo è attivo;
- potete controllare se esiste una sola istanza del vostro gioco;
- usate la fantasia;

Per esempio Game Maker acceso comparirà in lista come "Game_Maker"


Download v1:

:cursor: http://gmitalia.altervista.org/altri_fi ... lister.zip
Download v2:
:cursor: http://gmitalia.altervista.org/altri_fi ... ister2.zip (cosa cambia? Leggere giù)

Essendo in .exe possono usarlo utenti sia Pro che Lite!

Miglioramenti:
certo, si può fare che viene passato un nome e il programma lo cerca tra i processi in corso però così almeno si ha subito la lista nuda e cruda dei programmi in esecuzione e si può usare come si vuole senza limiti, quindi non so se fare questo miglioramento serva a qualcosa.

Miglioramenti versione 2:
con la versione 2 si possono killare i processi sia per nome sia per ID.
Per esempio killiamo un notepad qualsiasi su GM:

Codice: Seleziona tutto

execute_program("process_lister.exe notepad")

oppure leggendo la nostra lista precedentemente ottenuta richiamando il programma senza argomenti vogliamo killare il processo con id 12345

Codice: Seleziona tutto

execute_program("process_lister.exe 12345")


Il programma si occuperà di vedere se esiste o meno quel nome o quell'id processo in esecuzione.

Se vi da errore di inizializzazione è perchè non avete nessun framework.Net installato (strano perchè di solito viene distribuito in un sacco di programmi).
http://www.microsoft.com/downloads/deta ... laylang=it
(questo è il 3, esistono anche versioni superiori, si consiglia il 3.5)

PS: se avete Vista provatelo per favore, mi risparmiate l'accensione del portatile! :mrgreen:

Avatar utente
nightwish88
GMI Advanced
Messaggi: 1719
Iscritto il: 18/01/2009, 13:41
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda nightwish88 » 24/01/2010, 12:44

l'apice del gm e le sue infinite potenzialità: il tool perfetto per creare altri tool e soppiantare quel rompiballe del task manager XD

non male come programmino... utile ad esempio per controllare se hai qualche virus XD
Immagine

Web Site: AFGames

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda maz85 » 03/02/2010, 19:17

.. o per vedere se si hanno più istanze di un gioco aperte... insomma ditemi voi a cosa altro può servire. :)

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 03/02/2010, 20:14

per creare un buon virus: due applicazioni, quando una vede che l'altra non è aperta la apre automaticamente :D non male neh?
Passiamo a questioni serie, Process.GetAllProcesses o similari?
Io farei un exe che supporti più funzioni, come trova per handle,nome, kill...
eppure mi sembra tutto giusto...

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda maz85 » 12/02/2010, 13:43

Si, ma siccome è un exe e non una dll dovrei usare come le altre volte gli argomenti (ciao.exe 10 doit hey hey 1.5) quindi secondo me risulterebbe scomodo fare un trova per handle e per nome quando si ha la lista.
La nuova versione che non ho pubblicato qui esporta la lista con idprocesso:nomeprocesso; quindi è utilizzabile semplicemente da GM.
La funzione kill non sarebbe male (dovrò usare gli argomenti): passando un id o un nome verifica se esiste e killa il processo.
Appena ho un secondo faccio la modifica e l'uploado, magari creo 2/3 script per usare bene la lista fornita su GM.
Si, ho usato la classe Process.


Nuova versione uploadata, guardare primo post.

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda guidox » 15/08/2011, 11:59

Non credo sia possibile ma lo chiedo comunque...
Ho 2 notepad aperti, voglio chiudere solo quello che sta aprendo file.txt, è possibile?
Ho notato che nel task manager sul nome dell' applicazione c'è scritto file.txt, ma il processo è solo notepad...
Immagine

Immagine

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 15/08/2011, 22:04

non puoi se ti limiti a vederlo come processo. Devi entrare in entrambi i processi e capire quale file sta leggendo.
Potresti essere fortunato perchè se ricordo bene il notepad ha nel titolo della sua finestra il nome del file testuale che sta modificando.
Ci vuole un po di C++.
edit: ti ho fatto un esempio di console application che legge i titoli di tutte le finestre attive:

Codice: Seleziona tutto

#include <Windows.h>
#include <iostream>
using namespace std;

BOOL MyFunc(HWND, LPARAM);

int main()
{
   EnumDesktopWindows(NULL,(WNDENUMPROC)MyFunc,NULL);
   system("PAUSE");
   return(0);
}

char buffer[200];
BOOL MyFunc(HWND hwnd, LPARAM lParam)
{
   GetWindowText(hwnd,buffer,200);
   if(strlen(buffer) > 0)    std::cout << "window title found: " << buffer << std::endl;
   return(TRUE);
}
eppure mi sembra tutto giusto...

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda guidox » 16/08/2011, 11:21

Super_Slascio ha scritto:non puoi se ti limiti a vederlo come processo. Devi entrare in entrambi i processi e capire quale file sta leggendo.
Potresti essere fortunato perchè se ricordo bene il notepad ha nel titolo della sua finestra il nome del file testuale che sta modificando.
Ci vuole un po di C++.
edit: ti ho fatto un esempio di console application che legge i titoli di tutte le finestre attive:

Codice: Seleziona tutto

#include <Windows.h>
#include <iostream>
using namespace std;

BOOL MyFunc(HWND, LPARAM);

int main()
{
   EnumDesktopWindows(NULL,(WNDENUMPROC)MyFunc,NULL);
   system("PAUSE");
   return(0);
}

char buffer[200];
BOOL MyFunc(HWND hwnd, LPARAM lParam)
{
   GetWindowText(hwnd,buffer,200);
   if(strlen(buffer) > 0)    std::cout << "window title found: " << buffer << std::endl;
   return(TRUE);
}

Se sapessi un po' di c++...
Grazie comunque Slascio, se ti va di farmi un programma te ne sarei grato, è una cosa che volevo fare da tanto...
Naturalmente se il progetto per cui mi serve dovesse andare in porto sarai creditato...
Immagine

Immagine

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 16/08/2011, 22:07

Ok ti ho fatto una piccola DLL.
funzioni:
    DLLInit() - da richiamare all'inizio del gioco
    DLLFindProcesses() - Crea/aggiorna una lista dei processi attivi. Ritorna il numero dei processi trovati. L'argomento 'proc' delle altre funzioni è un numero da 0 al valore di ritorno di DLLFindProcesses()-1, e serve per indicare quale processo usare (come negli array 0 è il primo e aumentando di 1 l'indice accedi a quello successivo)
    DLLGetProcessID(proc) - Restituisce il process-ID (un numero) di un processo. Si tratta di una funzione piuttosto inutile visto che l'ID di cui si parla è utile con le funzioni di windows, non di gm.
    DLLGetProcessName(proc) - Restituisce il nome (string) del processo. In realtà è il nome del file exe che lo ha originato.
    DLLFindProcessWindows(proc) - Crea/aggiorna una lista delle finestre attive create dal processo. Ritorna il numero di finestre trovate. L'argomento 'win' segue la stessa logica di 'proc'.
    DLLGetProcessWindowName(proc,win) - Ritorna il titolo della finestra selezionata.
    DLLGetProcessWindowHandle(proc,win) - Ritorna l'handle della finestra selezionata.
    DLLCloseProcessWindow(proc,win) - chiude la finestra selezionata.

[spoiler]A chi interessasse, qui c'è il codice sorgente in C++:
proc_dll.h

Codice: Seleziona tutto

#define export extern "C" __declspec( dllexport )

export double FindProcesses();
export double GetProcessID(double n);
export char* GetProcessName(double n);
export double FindProcessWindows(double n);
export char* FindProcessWindowName(double n, double w);
export double FindProcessWindowHandle(double n, double w);
export double CloseProcessWindow(double n, double w);

proc_dll.cpp

Codice: Seleziona tutto

#include<Windows.h>
#include<Psapi.h>
#include"proc_dll.h"
#pragma comment (lib, "psapi.lib")

DWORD process_ids[100];
unsigned int num_processes_found;
char buffer[200];
char* res2 = "<no-name>";
bool created = false;

struct PROCESS
{
   DWORD id;
   char* name;
   HWND* windows;
   int windows_count;
   bool windows_previously_found;
   PROCESS()
   {
      windows_previously_found = false;
   }
   ~PROCESS()
   {
      delete[] this->name;
      if(windows_previously_found)
         delete[] this->windows;
   }
};
PROCESS* processes;

double FindProcesses()
{
   if(created)
      delete[] processes;
   DWORD bytes_found;
   EnumProcesses(process_ids,100*sizeof(DWORD),&bytes_found);
   num_processes_found = bytes_found/sizeof(DWORD);
   HANDLE p;
   DWORD res;
   //trovo il numero di processi validi
   int valid_processes_num = 0;
   for(int i=0;i<num_processes_found;i++)
   {
      p = OpenProcess(PROCESS_ALL_ACCESS,FALSE,process_ids[i]);
      res = GetModuleBaseName(p,NULL,buffer,200);
      CloseHandle(p);
      if(res == 0) continue;
      else valid_processes_num++;
   }
   processes = new PROCESS[valid_processes_num];
   int iid = 0;
   for(int i=0;i<num_processes_found;i++)
   {
      p = OpenProcess(PROCESS_ALL_ACCESS,FALSE,process_ids[i]);
      res = GetModuleBaseName(p,NULL,buffer,200);
      CloseHandle(p);
      if(res != 0)
      {
         processes[iid].id = process_ids[i];
         processes[iid].name = new char[strlen(buffer)+1];
         memcpy(processes[iid].name,buffer,strlen(buffer)+1);
         iid++;
      }
   }
   created = true;
   return((double)valid_processes_num);
}
double GetProcessID(double n)
{
   return(processes[(int)n].id);
}
char* GetProcessName(double n)
{
   return(processes[(int)n].name);
}
BOOL CALLBACK MyCallbackFunc1(HWND,LPARAM);
BOOL CALLBACK MyCallbackFunc2(HWND,LPARAM);
int current_win_i;
double FindProcessWindows(double n)
{
   PROCESS* proc = &processes[(int)n];
   if(proc->windows_previously_found)
      delete[] proc->windows;
   proc->windows_count = 0;
   EnumDesktopWindows(NULL,(WNDENUMPROC)MyCallbackFunc1,(LPARAM)proc);
   proc->windows = new HWND[proc->windows_count];
   current_win_i = 0;
   EnumDesktopWindows(NULL,(WNDENUMPROC)MyCallbackFunc2,(LPARAM)proc);
   return(proc->windows_count);
}
BOOL CALLBACK MyCallbackFunc1(HWND hwnd, LPARAM lParam)
{
   DWORD id;
   GetWindowThreadProcessId(hwnd,&id);
   PROCESS* proc = (PROCESS*)lParam;
   if(id == proc->id)
   {
      proc->windows_count++;
   }
   return(TRUE);
}
BOOL CALLBACK MyCallbackFunc2(HWND hwnd, LPARAM lParam)
{
   DWORD id;
   GetWindowThreadProcessId(hwnd,&id);
   PROCESS* proc = (PROCESS*)lParam;
   if(id == proc->id)
   {
      proc->windows[current_win_i] = hwnd;
      current_win_i++;
   }
   return(TRUE);
}
char* FindProcessWindowName(double n, double w)
{
   GetWindowText(processes[(int)n].windows[(int)w],buffer,200);
   return(buffer);
}
double FindProcessWindowHandle(double n, double w)
{
   return((double)((int)processes[(int)n].windows[(int)w]));
}

double CloseProcessWindow(double n, double w)
{
   CloseWindow(processes[(int)n].windows[(int)w]);
   return(1.0);
}
[/spoiler]
Allegati

[L’estensione zip è stata disattivata e non può essere visualizzata.]

Ultima modifica di Sla il 17/08/2011, 8:29, modificato 1 volta in totale.
eppure mi sembra tutto giusto...

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda guidox » 16/08/2011, 22:14

Non mi va. :protect:

Mi fa un bel

Codice: Seleziona tutto

ERROR in
action number 1
of Create Event
for object object0:

Error defining an external function.

La dll è presente nella cartella... cosa sbaglio? o.O

PS: Uso gm8...
Immagine

Immagine

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 16/08/2011, 22:18

anche io uso gm8 e non mi da errori.. ho provato a riscaricare l'allegato, scompattarlo in una cartella, creare un gmk, caricare gli script, richiamare DLLInit().
Nulla.. hai sbagliato qualcosa xD
eppure mi sembra tutto giusto...

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda guidox » 16/08/2011, 22:20

Super_Slascio ha scritto:anche io uso gm8 e non mi da errori.. ho provato a riscaricare l'allegato, scompattarlo in una cartella, creare un gmk, caricare gli script, richiamare DLLInit().
Nulla.. hai sbagliato qualcosa xD

Ho fatto le stesse cose. :lol:
Mi manca qualche programma installato nel pc forse. :)
E forse è quello a cui accennava Maz prima..?
Immagine

Immagine

Avatar utente
Jak
Admin
Messaggi: 12356
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Jak » 16/08/2011, 22:22

Gli hai dato questa vero?
http://www.google.it/#pq=msvcr100d&hl=i ... 24&bih=677
:roll:
visual c++ è bello ma purtroppo necessita di quella dll(magari non va istes ma senza non ti va sicuro)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 16/08/2011, 22:35

Sì, forse è quello.. magari la compilo in dev perchè non mi piace proprio dover fornire una seconda dll per le mie gm-dlls.
eppure mi sembra tutto giusto...

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 16/08/2011, 22:44

guidox ha scritto:
Super_Slascio ha scritto:anche io uso gm8 e non mi da errori.. ho provato a riscaricare l'allegato, scompattarlo in una cartella, creare un gmk, caricare gli script, richiamare DLLInit().
Nulla.. hai sbagliato qualcosa xD

Ho fatto le stesse cose. :lol:
Mi manca qualche programma installato nel pc forse. :)
E forse è quello a cui accennava Maz prima..?

No, il framework serve solo per quelle zozzerie di managed codes per i linguaggi .net. Il mio è linguaggio nativo che fa uso di api win32 (codice indipendente :rockrock: )
eppure mi sembra tutto giusto...

Avatar utente
Jak
Admin
Messaggi: 12356
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Jak » 16/08/2011, 22:58

Super_Slascio ha scritto:No, il framework serve solo per quelle zozzerie di managed codes per i linguaggi .net. Il mio è linguaggio nativo che fa uso di api win32 (codice indipendente :rockrock: )
:rockrock: E' sopratutto per questo che ho sempre cercato di evitare il .net (e finalmente riuscito)
W il c++ :metalgo:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 17/08/2011, 8:27

Guidox prova il nuovo allegato, questa volta ho compilato con dev-c++, dovrebbe funzionare.
Immagine XD XD XD
Allegati

[L’estensione zip è stata disattivata e non può essere visualizzata.]

eppure mi sembra tutto giusto...

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda guidox » 17/08/2011, 17:13

OK ora funziona... ma nell' esempio che hai scritto ci sono funzioni nuove(o diverse) da quelle che ci sono nel file, forse mi hai rimandato il vecchio?
Immagine

Immagine

Avatar utente
Sla
GMI VIP
Messaggi: 3618
Iscritto il: 21/07/2008, 10:11
Specialità: Titanismo
Località: (gm) Italia
Contatta:

Re: [ADD] Elenco processi in corso

Messaggioda Sla » 17/08/2011, 19:14

Nell'esempio della immagine c'è una sola funzione in piu, DLLProcessChangeWindowTitle. Hai tutto l'occorrente per fare il resto, trovare il processo che ti interessa, leggere il titlo della finestra, chiudere la finestra che ti interessa.
eppure mi sembra tutto giusto...


Torna a “Altro”



Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite