elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 01:10  


Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  obtener el hwnd de un programa sin form
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: obtener el hwnd de un programa sin form  (Leído 1,472 veces)
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
obtener el hwnd de un programa sin form
« en: 27 Agosto 2011, 06:34 »

buenas pues esa duda tengo :P como puedo obtener el hwnd de un programa de VB sin form? estoy codeando un programa sin form ( modulo como main el principal ) y entonces llege a esa parte que necesito el hwnd :P normalmente se hace me.hwnd ( me = form ) pero ahora veo que el modulo no tiene hwnd al menos tiene esa propiedad :P como puedo hacer? gracias :)


En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: obtener el hwnd de un programa sin form
« Respuesta #1 en: 27 Agosto 2011, 07:04 »

.
Ponle entonces &H0 o 0, el hwnd es propio de ventanas y solo es asosiativos normalmente...

Dulces Lunas!¡.


En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #2 en: 27 Agosto 2011, 07:17 »

gracias BlackZeroX :) eso funciona con hooks? la verdad por el momento lo quiero para la api Settimer para el primer parametro que me pide :P y luego creo que lo usare para aplicarlo a hooks...

PD: una duda  :huh: para eliminarlo con killtimer? :P
ya que si aplico 0 en killtimer entonces escribo 0 ???  :huh:
« Última modificación: 27 Agosto 2011, 07:25 por Raul100 » En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: obtener el hwnd de un programa sin form
« Respuesta #3 en: 27 Agosto 2011, 07:30 »

.
La MSDN No muerde y si no sabes ingles hay tienes el traductor de google.

http://msdn.microsoft.com/en-us/library/ms644906%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms644903%28v=vs.85%29.aspx

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #4 en: 27 Agosto 2011, 07:48 »

 :xD si lo lei tio por eso me entro la curiosidad ya que al escribirle 0 comprendi que el argumento idevent se ignora :P y por eso tenia duda de como si no lo ignorara el parametro lo usara para darle un numero para identificarlo :P pero lo ignora :P y comprobe y la funcion killtimer me devuelve 0 eso quiere decir que la funcion falla :P y no libera el timer :P
En línea
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #5 en: 27 Agosto 2011, 08:10 »

hice este ejemplo y comprobe que no funciona :P noce en que fallo :P

modulo bas
Código
Option Explicit
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
 
Dim A As Long
Dim B As Boolean
 
Sub main()
A = SetTimer(0, 0, 30000, AddressOf TimerProc)
Debug.Print A
Do While Not B
DoEvents
Loop
End Sub
 
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Debug.Print "+1"
Debug.Print A
Debug.Print KillTimer(A, 0)
B = True
End Sub


el resultado del debug.print:


Código:
26430
+1
26430
0       <--------- no lo libera :P (valor devuelto de la llamada a funcion killtimer )

luego lo termine de comprobar porq cuando termina sub main y vuelvo a vb en diseño el timer aun sigue marcando y en el debug.print me escribe

Código:
+1
0
0
« Última modificación: 27 Agosto 2011, 08:14 por Raul100 » En línea
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #6 en: 27 Agosto 2011, 08:26 »

 :xD :xD :xD
lo resolvi
bueno mi error era a la hora de liberarlo :xD
el identificador q me devuelve settimer es el idevent no el hwnd del timer :)

Código:
Debug.Print KillTimer(0, A)

debug.print:

Código:
26196
+1
 26196
 1
En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: obtener el hwnd de un programa sin form
« Respuesta #7 en: 27 Agosto 2011, 22:17 »

.
Código
 
Option Explicit
 
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Function WaitMessage Lib "user32" () As Long
 
Dim iTmr            As Long
 
Sub main()
   iTmr = SetTimer(0, 0, 300, AddressOf TimerProc)
   Do While Not (iTmr = 0)
       DoEvents
       WaitMessage
   Loop
End Sub
 
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
   Debug.Print KillTimer(hwnd, iTmr)
   iTmr = 0
End Sub
 
 

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Hasseds

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #8 en: 27 Agosto 2011, 23:16 »


buenas pues esa duda tengo :P como puedo obtener el hwnd de un programa de VB sin form?


El tema ya quedó resuelto, pero si alguna vez tenés que obtener el hwnd de un Main podes usar FindWindow. (Acabo de enterarme de esto, ya que también pensaba que este tipo de hwnd era unicamente propio de ventanas).

Código:



Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
Sub Main()
  
  Dim lpClase As String
  
  If Not App.LogMode = 0 Then
    lpClase = "ThunderRT6Main" ' Exe Compilado
  Else
    lpClase = "ThunderMain" ' en el IDE
  End If
  
  MsgBox FindWindow(lpClase, App.Title)

End Sub

 






« Última modificación: 28 Agosto 2011, 00:24 por Hasseds » En línea

Sergio Desanti
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: obtener el hwnd de un programa sin form
« Respuesta #9 en: 28 Agosto 2011, 00:26 »

El tema ya quedó resuelto, pero si alguna vez tenés que obtener el hwnd de un Main podes usar FindWindow. (Acabo de enterarme de esto, ya que también pensaba que este tipo de hwnd era unicamente propio de ventanas).

En efecto solo son de ventanas, los procesos no tienen hwnd.
Por ello El PROCESO MAIN() al igual que los demas, NO tienen hwnd.


Todas las aplicaciones de Visual Basic tienen una ventana de nivel superior invisible que procesa los eventos y mensajes. En el modo de diseño, la ventana es ThunderMain, en el modo de ejecución, la ventana es ThunderRT6Main. El RT6 refleja el versión de Visual Basic que se utiliza. Las dos ventanas tienen el nombre del proyecto o el nombre del archivo ejecutable como el título de ventana. Esto es donde se establece el icono de aplicación.


