Bloque numérico
A ver si alguien me puede ayudar. Utilizo Visual Basic 5 y quiero activar o desactivar por código el bloqueo numérico, porque no sé porque cuando cambio de campo a veces se me desactiva.
Gracias.
Gracias.
No creo que el bloque numérico pueda ser manipulado con VB. Sin embargo, puede ser manipulado via API, pero solamente en sistemas operativos basados en NT (Win9x no provee dicha funcionalidad, de acuerdo con msdn.microsoft.com).
En fin, puede utilizar GetAsyncKeyState para obtener el estado de la tecla NUMLOCK, y basándose en su valor, puede usar SendInput para simular el tecleo.
En fin, puede utilizar GetAsyncKeyState para obtener el estado de la tecla NUMLOCK, y basándose en su valor, puede usar SendInput para simular el tecleo.
Fijate esto, probé el NUMLOCK y anda, no lo probé todo, lo probé en Win 98.
Pegalo dento de un form y agregá un command:
'***************************************
Option Explicit
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
Function GetCapslock() As Boolean
' Return or set the Capslock toggle.
GetCapslock = CBool(GetKeyState(vbKeyCapital) And 1)
End Function
Function GetNumlock() As Boolean
' Return or set the Numlock toggle.
GetNumlock = CBool(GetKeyState(vbKeyNumlock) And 1)
End Function
Function GetScrollLock() As Boolean
' Return or set the ScrollLock toggle.
GetScrollLock = CBool(GetKeyState(vbKeyScrollLock) And 1)
End Function
Sub SetCapslock(Value As Boolean)
' Return or set the Capslock toggle.
Call SetKeyState(vbKeyCapital, Value)
End Sub
Sub SetNumlock(Value As Boolean)
' Return or set the Numlock toggle.
Call SetKeyState(vbKeyNumlock, Value)
End Sub
Sub SetScrollLock(Value As Boolean)
' Return or set the ScrollLock toggle.
Call SetKeyState(vbKeyScrollLock, Value)
End Sub
Private Sub SetKeyState(intKey As Integer, fTurnOn As Boolean)
' Retrieve the keyboard state, set the p
' articular
' key in which you're interested, and th
' en set
' the entire keyboard state back the way
' it
' was, with the one key altered.
Dim abytBuffer(0 To 255) As Byte
GetKeyboardState abytBuffer(0)
abytBuffer(intKey) = CByte(Abs(fTurnOn))
SetKeyboardState abytBuffer(0)
End Sub
Private Sub Command1_Click()
Static Valor As Boolean
Valor = Not Valor
SetNumlock Valor
End Sub
'***************************************
El código original está en http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=485&lngWId=1
Saludos,
Javier
Pegalo dento de un form y agregá un command:
'***************************************
Option Explicit
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
Function GetCapslock() As Boolean
' Return or set the Capslock toggle.
GetCapslock = CBool(GetKeyState(vbKeyCapital) And 1)
End Function
Function GetNumlock() As Boolean
' Return or set the Numlock toggle.
GetNumlock = CBool(GetKeyState(vbKeyNumlock) And 1)
End Function
Function GetScrollLock() As Boolean
' Return or set the ScrollLock toggle.
GetScrollLock = CBool(GetKeyState(vbKeyScrollLock) And 1)
End Function
Sub SetCapslock(Value As Boolean)
' Return or set the Capslock toggle.
Call SetKeyState(vbKeyCapital, Value)
End Sub
Sub SetNumlock(Value As Boolean)
' Return or set the Numlock toggle.
Call SetKeyState(vbKeyNumlock, Value)
End Sub
Sub SetScrollLock(Value As Boolean)
' Return or set the ScrollLock toggle.
Call SetKeyState(vbKeyScrollLock, Value)
End Sub
Private Sub SetKeyState(intKey As Integer, fTurnOn As Boolean)
' Retrieve the keyboard state, set the p
' articular
' key in which you're interested, and th
' en set
' the entire keyboard state back the way
' it
' was, with the one key altered.
Dim abytBuffer(0 To 255) As Byte
GetKeyboardState abytBuffer(0)
abytBuffer(intKey) = CByte(Abs(fTurnOn))
SetKeyboardState abytBuffer(0)
End Sub
Private Sub Command1_Click()
Static Valor As Boolean
Valor = Not Valor
SetNumlock Valor
End Sub
'***************************************
El código original está en http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=485&lngWId=1
Saludos,
Javier
Javier, el problema de utilizar Get/SetKeyboardState es que no representan los estados de las teclas en el instante en que se llaman dichas funciones.
Windows almacena 256 bytes de información por cada mensaje que manda a cada ventana. Por ejemplo, cuando se presiona el mouse en una ventana, Windows envía el mensaje WM_LBUTTONDOWN a la ventana, e internamente almacena una "impresión" de todas las teclas del teclado al momento que se presionó el botón del mouse, que es válida SOLAMENTE PARA ESE MENSAJE. En cuanto la ventana procesa el mensaje, Windows desaparece dicha impresión.
En cuanto se suelta el botón del mouse, Windows envía el mensaje WM_LBUTTONUP, y si se usara GetKeyboardState para obtener el estado de las teclas, devolvería los valores de la impresión que se tomó para este mensaje, que NADA tienen que ver con el mensaje anterior.
De ahí que sugerí el uso de GetAsyncKeyState y SendInput, porque estas funciones no trabajan con la "impresión" instantánea del teclado, sino la condición actual (al momento de llamar a las funciones) del teclado.
En otras palabras, el código que usted presenta no es el adecuado. Si ese código corriera en una máquina relativamente lenta, los resultados serían completamente inesperados.
Por cierto, puede tratar de encender el NUMLOCK en Win9x cambiando SendInput por keyb_event, ya que SendInput es solamente para sistemas operativos NT (NT/2000/XP).
Windows almacena 256 bytes de información por cada mensaje que manda a cada ventana. Por ejemplo, cuando se presiona el mouse en una ventana, Windows envía el mensaje WM_LBUTTONDOWN a la ventana, e internamente almacena una "impresión" de todas las teclas del teclado al momento que se presionó el botón del mouse, que es válida SOLAMENTE PARA ESE MENSAJE. En cuanto la ventana procesa el mensaje, Windows desaparece dicha impresión.
En cuanto se suelta el botón del mouse, Windows envía el mensaje WM_LBUTTONUP, y si se usara GetKeyboardState para obtener el estado de las teclas, devolvería los valores de la impresión que se tomó para este mensaje, que NADA tienen que ver con el mensaje anterior.
De ahí que sugerí el uso de GetAsyncKeyState y SendInput, porque estas funciones no trabajan con la "impresión" instantánea del teclado, sino la condición actual (al momento de llamar a las funciones) del teclado.
En otras palabras, el código que usted presenta no es el adecuado. Si ese código corriera en una máquina relativamente lenta, los resultados serían completamente inesperados.
Por cierto, puede tratar de encender el NUMLOCK en Win9x cambiando SendInput por keyb_event, ya que SendInput es solamente para sistemas operativos NT (NT/2000/XP).
Hola José:
Creo que el buffer es por tarea en lugar de por ventanas, alguna vez leí sobre todo eso e hice unas pruebas en aquel entonces y si me daba problemas, pero lo que quería hacer era otra cosa diferente a esta.
En este caso lo probé y vi que andaba, lo que hice fue lo sig: hice un proyecto nuevo con ese código, abrí una ventana de Notepad y cambiaba de una a la otra, y vi que cuando le sacaba el NumLock el Notepad ya no escribía los números y cuando lo ponía si.
Ahora bien, si me explicas como hago para hacerlo fallar lo pruebo, esta PC es una Pentium 233 y tengo instalado Win 98 (donde lo probé) y también NT 4 (ahí no lo he probado, pero si me dices que ahi es donde falla lo veo).
Gracias y saludos,
Javier
Creo que el buffer es por tarea en lugar de por ventanas, alguna vez leí sobre todo eso e hice unas pruebas en aquel entonces y si me daba problemas, pero lo que quería hacer era otra cosa diferente a esta.
En este caso lo probé y vi que andaba, lo que hice fue lo sig: hice un proyecto nuevo con ese código, abrí una ventana de Notepad y cambiaba de una a la otra, y vi que cuando le sacaba el NumLock el Notepad ya no escribía los números y cuando lo ponía si.
Ahora bien, si me explicas como hago para hacerlo fallar lo pruebo, esta PC es una Pentium 233 y tengo instalado Win 98 (donde lo probé) y también NT 4 (ahí no lo he probado, pero si me dices que ahi es donde falla lo veo).
Gracias y saludos,
Javier
Pues no es muy fácil hacerlo fallar, pero se me ocurre algo. Si usted es buen mecanógrafo, haga un pequeño editor de texto, agregue una función que monitoree la entrada de datos al inicio de cada párrafo.
Monitoree en el evento keypress por vbKeyReturn. cuando se detecte esa tecla, active el monitoreo de un espacio (vbKeySpace, creo). En cuanto encuentre el espacio obtenga el estado del capslock. Si está encendido, apáguelo.
Explicación: Si usted es buen mecanógrafo, es probable que pueda presionar una tecla después del espacio. Si fue lo suficientemente rápido, esa letra que presionó después del espacio saldrá en mayúscula, lo cual es contradictorio puesto que en teoría usted apagó el capslock durante el espacio.
No lo he probado, pero creo que es una buena manera de probar.
Monitoree en el evento keypress por vbKeyReturn. cuando se detecte esa tecla, active el monitoreo de un espacio (vbKeySpace, creo). En cuanto encuentre el espacio obtenga el estado del capslock. Si está encendido, apáguelo.
Explicación: Si usted es buen mecanógrafo, es probable que pueda presionar una tecla después del espacio. Si fue lo suficientemente rápido, esa letra que presionó después del espacio saldrá en mayúscula, lo cual es contradictorio puesto que en teoría usted apagó el capslock durante el espacio.
No lo he probado, pero creo que es una buena manera de probar.
Hola José:
Si, habría que hacer todas las pruebas. Lo que pasa es que también si el código sirve o no depende de la aplicación donde va a ir.
Como comenté antes, tuve un caso que me dio problemas, pero yo lo que quería hacer era que el CapLock no se activara simplemente al presionarlo, sino que el usuario tuviera que presionar Ctrl + CapLock para poder cambiar el estado, entonces había hecho un hook del teclado, y cambiaba el estado para lograr eso, ya ni recuerdo que API usaba, pero había leído y tienes razón con respecto a eso que dices sobre el buffer.
Pero en este caso que decida "perju" si para su programa esto le sirve o no, yo solo traté de ayudarlo, me tomé 10 min. y listo.
Lo que vos decís me parece muy interesante pero ahora no estoy haciendo ningún desarrollo al respecto como para tomarme el tiempo de investigarlo a fondo.
De todas maneras me parece muy bueno que vayas así al fondo de las cosas porque es la forma de trabajar bien.
Saludos,
Javier
Si, habría que hacer todas las pruebas. Lo que pasa es que también si el código sirve o no depende de la aplicación donde va a ir.
Como comenté antes, tuve un caso que me dio problemas, pero yo lo que quería hacer era que el CapLock no se activara simplemente al presionarlo, sino que el usuario tuviera que presionar Ctrl + CapLock para poder cambiar el estado, entonces había hecho un hook del teclado, y cambiaba el estado para lograr eso, ya ni recuerdo que API usaba, pero había leído y tienes razón con respecto a eso que dices sobre el buffer.
Pero en este caso que decida "perju" si para su programa esto le sirve o no, yo solo traté de ayudarlo, me tomé 10 min. y listo.
Lo que vos decís me parece muy interesante pero ahora no estoy haciendo ningún desarrollo al respecto como para tomarme el tiempo de investigarlo a fondo.
De todas maneras me parece muy bueno que vayas así al fondo de las cosas porque es la forma de trabajar bien.
Saludos,
Javier
