Ver Mensaje Individual
  #6 (permalink)  
Antiguo 21/10/2009, 20:21
ainerplood
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Encender/Apagar leds del teclado con o c++

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 */
}