Bueno, pués tengo la duda que si es posible "simular" un Click en determinado punto, sin que el cursor cambie de posición o que el la aplicación que recibiría el Click, no contenga siquiera el foco... Aplicaciones externas, por supuesto...
Saludos!
habeis probado con:
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dX As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
las botones:
Private Const LEFT_DOWN = &H2
Private Const LEFT_UP = &H4
Eso enviaria un click, pero no entiendo lo de "simular" :P una opcion seria SendMessage(WM_CLICK) + GetWindwFromPoint pero... solo funcionaria para ventanas comunes :P
O sea, con lo de "simular" me refería que las acciones no afecten el cursor original.
Pero mi duda va mas allá: Arrastrar objetos, poscicionar el cursor en algún punto, insisto sin afectar el cursor original... ¿Funcionaría para una aplicación externa, sin foco y hasta minimizada u oculta?
Saludos!
arrastrar objetos :P no lo se si funcionaria :P lo que probaria es ver si la api de arriba esta relaciona con un hook al mouse
asi si captura los movimientos de la propia api en el hook cuando detecte el click moverlo a un X lugar y asi simular el arrastre...
pero todo lo demas si...
Hola, no sé si entendí bien lo de arrastrar objetos... te dejo un ejemplo (sin optimizar) válido para xp (para W7 tenés q cambiar el nombre de clase "SciCalc" por la q corresponda)
Option Explicit
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Sub Command1_Click()
Shell "calc"
Dim Hndl As Long
Hndl = FindWindow("SciCalc", vbNullString)
Hndl = FindWindowEx(Hndl, 0, vbNullString, "1")
Call SetWindowPos(Hndl, vbNull, 1, 1, 35, 28, 0)
End Sub
Está perfecto carnal@s, muchas gracias, ya hice las pruebas correspondientes y todo bien.
Y ya que andamos por aquí: ¿Cómo encontrar el "nombre" o "ID" o "Qué sé yo" de un control(Textbox, botón) en una aplicación externa?, Recuerdo que yo usaba un programa que arrastraba el cursor a determinado control de culaquier aplicación y era suficiente, según esa herramienta estaba en "Visual Studio 6.0 Tools", pero no logré encontrarla... ¿Alguien sabe?
Saludos!... y repito: ¡Muchas gracias!
si no me falla la memoria es con findwindowsex, obtenes primero el handle del principal luego lo volves a llamar pasando
como parametro del anterior y asi sucesivamente, pero necesitas el nombre de las clases de los controles, digamos
buscar un textbox creo que es "edit" ,y si hay dos o mas controles del mismo que buscas tenes que pasarle
el handle principal más el handle del primer control del mismo tipo
Ya encontré dicha herramienta! :rolleyes:
Se llama "Spy++" :xD
------------------
Ahora, pa ahorrar nuevos post, he decidido, sí otra vez, consultarles:
Estoy haciendo, que mediante "SendMessage", se envie cierta convinación de teclas: "Ctrl" + "A" para
ser específico.
El punto es que no me acepta la combinación de teclas:
Call SendMessage(ret, WM_KEYDOWN, ByVal &H11, ByVal 0) 'Se presiona "Ctrl"
Call SendMessage(ret, WM_KEYDOWN, 65, ByVal 0) 'Se presiona "A"
Call SendMessage(ret, WM_KEYUP, 65, ByVal 0) 'Se sulta "A"
Call SendMessage(ret, WM_KEYUP, ByVal &H11, ByVal 0) 'Se suelta "Ctrl"
Sí me acepta presionar "A" o cualesquier otra tecla, y por ejemplo, me acepta "Ctrl" + "up" o "down" u otra, pero no
"Ctrl" y [Tecla del alfabeto]...
Si consideran qué es bronca de la aplicación... Ahi la dejamos... ;D
------------------
Saludos y gracias!
Es que yo creo que en realidad debes enviar WM_HOTKEY (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646279%28v=vs.85%29.aspx) :P
(debes usar LoWord y HiWord, y MakeDWord para usarlo correctamente :))
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!
Dale una probada a ucHotKey (http://www.leandroascierto.com.ar/foro/index.php?topic=638.0) :P en la parte de SetRules o similar
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!
: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
lHotKey = MakeDWord(VK_A, MOD_CONTROL)
Call SendMessage(hwnd, WM_HOTKEY, 0, ByVal lHotKey)
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!
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
proba usar PostMessage(), aca tenes un ejemplo que le manda ALT + F4 a la calculadora y la cierra.
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.
Hola
@seba123neo, no logro descifrar "lParam"...
CitarCall BringWindowToTop(vHWND)
Emmm, es necesario?
Saludos y gracias!
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!¡.
Cita de: raul338 en 2 Diciembre 2011, 01:25 AM
Si pero nunca supe cual iria primero y cual ultimo (ejem, importa la diferencia entre el hiWord y el loWord aca :P)
http://foro.elhacker.net/programacion_visual_basic/recopilacion_de_funciones_con_operaciones_binarias-t329680.0.html;msg1651093#msg1651093
Dulces Lunas!¡.