elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Se puede sacar nombre de proceso con el HWND de su ventana?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Se puede sacar nombre de proceso con el HWND de su ventana?  (Leído 4,411 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
¿Se puede sacar nombre de proceso con el HWND de su ventana?
« en: 13 Agosto 2015, 01:20 am »

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


« Última modificación: 13 Agosto 2015, 01:35 am por Kaxperday » En línea

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
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #1 en: 13 Agosto 2015, 08:33 am »

GetWindowThreadProcessId. Despues solo tenes que enumerar los procesos en ejecucion en busqueda del PID.


En línea

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


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #2 en: 13 Agosto 2015, 12:22 pm »

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
  1. While(true)
  2. {
  3. Sleep(100);
  4. ventana = GetForegroundWindow();
  5. pid = GetWindowThreadProcessId(ventana, NULL);
  6. PROCESSENTRY32 entry;
  7. entry.dwSize = sizeof(PROCESSENTRY32);
  8. HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
  9. if (Process32First(snapshot, &entry))
  10. while (Process32Next(snapshot, &entry))
  11. {
  12. char *auxiliar = (char*)malloc(sizeof(entry.szExeFile));
  13. wcstombs_s(NULL, auxiliar, sizeof(entry.szExeFile), entry.szExeFile, 100);
  14. cout << "pid:" << entry.th32ProcessID << " " << auxiliar << endl;
  15. if (pid == entry.th32ModuleID)
  16. {
  17. //ENCONTRADO!!
  18. }
  19. }
  20. }

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.
« Última modificación: 13 Agosto 2015, 12:38 pm por Kaxperday » En línea

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
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #3 en: 13 Agosto 2015, 12:42 pm »

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.


En línea

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


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #4 en: 13 Agosto 2015, 12:44 pm »

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

Edito:

Citar
Nueva 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
  1. LPDWORD caca = NULL;
  2. pid = GetWindowThreadProcessId(ventana, caca);
  3. 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.
« Última modificación: 13 Agosto 2015, 12:48 pm por Kaxperday » En línea

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
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #5 en: 13 Agosto 2015, 12:49 pm »

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

Código
  1. DWORD pid = NULL;
  2. GetWindowThreadProcessId(ventana, &pid);
En línea

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


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #6 en: 13 Agosto 2015, 12:53 pm »

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.
En línea

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
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #7 en: 13 Agosto 2015, 12:55 pm »

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.
En línea

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


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #8 en: 13 Agosto 2015, 12:58 pm »

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
  1. While(true){
  2. Sleep(100);
  3. DWORD pid = NULL;
  4. GetWindowThreadProcessId(ventana, &pid);
  5. PROCESSENTRY32 entry;
  6. entry.dwSize = sizeof(PROCESSENTRY32);
  7. HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
  8. if (Process32First(snapshot, &entry))
  9. while (Process32Next(snapshot, &entry))
  10. {
  11. cout << pid << " " << entry.th32ProcessID << endl;
  12. if (pid == entry.th32ProcessID)
  13. {
  14. printf("YAAAA\a\a");
  15. char *auxiliar = (char*)malloc(sizeof(entry.szExeFile));
  16. wcstombs_s(NULL, auxiliar, sizeof(entry.szExeFile), entry.szExeFile, 100);
  17. strcat(total, auxiliar);
  18. break;
  19. }
  20. }}

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.
« Última modificación: 13 Agosto 2015, 13:23 pm por Kaxperday » En línea

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
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Se puede sacar nombre de proceso con el HWND de su ventana?
« Respuesta #9 en: 13 Agosto 2015, 13:27 pm »

De nadas  ::)
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines