vale, vale que me he hecho de muchso codigos que no los he hecho funcionar
Pero que lo he hecho en VB6 y me ha quedado y buscando en el MSDN encontre el codigo que necesito en C++, pero en los dos casos es ocupando la API de windows (user32) y lo que necesito es interactuar con el teclado directamente mandando los comandos respectivos todo esto en C o C++.
Les dejo el codigo de VB, C++ y otro que creo hace lo que necesito pero no lo he hecho funcionar, el ultimo ya entendi el funcionamiento y es lo que necesito pero no lo he hecho funcionar si alguien me ayuda ha hacerlo trabajar y decirme lo que le hace falta estaria muy agradecido.
Visual Basic 6:
Código:
' Constantes para las teclas y otros
Const KEYEVENTF_KEYUP = &H2
Const KEYEVENTF_EXTENDEDKEY = &H1
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public aBD, aBM, BN
Public con1, con2, con3
Sub Pulsar_Tecla(Tecla As Long)
Call keybd_event(Tecla, 0, 0, 0)
Call keybd_event(Tecla, 0, KEYEVENTF_KEYUP, 0)
End Sub
Private Sub btnABloqDespl_Click()
con3 = con3 + 1
If con3 = 1 Then
aBD = True
Else
aBD = False
con3 = 0
End If
End Sub
Private Sub btnABloqMayus_Click()
con2 = con2 + 1
If con2 = 1 Then
aBM = True
Else
aBM = False
con2 = 0
End If
End Sub
Private Sub btnABloqNum_Click()
con1 = con1 + 1
If con1 = 1 Then
aBN = True
Else
aBN = False
con1 = 0
End If
End Sub
Private Sub btnBloqDespl_Click()
Call Pulsar_Tecla(&H91)
End Sub
Private Sub btnBloqMayus_Click()
Call Pulsar_Tecla(&H14)
End Sub
Private Sub btnBloqNum_Click()
Call Pulsar_Tecla(&H90)
End Sub
Private Sub Timer1_Timer()
If con1 Then
Call Pulsar_Tecla(&H90)
End If
If con2 Then
Call Pulsar_Tecla(&H14)
End If
If con3 Then
Call Pulsar_Tecla(&H91)
End If
End Sub
en C++
Código:
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
void SetNumLock( BOOL bState)
{
BYTE keyState[256];
GetKeyboardState((LPBYTE)&keyState);
if((bState && !(keyState[VK_NUMLOCK] & 1)) || (!bState && (keyState[VK_NUMLOCK] & 1)))
{
keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
}
int main(int argc, char *argv[])
{
SetNumLock(TRUE);
system("PAUSE");
return EXIT_SUCCESS;
}
En C
Código:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#define KEYBOARD_INT 9
#define KB_SPECIAL_MASK 0x3F
#define KB_CTRL_ALT_FLAG (KB_CTRL_FLAG | KB_ALT_FLAG)
int three_finger_flag;
int key_led_flag;
int (*keyboard_callback)(int key) = NULL;
void (*keyboard_lowlevel_callback)(int key) = NULL; /* killough 3/21/98 */
static int keyboard_installed;
volatile char key[128]; /* key pressed flags */
volatile int key_shifts = 0;
#define KEY_BUFFER_SIZE 256
static volatile int key_buffer[KEY_BUFFER_SIZE];
static volatile int key_buffer_start = 0;
static volatile int key_buffer_end = 0;
static volatile int key_extended = 0;
static volatile int key_pad_seq = 0;
static volatile int key_pause_loop = 0;
static int (*keypressed_hook)() = NULL;
static int (*readkey_hook)() = NULL;
static inline int kb_send_data(unsigned char data)
{
long i;
int resends = 4;
int temp;
do {
outportb(0x60, data);
i = 2000000L;
while (--i) {
temp = inportb(0x60);
if (temp == 0xFA)
return 1;
else if (temp == 0xFE)
break;
}
}
while ((resends-- > 0) && (i));
return 0;
}
/* update_leds:
* Sets the state of the keyboard LED indicators.
*/
static inline void update_leds()
{
if ((!kb_send_data(0xED)) || (!kb_send_data((key_shifts>>8) & 7)))
kb_send_data(0xF4);
}
void set_leds(int leds)
{ /* killough 3/22/98 */
if (leds < 0) {
update_leds();
}
else {
if ((!kb_send_data(0xED)) || (!kb_send_data((leds>>8)&7)))
kb_send_data(0xF4);
} /* killough 3/22/98 */
}