Simular Click

Iniciado por ignorantev1.1, 30 Noviembre 2011, 05:02 AM

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

ignorantev1.1

Hola @raul338, estuve investigando la manera, pasé por WM_HOTKEY, pero no me dí tinta, es que la verdad
no sé como usarlo  :-\, ¿me ayudarías con un ejemplo, por favor?

Saludos y gracias!

raul338

Dale una probada a ucHotKey :P en la parte de SetRules o similar

ignorantev1.1

No puedo!  >:(

Citar
    Private Const WM_HOTKEY = &H312
        Private Const MOD_ALT = 1
        Private Const MOD_CONTROL = 2
        Private Const MOD_SHIFT = 4
        Private Const MOD_WIN = 8
       
    Private Type HotKey
        lKey As Integer
        hKey As Integer
    End Type

Ret es una aplicación Externa.

Citar
        Dim CtrlA As HotKey
        Dim Abrir As Integer
       
        Abrir = GlobalAddAtom("programaAbrir")
        CtrlA.lKey = vbKeyA
        CtrlA.hKey = &H11

        call RegisterHotKey(ret,Abrir, MOD_CONTROL, vbKeyA)
       
        Call SendMessage(ret, WM_HOTKEY, ByVal VarPtr(CtrlA), Abrir)
        Call UnregisterHotKey(ret, Abrir)
        Call GlobalDeleteAtom(Abrir)

Usé GetLastError y: "Invalid window; it belongs to other thread.", justo después de registrar el hotkey.

Pensé que sería así de sencillo  :-\

Saludos!

Jajajaja  :laugh:, Saludos!

raul338

:huh: no, porque usas un Tipo de estructura? cuando deben estar los 2 en un long? x'D

4 bytes (long) = 2 bytes (Integer) KeyCode + 2 bytes (Integer) Modificadores (Control / ALt / Shift)

Por eso te recomende el uso de MakeDWord

Tenes que hacer

Código (vb) [Seleccionar]

lHotKey = MakeDWord(VK_A, MOD_CONTROL)
Call SendMessage(hwnd, WM_HOTKEY, 0, ByVal lHotKey)

ignorantev1.1

Citarno, porque usas un Tipo de estructura? cuando deben estar los 2 en un long? x'D
4 bytes (long) = 2 bytes (Integer) KeyCode + 2 bytes (Integer) Modificadores (Control / ALt / Shift)

:xD, Según yo esa estructura de 2 integers, será reconocida como 1 long, compruebalo:

Citar
        CtrlL.hKey = vbKeyA '&H4C
        CtrlL.lKey = MOD_CONTROL '&H2
        Call CopyMemory(tHotK2, ByVal VarPtr(CtrlL), 8)

Ahora, de todas formas no me funciona... xD

Talvez sea por que es necesario registrar el HotKey, pero no sé como registralo en una ventana externa...

Saludos y gracias!


raul338

Cita de: ignorantev1.1 en  2 Diciembre 2011, 00:08 AM
:xD, Según yo esa estructura de 2 integers, será reconocida como 1 long, compruebalo:
Si pero nunca supe cual iria primero y cual ultimo (ejem, importa la diferencia entre el hiWord y el loWord aca :P)

Mm... el ultimo recurso, enviar WM_NOTIFY con notificaciones estilo HotKey :P

seba123neo

proba usar PostMessage(), aca tenes un ejemplo que le manda ALT + F4  a la calculadora y la cierra.

Código (vb) [Seleccionar]
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long

Private Const WM_SYSKEYUP = &H105
Private Const WM_SYSKEYDOWN = &H104

Private Const VK_F4 As Long = &H73

Private Sub Command1_Click()
    Dim vHWND As Long
    vHWND = FindWindow("CalcFrame", vbNullString)
   
    Call BringWindowToTop(vHWND)
   
    Call PostMessage(vHWND, WM_SYSKEYDOWN, VK_F4, &H3E0001 Or &H20000000)
    Call PostMessage(vHWND, WM_SYSKEYUP, VK_F4, &H3E0001 Or &H20000000)
End Sub


"CalcFrame" es el nombre de clase de la ventana de la calculadora en windows 7, en windows XP es "SciCalc".

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

ignorantev1.1

Hola @seba123neo, no logro descifrar "lParam"...

CitarCall BringWindowToTop(vHWND)

Emmm, es necesario?

Saludos y gracias!

BlackZeroX

No es nesesario usar: BringWindowToTop() ya que el mensaje aun asi llegara sin problemas, esto se debe a que se simula con MENSAJES en el callback de la ventana de manera directa, mas no se simula el click de alguna manera con el mouse fisico o similar.

Dulces Lunas!¡.
The Dark Shadow is my passion.

BlackZeroX

The Dark Shadow is my passion.