Dulces Lunas!¡.
« Última modificación: 28 Agosto 2011, 00:31 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Hasseds

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #10 en: 28 Agosto 2011, 00:38 »

Ok, gracias por la aclaración BlackZeroX▓▓▒▒░░ , como dije anteriormente Acabo de enterarme de este tipo hwnd,  ( voy a investigar que utilidad puede tener)

PD:  es mas practico guardar el retorno de SetTimer para  luego utilizarlo con KillTimer pero este Por Ej con este hwnd tambien se puede , lo dicho ( voy a investigar que utilidad puede tener)

Saludos







« Última modificación: 28 Agosto 2011, 00:52 por Hasseds » En línea

Sergio Desanti
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: obtener el hwnd de un programa sin form
« Respuesta #11 en: 28 Agosto 2011, 01:47 »

PD:  es mas practico guardar el retorno de SetTimer para  luego utilizarlo con KillTimer pero este Por Ej con este hwnd tambien se puede , lo dicho ( voy a investigar que utilidad puede tener)

Es una ventana oculta que resive TODOS los mensajes del sistema operativo... para evitarnos hacer el trato de los mensajes mismos tal y como lo hariamos en C/C++...

P.D.: El hwnd en el SetTimer() y KilTtimer() son solo para relacionar el mensaje WM_TIMER con un CallBack al WinProc() de la ventana X con respecto a su hwnd... de todos modos en todos los codigos ya espuestos aqui se a guardado el uIDEvent generado por SetTimer() para posteriormente usarlo en el KillTimer()...

Cita de: MSDN_Microsoft http://msdn.microsoft.com/en-us/library/ms644906(v=vs.85).aspx

Remarks

An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.

The wParam parameter of the WM_TIMER message contains the value of the nIDEvent parameter.

The timer identifier, nIDEvent, is specific to the associated window. Another window can have its own timer which has the same identifier as a timer owned by another window. The timers are distinct.

SetTimer can reuse timer IDs in the case where hWnd is NULL.


Dulces Lunas!¡.
« Última modificación: 28 Agosto 2011, 01:52 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Hasseds

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #12 en: 28 Agosto 2011, 04:59 »


de todos modos en todos los codigos ya espuestos aqui se a guardado el uIDEvent generado por SetTimer() para posteriormente usarlo en el KillTimer()...



A eso me refería, que es mas practico como se expuso que utilizando el  Hwnd, estamos diciendo lo mismo.


es mas practico guardar el retorno de SetTimer para  luego utilizarlo con KillTimer pero esto Por Ejemplo con este hwnd tambien se puede


Código:

Valor de Retorno
Si la función tiene éxito y el parámetro hWnd es NULO, el valor de vuelta es un número entero que identifica el nuevo temporizador.se puede pasar este valor a la función de KillTimer para destruir el temporizador.




Lo que no llego a entender por qué el uIDEvent tambien se puede recuperar a travez de uElapse de TimerProc


Código:


Option Explicit

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
 
Dim A As Boolean
 
Sub Main()
  
  Call SetTimer(0, 0, 2000, AddressOf TimerProc)
  
 Do While Not A
    DoEvents
  Loop

End Sub
 
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
  Debug.Print uElapse
  Debug.Print KillTimer(0, uElapse)
  A = True
End Sub










« Última modificación: 28 Agosto 2011, 05:52 por Hasseds » En línea

Sergio Desanti
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: obtener el hwnd de un programa sin form
« Respuesta #13 en: 28 Agosto 2011, 06:58 »


Lo que no llego a entender por qué el uIDEvent tambien se puede recuperar a travez de uElapse de TimerProc


Lo que pasa es que no tiene correctamente los aprametros del callback, yo tampoco me habia dado cuenta... aqui te dejo el callback con los nombres corectamente... total solo son nombres de parametros...


http://msdn.microsoft.com/en-us/library/ms644907%28v=VS.85%29.aspx

Código
 
Option Explicit
 
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Function WaitMessage Lib "user32" () As Long
 
Public iTmr     As Long
 
Sub main()
   iTmr = SetTimer(0, 0, 300, AddressOf TimerProc)
   Do While Not (iTmr = 0)
       DoEvents
       WaitMessage
   Loop
End Sub
 
'VOID CALLBACK TimerProc(
'  __in  HWND hwnd,
'  __in  UINT uMsg,
'  __in  UINT_PTR idEvent,
'  __in  DWORD dwTime
');
Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
   ' hwnd   ----> { el pasado por parametro en SetTimer() }
   ' uMsg   ---->  {   WM_TIMER = 275 }
   ' idEvent ---->  { el retornado por SetTimer() }
   Debug.Print hwnd, uMsg, idEvent; "{" &  iTmr & "}", dwTime
   iTmr = ((Not KillTimer(hwnd, idEvent)) And &H1)
   Debug.Print hwnd, uMsg, idEvent; "{" &  iTmr & "}", dwTime
End Sub
 
 

temibles Lunas!¡.
« Última modificación: 28 Agosto 2011, 19:04 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Hasseds

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: obtener el hwnd de un programa sin form
« Respuesta #14 en: 28 Agosto 2011, 19:40 »

Cita de: BlackZeroX▓▓▒▒░░

Código
 
'VOID CALLBACK TimerProc(
'  __in  HWND hwnd,
'  __in  UINT uMsg,
'  __in  UINT_PTR idEvent,
'  __in  DWORD dwTime
');

 


Mas claro Imposible !!!

En línea

Sergio Desanti
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines