este es el enunciado

al
19 de Mayo del 2004
Hola!!!!!!(siguiendo tu sugerencia Enço) este es el enunciado, no he puesto el codigo (porque la verdad no ha cambiado en casi nada..) pero si quereis lo vuelvo a poner.(decidmelo..)

este es el enunciado que tantas veces os he explicado(ya me lo sé de memoria..)

aqui esta:

Programa 1: “Menus.vbp”

Tomando como punto de partida la filosofía del programa ETSEDI (Editor de Textos por selección direccional), realizar un programa que mediante 4 direcciones (arriba, abajo, derecha, izquierda), manipule con facilidad los menús de terceras aplicaciones bajo distintas versiones de Windows.













Figura 1: Direcciones


Tenemos un formulario (F):

- Al dar a la tecla Shift , el formulario te recoge el handle(manipulador, identificador de ventana) de la ventana activa (tiene que reconocerla siempre): Anexo 1 y Anexo 2
- F tiene que estar siempre en 1º plano: Anexo 3


------- Cuando esto funciona correctamente siempre------------------------------------

Buscar Api que te dé el menú de cualquier aplicación: Anexo 4

- Nº de elementos del menú (se mete en un label)
- Nombres de los elementos del menú (se meten en una listbox)



Figura 2: Ejemplo de menú


- Con las flechas arriba y abajo del formulario que aparece arriba (Figura 1), manejarte por los elementos de la listbox:

- Con la flecha derecha, activas el elemento seleccionado

- Con la flecha izquierda, desactivas todo, sales y pliegas el menú




Anexo 1

1.- Manejar el gancho de teclado

Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long


'Estructura y variables para manejar el gancho al teclado
Private Const WH_KEYBOARD_LL = 13
Private Const LLKHF_ALTDOWN = &H20

'Estructura de gancho de teclado
Private Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type

Public p As KBDLLHOOKSTRUCT
Public hhkLowLevelKybd As Long

' Suelta el gancho de teclado
Public Sub FIN()
If hhkLowLevelKybd <> 0 Then
UnhookWindowsHookEx hhkLowLevelKybd
Enf If
End Sub

' Lanza el gancho de teclado
Public Sub INI()
hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
End Sub



'Funcion que monitoriza las teclas pulsadas en teclado
Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
&#8216;Aqui se reciben las pulsaciones del teclado cuando el gancho se ha lanzado correctamente
End Function


&#8216;Siempre que se lanza el teclado hay que soltarlo correctamente

Códigos de Teclas en Visual Basic

Nombre Valor Descripción
VK_LBUTTON 01h Botón izquierdo del ratón
VK_RBUTTON 02h Botón derecho del ratón
VK_CANCEL 03h Usado para terminar un proceso
VK_MBUTTON 04h Botón de la mitad del ratón (3º botón del ratón)
VK_BACK 08h Tecla de retroceso
VK_TAB 09h Tecla tabulador

VK_CLEAR 0Ch
VK_RETURN 0Dh Tecla return
VK_SHIFT 10h Tecla Shift

VK_CONTROL 11h Tecla Control
VK_MENU 12h
VK_PAUSE 13h Tecla Pausa
VK_CAPITAL 14h Tecla Mayúsculas
VK_ESCAPE 1Bh Tecla Escape
VK_SPACE 20h Tecla Barra Espacio
VK_PRIOR 21h Tecla Re. &#8211; Pág.
VK_NEXT 22h Tecla Av.- Pág.
VK_END 23h Tecla Fin
VK_HOME 24h Tecla Inicio
VK_LEFT 25h Tecla Flecha Izquierda
VK_UP 26h Tecla Flecha Arriba
VK_RIGHT 27h Tecla Flecha Derecha
VK_DOWN 28h Tecla Flecha Abajo
VK_SELECT 29h

VK_INSERT 2Dh Tecla Insert
VK_DELETE 2Eh Tecla Suprimir
VK_HELP 2Fh Tecla Ayuda
Números
VK_0 30h
VK_1 31h
VK_2 32h
VK_3 33h
VK_4 34h
VK_5 35h
VK_6 36h
VK_7 37h
VK_8 38h
VK_9 39h
Letras
VK_A 41h
VK_B 42h
VK_C 43h
VK_D 44h
VK_E 45h
VK_F 46h
VK_G 47h
VK_H 48h
VK_I 49h
VK_J 4Ah
VK_K 4Bh
VK_L 4Ch
VK_M 4Dh
VK_N 4Eh
VK_O 4Fh
VK_P 50h
VK_Q 51h
VK_R 52h
VK_S 53h
VK_T 54h
VK_U 55h
VK_V 56h
VK_W 57h
VK_X 58h
VK_Y 59h
VK_Z 5Ah
Tec.Num.
VK_NUMPAD0 60h
VK_NUMPAD1 61h
VK_NUMPAD2 62h
VK_NUMPAD3 63h
VK_NUMPAD4 64h
VK_NUMPAD5 65h
VK_NUMPAD6 66h
VK_NUMPAD7 67h
VK_NUMPAD8 68h
VK_NUMPAD9 69h
VK_MULTIPLY 6Ah
VK_ADD 6Bh
VK_SEPARATER 6Ch Nunca generado por el dispositivo de teclado
VK_SUBTRACT 6Dh
VK_DECIMAL 6Eh
VK_DIVIDE 6Fh
Teclas Función
VK_F1 70h
VK_F2 71h
VK_F3 72h
VK_F4 73h
VK_F5 74h
VK_F6 75h
VK_F7 76h
VK_F8 77h
VK_F9 78h
VK_F10 79h
VK_F11 7Ah
VK_F12 7Bh
VK_F13 7Ch
VK_F14 7Dh
VK_F15 7Eh
VK_F16 7Fh
VK_F17 80h
VK_F18 81h
VK_F19 82h
VK_F20 83h
VK_F21 84h
VK_F22 85h
VK_F23 86h
VK_F24 87h

VK_NUMLOCK 090h Tecla Bloq. Mayús. En todos los teclados
VK_OEM_SCROLL 091h SCROLL LOCK on all keyboards.

VK_OEM_1 0BAh Punctuation.
VK_OEM_PLUS 0BBh Punctuation.
VK_OEM_COMMA 0BCh Punctuation.
VK_OEM_MINUS 0BDh Punctuation.
VK_OEM_PERIOD 0BEh Punctuation.
VK_OEM_2 0BFh Punctuation.
VK_OEM_3 0C0h Punctuation.
VK_OEM_4 0DBh Punctuation.
VK_OEM_5 0DCh Punctuation.
VK_OEM_6 0DDh Punctuation.
VK_OEM_7 0DEh Punctuation.
VK_OEM_8 0DFh Punctuation.


&#8216;Hay un ejemplo de código sobre el gancho de teclado
Anexo 2

1.- Para recoger el handle de la ventana activa:

GetForegroundWindow
Devuelve el handle(manipulador) de la ventana que está en primer plano(con la qué el usuario está actualmente trabajando)
http://www.mentalis.org/apilist/GetForegroundWindow.shtml

El sistema asigna una ligera mayor prioridad al hilo que crea la ventana que está en primer plano, que a los demás.

Private Declare Function GetForegroundWindow Lib "user32" () As Long


2.- Para recoger el handle de la ventana que tiene el foco del teclado:

GetFocus
Devuelve el handle(manipulador) de la ventana que tiene el foco del teclado, si la ventana está asociada con la cola de mensajes del hilo de la llamada.
http://www.mentalis.org/apilist/GetFocus.shtml


Anexo 3

1.- Poner un formulario en primer plano

Public Const HWND_TOPMOST = -1
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const VK_SHIFT = &H10

Public 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

&#8216;Llamar a esta función pasándole como parámetro el formulario que quieres que esté siempre en primer plano.
Public Sub AlwaysOnTop(frm As Form)
SetWindowPos frm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub































Anexo 4

¿QUÉ ES UNA API?

API son las siglas en inglés de &#8220;Application Programming Interface&#8221; y básicamente designan a un conjunto de funciones y procedimientos que los programadores de un sistema operativo pueden utilizar en sus propios programas. En las API se cuenta con funciones para emplear en los programas elementos del interfaz y otras prestaciones del sistema operativo. De este modo se logran varios objetivos. Por un lado, el programador se ahora un montón de trabajo al no tener que encargarse de desarrollar esas funciones. Por otro lado, y más importante de cara al usuario, se consigue que los programas funcionen de una manera normalizado, proporcionando un aspecto similar, con comportamientos parecidos. Gracias a esto, aprovechas lo que aprendes al manejar un programa para utilizar otros.
Direcciones en la Web
http://usuarios.lycos.es/pgsa/API.htm
http://www.geocities.com/albert_m_98/AAPIS.htm