(WinAPI) "bioskey" unter Win32Konsole



  • HY Leute!

    Kann ich unter Visual C++ Standard von Microsoft sowas ähnliches wie "bioskey" oder hat jemand vielleicht ein Programm erstell, das es möglich macht diese Anweisung in Visual C++ einzubinden. Für "gotoxy, textbackground usw." hat sich jemand mal die Mühe gemacht.

    Mein Lehrgang ist für Borland C++ ausgelegt, aber ich verfüge leider über Visual C++ von Microsoft. Vieleicht gibt es ja ausser "kbhit" noch eine andere Möglichkeit?

    Muß dieses Programm so ändern, das es bioskey beim compilieren akzeptiert oder eben eine andere Anweisung einsetzen kann.

    #include <stdio.h>
    #include <conio.h>
    #include <bios.h>     /* kennt Visual c++ nicht
    
    #define BIL clrscr() /* wird mit zusätzlicher selbstgebastelter 
                         /* Conioex akzeptiert (nicht von mir)
    
    int get_mtaste( int maske );
    
    enum mod_tast   { SHIFT_R  = 0x01,
                      SHIFT_L  = 0x02,
                      CNTRL    = 0x04,
                      ALT      = 0x08,
                      SCROLL_L = 0x10,
                      NUM_L    = 0x20,
                      CAPS_L   = 0x40,
                      INS      = 0x80
                    };
    
    char netz[5][20] =
          {{' ',' ',' ','Ú','Ä','Ä','Ä','Ä','Ä','Ä',
       'Ä','Ä','Ä','Ä','Ä','¿',' ',' ',' ', '\0'
           },
           {' ',' ',' ','³',' ',' ',' ',' ',' ',' ',
       ' ',' ',' ',' ',' ','³',' ',' ',' ', '\0'
           },
           {'1','Ä','Ä','´',' ',' ',' ',' ',' ',' ',
       ' ',' ',' ',' ',' ','Ã','Ä','Ä',' ', '\0'
           },
           {' ',' ',' ','³',' ',' ',' ',' ',' ',' ',
       ' ',' ',' ',' ',' ','³',' ',' ',' ', '\0'
           },
           {' ',' ',' ','À','Ä','Ä','Ä','Ä','Ä','Ä',
       'Ä','Ä','Ä','Ä','Ä','Ù',' ',' ',' ', '\0'
           }};
    
    void main(void)
    {
      int i,
          schalter=0,
          s1=0, s2=0, s3=0,s4=0,
          a=0,
          x=30, y=10;
    
      BIL;
    
      for(i=0; i<5; i++)
      {
        gotoxy( x,y+i );
        puts( netz[i] );
      };
      do
      {
          s1=s2=s3=s4=0;
          if( schalter & SHIFT_L )
            s1=1;
    
          if( schalter & SHIFT_R )
            s2=1;
    
          if( schalter & ALT )
       s3=1;
    
          if( schalter & CNTRL )
       s4=1;
    
          a=0;
          if( s1 && s2 || s3 && s4 ) a=1;
    
          gotoxy( x+6, y );
          printf("%1d",s1);
          gotoxy( x+12, y );
          printf("%1d",s2);
          gotoxy( x+6, y+4 );
          printf("%1d",s3);
          gotoxy( x+12, y+4);
          printf("%1d" ,s4);
          gotoxy( x+18, y+2 );
          printf("%1d",a );
    
          schalter =
       get_mtaste( SHIFT_L | SHIFT_R | ALT | CNTRL ) ;
      }
      while( kbhit() == 0 );
    }
    int get_mtaste( int maske )
    {
      int tast_stat_neu = 0,
          tast_stat_alt = 0;
    
        while( bioskey(1) != 0 )
                 bioskey(0);
    
        tast_stat_alt = bioskey(2) & maske ;
    
        while( (tast_stat_neu
                = bioskey(2) & maske)
                == tast_stat_alt
              && !kbhit() );
    
        return tast_stat_neu;
    }
    

    Programm gibt einen Schaltkreis aus, in dem die Ausgabe so auf Null steht und beim betätigen einer entsprechenden Taste (ALT) z. B soll au der Null eine 1 werde.

    EditBySideWinder: Code-Tags eingefügt, in Zukunft bitte selbst einfügen!

    [ Dieser Beitrag wurde am 09.12.2002 um 14:13 Uhr von SideWinder editiert. ]



  • Ich hab Dir mal was gebastelt. Das sollte so ungefähr mit dem Original übereinstimmen. Da Du nur die Funktionen 0, 1 und 2 benötigst, hab ich mich auch darauf beschränkt. Nicht schön, aber selten:

    #include <windows.h>
    
    #ifndef BITSPERBYTE
      #define BITSPERBYTE 8
    #endif
    
    #define IS_MSB(x)     ((x) &  (1 << ((sizeof((x)) * BITSPERBYTE) - 1)))
    #define SETBIT(x, b)  ((x) |= (1 << (b)))
    
    #define NUM_ELEMENTS(x) (sizeof((x)) / sizeof((x)[0]))
    
    int __cdecl bioskey(int cmd)
    {
      PINPUT_RECORD pir;
      INPUT_RECORD  ir[1];
      HANDLE        hInput;
      DWORD         dwRead, dwConsoleMode, dwCnt;
      int           nRet;
    
        if(INVALID_HANDLE_VALUE == (hInput = GetStdHandle(STD_INPUT_HANDLE)))
            return(0);
    
        switch(cmd)
        {
            case 0x00:
                 GetConsoleMode(hInput, &dwConsoleMode);
                 SetConsoleMode(hInput, 0);
    
                 do
                 {
                     if(!ReadConsoleInputA(hInput, ir, NUM_ELEMENTS(ir), &dwRead))
                     {
                         SetConsoleMode(hInput, dwConsoleMode);
                         return(0);
                     }
                 } while((!dwRead) || (KEY_EVENT != ir[0].EventType) || (!ir[0].Event.KeyEvent.bKeyDown));
    
                 SetConsoleMode(hInput, dwConsoleMode);
    
                 if((VK_PAUSE == ir[0].Event.KeyEvent.wVirtualKeyCode) && (ir[0].Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))
                     return(-1);
    
                 return(MAKEWORD(ir[0].Event.KeyEvent.uChar.AsciiChar, ir[0].Event.KeyEvent.wVirtualScanCode));
            case 0x01:
                 nRet = 0;
    
                 if(!GetNumberOfConsoleInputEvents(hInput, &dwRead))
                     return(0);
                 if(!dwRead)
                     return(0);
                 if(NULL == (pir = (PINPUT_RECORD)HeapAlloc(GetProcessHeap(), 0, dwRead * sizeof(*pir))))
                     return(0);
    
                 if(PeekConsoleInputA(hInput, pir, dwRead, &dwRead))
                 {
                     for(dwCnt = 0; dwCnt < dwRead; ++dwCnt)
                     {
                         if((KEY_EVENT == pir[dwCnt].EventType) && (pir[dwCnt].Event.KeyEvent.bKeyDown))
                         {
                             if((VK_PAUSE == pir[dwCnt].Event.KeyEvent.wVirtualKeyCode) && (pir[dwCnt].Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))
                                 nRet = -1;
                             else
                                 nRet = MAKEWORD(pir[dwCnt].Event.KeyEvent.uChar.AsciiChar, pir[dwCnt].Event.KeyEvent.wVirtualScanCode);
    
                             break;
                         }
                     }
                 }
    
                 HeapFree(GetProcessHeap(), 0, (PVOID)pir);
                 return(nRet);
            case 0x02:
                 nRet = 0;
    
                 if(IS_MSB(GetAsyncKeyState(VK_RSHIFT)))
                     SETBIT(nRet, 0);
                 if(IS_MSB(GetAsyncKeyState(VK_LSHIFT)))
                     SETBIT(nRet, 1);
                 if(IS_MSB(GetAsyncKeyState(VK_CONTROL)))
                     SETBIT(nRet, 2);
                 if(IS_MSB(GetAsyncKeyState(VK_MENU)))
                     SETBIT(nRet, 3);
                 if(IS_MSB(GetAsyncKeyState(VK_SCROLL)))
                     SETBIT(nRet, 4);
                 if(IS_MSB(GetAsyncKeyState(VK_NUMLOCK)))
                     SETBIT(nRet, 5);
                 if(IS_MSB(GetAsyncKeyState(VK_CAPITAL)))
                     SETBIT(nRet, 6);
                 if(IS_MSB(GetAsyncKeyState(VK_INSERT)))
                     SETBIT(nRet, 7);
    
                 return(nRet);
            default:
                 break;
        }
    
      return(0);
    }
    

    [ Dieser Beitrag wurde am 12.09.2002 um 02:42 Uhr von -King- editiert. ]



  • kann sich BITSPERBYTE irgendwann auch mal ändern, so dass ein byte später mal 16 bits groß ist? 😕 😕



  • AFAIK ist es nirgendwo festgeschrieben, aus wievielen Bits ein Byte zu bestehen hat.



  • Hallo

    Hat lange gedauert, bis ich das Teil wieder gefunden habe. Naja schönen dank für das Programm KiD? . Aber jetzt habe ich noch ein Problem. Wie bekomme ich die ganze Geschichte dazu, das das Programm anstatt der Null bei entsprechenden Tastendruck ein eins anzeigt?

    Das Programm läßt sich ja wenigsten kompilieren, was vorher nicht der Fall war.



  • Wie bekomme ich die ganze Geschichte dazu, das das Programm anstatt der Null bei entsprechenden Tastendruck ein eins anzeigt?

    Äh, Du mußt die entsprechenden Tasten auch drücken. Ich habe das mit Deinem Code getestet (ohne Änderungen), funktioniert zumindest bei mir einwandfrei.



  • Äh, Du mußt die entsprechenden Tasten auch drücken.

    lol, ich glaub an so etwas ähnliches hat er auch schon gedacht ;).

    MfG SideWinder



  • Hallo

    Ich drücke die Tasten, aber es wird keine 1 angezeigt. Woran kann das liegen? Ich benutze eine Tastatur ohne Kaber und dazu den Standardtreiber von Windows. Kann das eventuel der Grund sein??



  • Hallo

    Noch eine andere Überlegung!!

    Kann es sein, das ich das "gebastelte Programm" falsch eingebunden habe?? Ich habe es als "HEADER-DATEI" aufgerufen. Dabei funktuioniert die Compilierung aber nicht der Tastendruck. Mein Schaltkreis benötigt die Tasten "STRG,ALT,und SHIFT rechts und links".

    Danke für Eure Hilfe!!
    😞



  • Ich verschieb dich damit mal ins WinAPI-Forum, da ist a. King öfter und b. ist es sowieso fast nur mehr WinAPI.

    MfG SideWinder


Anmelden zum Antworten