Autor
|
Tema: ¿Se puede sacar nombre de proceso con el HWND de su ventana? (Leído 4,337 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
Mensajes: 702
The man in the Middle
|
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: 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.
|
|
« Ú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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
Mensajes: 702
The man in the Middle
|
He probado a ponerlo con el puntero de segundo argumento pero me devolvía NULL, probaré de nuevo y subiré. Edito: 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.. 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.
|
|
« Ú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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Estas haciendo lo mismo de nuevo ... le estas pasando NULL, la funcion necesita un puntero a DWORD. DWORD pid = NULL; 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
Mensajes: 702
The man in the Middle
|
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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
Mensajes: 702
The man in the Middle
|
Ammm vale, pensaba que sería lo mismo , 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. 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 no entry.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
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
si una ventana esta abierta devolver el hwnd
« 1 2 »
Programación Visual Basic
|
rubeng
|
16
|
5,563
|
15 Septiembre 2007, 00:38 am
por rubeng
|
|
|
obtener el nombre de la ventana de un proceso
Programación Visual Basic
|
70N1
|
3
|
2,767
|
5 Marzo 2009, 17:14 pm
por 70N1
|
|
|
Como puedo saver si un nombre de proceso o un handled es el foco,ventana activa
.NET (C#, VB.NET, ASP)
|
70N1
|
2
|
3,649
|
14 Marzo 2012, 12:37 pm
por rosado78
|
|
|
[Ruby] Obtener el nombre de un proceso mediante el HWND?
Scripting
|
Eleкtro
|
0
|
2,496
|
7 Marzo 2012, 01:58 am
por Eleкtro
|
|
|
Urgente Ayuda - saber el nombre, pid, hwnd de un exe en java
Java
|
Schetz
|
0
|
1,896
|
23 Marzo 2012, 04:19 am
por Schetz
|
|