obtener el hwnd de un programa sin form

Iniciado por x64core, 27 Agosto 2011, 06:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Hasseds

#10
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







Sergio Desanti

BlackZeroX

#11
Cita de: Hasseds en 28 Agosto 2011, 00:38 AM
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!¡.
The Dark Shadow is my passion.

Hasseds

#12
Cita de: BlackZeroX▓▓▒▒░░ en 28 Agosto 2011, 01:47 AM

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.

Cita de: Hasseds en 28 Agosto 2011, 00:38 AM

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




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





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











Sergio Desanti

BlackZeroX

#13
Cita de: Hasseds en 28 Agosto 2011, 04:59 AM

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 (Vb) [Seleccionar]


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!¡.
The Dark Shadow is my passion.

Hasseds

Cita de: BlackZeroX▓▓▒▒░░

Código (Vb) [Seleccionar]


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




Mas claro Imposible !!!

Sergio Desanti