En VB, ¿cómo convertir fórmulas matemáticas en expresiones de VB? ¿Hay algún libro sobre este tema?
Obtener el estado actual presionado de todas las teclas en todo el teclado: función GetKeyBoardState
Esta función obtiene qué teclas en todo el teclado están presionadas en el momento en que se llama. Pasa una matriz de bytes que contiene 256 elementos, escribe la dirección del primer elemento de la matriz en el parámetro real y devuelve el estado correspondiente de las 256 teclas virtuales en todo el teclado al elemento de subíndice correspondiente de la matriz de bytes. Declaración:
Declarar la función GetKeyboardState Lib "user32" (pbKeyState como byte) siempre
Llamar como:
Dim lxn(0 a 255) como byte
Private Sub Timer1_Timer()
GetKeyboardState lxn(0)
Si lxn(66) y &H80, entonces descárgame
Si lxn( 65) Y &H80 Luego MsgBox "Presionaste la letra A y su valor de clave virtual es 65."
End Sub
Esta función solo tiene un parámetro, pbKeyState, pero es muy especial: pasa una matriz de bytes (Byte), y esta matriz debe declararse como elementos de subíndice 0-255***256, como --Dim lxnKey(0 a 255) como byte. Luego escriba el primer elemento lxnKey (0) en el parámetro real: x=GetKeyboardState(lxnKey(0)); en este momento, toda la matriz lxnKey se escribe con el valor de retorno en orden, correspondiente El valor de la clave se escribe en el elemento correspondiente al subíndice. Por ejemplo, el elemento con el subíndice 65, lxnKey (65), coloca el valor de estado de la clave A; lxnKey (66), coloca el valor de estado de la clave B y lxnKey (49). valor de la tecla número 1, etc.
El valor de estado de cada botón está representado originalmente por un valor binario. Si se está presionando una tecla en ese momento, el bit 7 del valor de retorno es 1; si se ha levantado, es 0; si el interruptor Cuando la tecla está activada, el bit 0 se establece en 1 (la tecla del interruptor incluye CapsLock, NumLock, ScrollLock Descripción: ¿Bit 7)? ¿Bit 0? Un número de byte está representado por ocho dígitos en binario, como 10010011. El primer dígito de derecha a izquierda se llama bit 0 (equivalente al dígito de las unidades en decimal), el segundo dígito se llama bit 1 (equivalente al dígito de las decenas en decimal), y el último El de la izquierda es el bit 7 (aunque parece que hay ocho bits, porque el primer bit comienza en 0). Es decir, si se presiona un botón, el valor de retorno correspondiente es 10000000 binario (128 decimal o hexadecimal & H80), pero si se activa una tecla de cambio en el teclado en este momento, puede ser 10000001 (129 decimal o hexadecimal). &H81), etc.
En términos generales, para contenido basado en bits, primero debemos pensar en operaciones de bits: - Para detectar si el bit 7 de un determinado valor binario es 1, simplemente realice una operación AND con &H80 y luego verifique si el resultado no es 0. , ¿por qué? Sabemos que el valor binario de &H80 es 10000000, y con él se aplica un número AND: 101001 y 1000000. Si el bit 7 de este número no es 1, el resultado siempre es 0. Lo entenderás cuando lo veas por ti mismo. También hay una forma sencilla: utilice directamente un valor decimal como 128 y luego compile un módulo de decimal a binario para convertirlo; ¡entonces se podrá detectar el valor de cualquier bit!
------------------------------------------- -- -----------
Determinar si se presiona una tecla específica: función GetKeyState
Esta función se usa a menudo para definir teclas de acceso rápido a nivel de sistema para programas Admite detectar si se presionan varias teclas al mismo tiempo y declara:
Declarar la función GetKeyState Lib "user32" (ByVal nVirtKey As Long) como entero
Los parámetros son muy. simple, simplemente pase el código de clave virtual específico de la clave. Acerca del código de clave virtual: es la constante de la clase VK_ en el navegador API. Generalmente, las letras y los números usan sus valores de código ASCII (nota. que se deben usar los valores ASCII de letras mayúsculas), como claves = ¡No escriba GetKeyState(Asc("A")) como claves=GetKeyState(Asc("a"))! Curiosamente, también puede detectar si se presiona el botón del mouse. Simplemente declare el código de tecla VK_LBUTTON (botón izquierdo) y VK_RBUTTON (botón derecho) y páselo, como por ejemplo:
Atenuar teclas como entero
p>
teclas = GetKeyState(VK_CONTROL) 'Detecta si se presiona la tecla Ctrl
Si las teclas Y &H8000 Entonces 'Si se presiona la tecla Ctrl, devuelve el valor binario 15 de las teclas 1. p>
teclas = GetKeyState(VK_MENU) 'Si la tecla Alt se presiona continuamente.
Si las teclas Y &H8000 Entonces 'Si el decimoquinto dígito de las teclas es 1,:&H8000=(1000000000000000)2
MsgBox "Presionaste la tecla de acceso rápido Ctrl+Alt al mismo tiempo."
End If
End If
El valor de retorno de esta función es un número entero (doble byte), para determinar si se presiona una tecla específica, observe el valor de retorno. Si la tecla de cambio está activada, el bit 0 se establece en 1 (la tecla de cambio incluye Bloq Mayús, Bloqueo Num, Bloqueo de Desplazamiento). ; es decir, (00000000000000001) 2, si se presiona una tecla, el bit 15 es 1, es decir (1000000000000000) 2. Si se ha levantado, es 0.
Problema: Según la descripción de la función, esta función debería poder detectar si se presiona alguna tecla, pero descubrí que no puede distinguir teclas individuales, como las teclas numéricas en el teclado numérico.
------------------------------------------- -- ------------
Determinar si se presiona una tecla específica: función GetAsyncKeyState
Esta función es similar a la función GetKeyState, ambas Determine si se presiona una tecla específica a continuación, pero parece haber una pequeña diferencia conceptual. Se debe llamar a GetKeyState después de presionar una tecla determinada para juzgar que se acaba de presionar una tecla determinada al mismo tiempo. se presiona una determinada tecla para juzgar que se está presionando una determinada tecla y, según cierta información, GetAsyncKeyState está limitado al alcance de este programa, no al nivel del sistema, pero en realidad este no es el caso. Se utiliza para definir teclas de acceso rápido a nivel del sistema.
Declaración:
Declarar la función GetAsyncKeyState Lib "user32" (ByVal vKey As Long) como entero
Los parámetros y el valor de retorno son los mismos que los de la función GetKeyState .
El siguiente es un ejemplo de cómo definir una tecla de acceso rápido: Tecla Ctrl + botón derecho del mouse (interesante) Cuando se presiona Ctrl + botón derecho del mouse, aparecerá un cuadro de diálogo. Por supuesto, GetKeyState también puede ser. usado:
Private Sub Timer2_Timer()
Atenuar claves como entero
claves = GetAsyncKeyState(VK_CONTROL)
Si las claves y &H8000 entonces
keys = GetAsyncKeyState(VK_RBUTTON)
Si claves y &H8000 Entonces MsgBox "Hola, ¿cómo estás?"
Fin si
End Sub
Adición al valor de retorno de esta función: el valor de retorno es de 2 bytes, con el bit 0 establecido en 1 si la tecla se ha presionado desde la última llamada a la función GetAsyncKeyState; de lo contrario, se establece; a 0. El bit 15 se establece en 1 si la tecla está presionada actualmente; en 0 si está levantada. El manual win32 de Microsoft dice: Si el foco de entrada pertenece a otro subproceso de entrada diferente del subproceso de entrada que llamó a la función, el valor de retorno es 0 (por ejemplo, una vez que otro programa tiene el foco, debería devolver cero). La evidencia muestra que las funciones realmente funcionan dentro del alcance de todo el sistema.
------------------------------------------- ----- -------
Consultar el código de escaneo de una clave: función MapVirtualKeyA
Esta función devuelve el código de escaneo de una clave en función de su clave virtual code También puede ser El código de escaneo de una clave devuelve el código de clave virtual de la clave, y el valor ASCII correspondiente de la clave también se puede obtener conociendo el código de clave virtual. Declaración:
Declarar función MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
El primer parámetro wCode es conocido Código de clave virtual (si está buscando un código de clave virtual, es un valor de código de escaneo conocido) El segundo parámetro wMapType es uno de 0, 1 o 2, que es 0; el parámetro anterior wCode es un código de clave virtual. La función devuelve el código de escaneo correspondiente; es 1; el primer parámetro wCode es un código de escaneo. La función devuelve el código de clave virtual correspondiente; es 2: wCode es un código de clave virtual. La función devuelve el valor ASCII correspondiente (sin la combinación de teclas Shift).
El valor de retorno de la función es el código de escaneo requerido (o código de clave virtual). Nota: Los códigos de escaneo para diferentes tipos de teclados son diferentes, pero los códigos de teclas virtuales después de llegar a Windows están unificados en todas las computadoras.
Llamar como: Quiero saber el código de escaneo de la tecla Ctrl de mi teclado.
x& = MapVirtualKey(VK_CONTROL, 0)
Imprimir x&
------------------ - -----------------------------------
Obtén la física de una tecla en el Nombre de la tecla del teclado: función GetKeyNameTextA
Dado que cada modelo de teclado es diferente, para determinar el nombre de una tecla específica en un teclado, debe confiar en su código de escaneo, declarar:
Declarar Función GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
El primer parámetro especifica el valor del código de escaneo de una clave y luego lo multiplica por &H10000. Los dos parámetros especifican un búfer de cadena utilizado para cargar el nombre de la clave, y el tercer parámetro es la longitud del búfer. El valor de retorno de la función es el número de caracteres realmente escritos en el búfer de cadena.
Llamar como:
Private Sub Command1_Click()
Dim abuf As String
abuf = String(255, " ")
x& = MapVirtualKey(VK_CONTROL, 0)
lng& = GetKeyNameText(x& * &H10000, abuf, 255)
Imprimir izquierda(abuf, lng&)
End Sub
Explicación: ¿Por qué el primer parámetro debería multiplicarse por &H10000? Esto se debe a que originalmente se expresa como un número binario, bits 0 a 5 = 0; bits 16 a 23 = código de escaneo de la clave; bit 24 = bits de extensión en el teclado mejorado, bit 25 = si está configurado en 1, significa; Ignore la diferencia entre las teclas Shift y Ctrl izquierda y derecha. Para que el valor del código de escaneo x& originalmente ubicado en los bits 0-7 se mueva a los bits 16-23, debe multiplicarse por el número binario 1000000000000000 (16 ceros); el valor hexadecimal es &H10000.
------------------------------------------- ----- ----------------------------
Simular pulsaciones de teclas: proceso keybd_event
Simulación ¿Qué tecla se presiona o levanta en el teclado? Debe ingresar el código de tecla virtual y el código de escaneo de la tecla al mismo tiempo (en el experimento, descubrí que el código de escaneo no es necesario desde que presioné). La tecla y levantar la tecla son dos acciones, por lo que cuando se hace clic en la tecla, la función debe llamarse dos veces. El tercer parámetro debe establecerse en 2 durante la segunda llamada, lo que significa levantar. Tenga en cuenta que para algunas teclas de función, como Ctrl y Alt, la función debe llamarse dos veces (en realidad, cualquier tecla debe llamarse dos veces, porque permanecerá presionada, excepto otras teclas, porque son teclas virtuales y las teclas físicas). todavía son un poco diferentes, no hay obstáculo).
Declaración:
Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Los parámetros son los siguientes:
bVk: Byte, el código de clave virtual a simular
bScan: Byte, el código de escaneo OEM de la clave
dwFlags: Long, zero o; establecido en los dos siguientes. Una de las banderas
KEYEVENTF_EXTENDEDKEY (valor 1) indica que es una clave extendida y está precedida por un código 0xE0
KEYEVENTF_KEYUP (valor 2) simula la liberación de una clave
dwExtraInfo: Largo, cero. Un valor que normalmente no se utiliza. La función API GetMessageExtraInfo puede obtener este valor. Los valores permitidos dependen del controlador específico.
Llamar como: simula hacer clic en la barra espaciadora.
x& = MapVirtualKeyA(VK_SPACE, 0)
keybd_event VK_SPACE, x&, 0, 0 'Haga clic en la barra espaciadora.
Otro ejemplo es simular la tecla Ctrl+V:
x& = MapVirtualKeyA(VK_CONTROL, 0)
keybd_event VK_CONTROL, x&, 0, 0 'Presionar Ctrl, automáticamente permanece presionado.
keybd_event vbKeyV, 0, 0, 0 'Haga clic en la tecla V. Las constantes VB se usan directamente aquí y no hay código de escaneo. Es un método simple.
keybd_event VK_CONTROL, x&, 2, 0 'Levanta la tecla Ctrl.
Otro ejemplo es capturar la ventana activa (tecla Alt+Imprimir pantalla):
keybd_event VK_MENU, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, 0, 0
keybd_event VK_MENU, 0, 2, 0
(Para capturar la pantalla, simplemente presione la tecla Imprimir pantalla directamente. Para capturar solo la ventana activa, debe presionar la tecla tecla Alt al mismo tiempo.)
p>
También se pueden simular otras claves especiales. Por ejemplo, el valor del código de clave virtual de la clave de Windows es 91 (no se puede encontrar en el navegador API. Úselo directamente: keybd_event 91, 0, 0, 0
keybd_event 91, 0, 2, 0 puede abrir el menú "Inicio" porque aparece cuando se "levanta" la tecla. es necesario llamarlo dos veces. Siempre que conozcamos el código de la tecla virtual, podemos simular cualquier pulsación de tecla. Todos los valores del código de la tecla virtual (decimal común) son los siguientes:
--------El primero. fila de teclas F y las teclas principales del teclado ---------
Teclas F1-F12: valores de 112-123. Teclas numéricas 0-9 en el teclado principal: valores del 48-57.
Teclas de letras A-Z: valores del 65-90. Tecla ESC: valor 27.
Clave de símbolo "~": valor 192. "-"Tecla menos: 189.
"="Clave del signo igual: 187. " \ "Clave: 220.
Retroceso: 8. Tecla TAB: 9.
"["Clave del corchete izquierdo: 219. "]"tecla del corchete derecho: 221.
Tecla Intro: 13. Bloq Mayús: 20.
";"Tecla de punto y coma: 186. "'"Clave de cita: 222.
Tecla Mayús: 16. (También puede referirse solo a la tecla Shift izquierda: 160, y solo se refiere a la tecla Shift derecha: 161.
)
","Tecla de coma: 188. "." Clave de período: 190.
Tecla "/": 191.
Tecla Ctrl: 17. (También izquierda: 162; derecha: 163) Tecla Alt: 18. (También izquierda: 164; derecha: 165)
Tecla de Windows: izquierda: 91; derecha: 92.
------Teclas de función---------
Teclas arriba, abajo, izquierda y derecha: Izquierda: 37; Arriba: 38: Derecha: 39; Abajo: 40.
Tecla de sueño: 95.
Tecla Imprimir pantalla: 44. Tecla de bloqueo de desplazamiento: 145.
Insertar clave: 45. Tecla Eliminar: 46.
Tecla de posición inicial de inicio: 36. Tecla de posición final FINAL: 35.
Tecla Re Pág: 33. Tecla Av Pág: 34.
------Teclas del teclado numérico-------
Tecla Bloq Num: 144. Tecla "/": 111.
Tecla "*": 106. Tecla "-": 109.
Tecla "+": 107. Tecla Intro: 13.
El resto de teclas se dividen en dos situaciones cuando la tecla Bloq Num está desactivada:
Tecla Num 1: 35. Número 2 llaves: 40. Número 3 llaves: 34. Número 4 llaves: 37. Número 5 llaves: 12. Número 6 llaves: 39. Número 7 llaves: 36. Número 8 llaves: 38. Número 9 llaves: 33. Tecla número 0: 45.
Tecla Supr: 46.
Cuando la tecla Bloq Num está activada: (la luz indicadora de Bloq Num en el teclado está encendida)
Tecla Número 1: 97. Número 2 llaves: 98. Número 3 llaves: 99. Número 4 llaves: 100. Número 5 llaves: 101. Número 6 llaves: 102. Número 7 llaves: 103. Número 8 llaves: 104. Número 9 llaves: 105. Tecla número 0: 96.
Tecla Supr: 110.
-----Botón del ratón-------
Botón izquierdo del ratón: valor 1. Botón derecho del ratón: valor 2.
Los principales son los anteriores, que probé yo mismo usando la función GetKeyboardState.