¿Se puede sacar nombre de proceso con el HWND de su ventana?

Iniciado por Kaxperday, 13 Agosto 2015, 01:20 AM

0 Miembros y 4 Visitantes están viendo este tema.

Kaxperday

Pues eso, ¿se puede? Iré actualizando este hilo con más datos.

Saludos.

Edito: ¡Vaya!

https://msdn.microsoft.com/en-us/library/windows/desktop/dd318087(v=vs.85).aspx
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

GetWindowThreadProcessId. Despues solo tenes que enumerar los procesos en ejecucion en busqueda del PID.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

#2
Hola, sí eso había leído ya que la función que puse dicen que no funciona para otros procesos del que corre la aplicación tuya.

Estoy probando con esto, pero me devueve pids que no corresponden a ningún ejecutable:

Código (cpp) [Seleccionar]

While(true)
{
Sleep(100);
ventana = GetForegroundWindow();
pid = GetWindowThreadProcessId(ventana, NULL);
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry))
while (Process32Next(snapshot, &entry))
{
char *auxiliar = (char*)malloc(sizeof(entry.szExeFile));
wcstombs_s(NULL, auxiliar, sizeof(entry.szExeFile), entry.szExeFile, 100);
cout << "pid:" << entry.th32ProcessID << " " << auxiliar << endl;
if (pid == entry.th32ModuleID)
{
//ENCONTRADO!!
}
}
}


Edito:
El listado de procesos es correcto, con los pids correctos correspondiendo a su aplicación, lo que falla es el pid que devuelve GetWindowThreadProcessId(ventana, NULL) ya que no corresponde a ningún proceso nunca.

Estoy obteniendo el mismo pid para cada ventana, busco en chrome y me sale que el pid que creó ventana fue 5740, me voy a visual studio también, lo sé porque estoy obteniendo el texto de la ventana y son distintos sin embargo el pid que devuelve la funcion es el mismo en todas :=

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

Estas llamando mal a la funcion, el valor de retorno es el ID del HILO no del proceso:
The return value is the identifier of the thread that created the window.

El segundo parametro es un puntero a DWORD donde pone el ID del PROCESO, no le pases NULL si lo queres obtener.

lpdwProcessId [out, optional]
   Type: LPDWORD
   A pointer to a variable that receives the process identifier.


La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

#4
He probado a ponerlo con el puntero de segundo argumento pero me devolvía NULL, probaré de nuevo y subiré.

Edito:

CitarNueva pesta±a - Google Chrome el thread que creo ventana:5740 y su pid 00000000

Lo que pasa, es que di le paso una variable..

Código (cpp) [Seleccionar]

LPDWORD caca = NULL;
pid = GetWindowThreadProcessId(ventana, caca);
cout << " el thread que creo ventana:" << pid << " y su pid " << caca <<endl;


Me sale 00000, que pid es ese.

LPDWORD es un puntero a DWORD y DWORD es un unsigned long, a ver como lo muestro ahora. Luego el pid debe de estar en un puntero a unsigned long, pero como saco su valor decimal.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

Estas haciendo lo mismo de nuevo ... le estas pasando NULL, la funcion necesita un puntero a DWORD.

Código (c++) [Seleccionar]
DWORD pid = NULL;
GetWindowThreadProcessId(ventana, &pid);
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

Claro, necesita un LPDWORD o un puntero a DWORD que es un u_long, pero ¿no hay que pasarsele como NULL y que escriba en el la dirección del PID? No entiendo, sino que tengo que pasarle exactamente, ¿como obtengo el LPDWORD que necesito?.

Saludos y gracias.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

No, el PID no es un puntero, es un valor entero, entonces no tiene sentido pasarle un doble puntero para que escriba la direccion en el, igual aunque asi lo fuera lo estarias haciendo mal ya que deberias pasar &caca y no caca que es simplemente NULL.

Ahi arriba te deje exactamente como hacerlo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

#8
Ammm vale, pensaba que sería lo mismo  :o :o, creo que ya funciona con lo que pusistes gracias, ahora subiré el código completo por si alguien lo quiere XD.

Vaya, he conseguido que me coja el pid de la aplicación en cuestión pero no hace un if.

Código completo con el if en cuestión donde no entra, aún usando casting.

Código (cpp) [Seleccionar]

While(true){
Sleep(100);
DWORD pid = NULL;
GetWindowThreadProcessId(ventana, &pid);
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry))
while (Process32Next(snapshot, &entry))
{
cout << pid << " " << entry.th32ProcessID << endl;
if (pid == entry.th32ProcessID)
{
printf("YAAAA\a\a");
char *auxiliar = (char*)malloc(sizeof(entry.szExeFile));
wcstombs_s(NULL, auxiliar, sizeof(entry.szExeFile), entry.szExeFile, 100);
strcat(total, auxiliar);
break;
}
}}


No entiendo al mostrar muestran lo mismo pero no entra en el bucle, luego al depurarlo me dice que uno vale 5740 y otro 4 WTF. Ahh no sorry que era la primera interacción.

Edito: Encontré el error era entry.th32ProcessID y noentry.th32ModuleID XD.

Ahora ya its working fine. Gracias.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón