Avatar billede suicid3 Nybegynder
14. oktober 2008 - 13:47 Der er 17 kommentarer og
1 løsning

"Fange" tastekombination

Hej,

Jeg har et simpelt program der kører i DOS prompt. Dette program skal afsluttes ved en tastekombination "Alt-A".

Hvordan får jeg den til at fange de taster???

Koden kan ses her: http://pastebin.com/m471813fc
Avatar billede suicid3 Nybegynder
14. oktober 2008 - 14:20 #1
Glemte lige at sige at jeg bruger Borland C++ 5.02 som editor og compiler...
Avatar billede arne_v Ekspert
14. oktober 2008 - 18:33 #2
Check hvad getch() returnerer ved ALT-A !

Jeg gaetter paa at du skal kalde funktionen to gange og teste pa begge vaerdier.
Avatar billede arne_v Ekspert
14. oktober 2008 - 18:33 #3
conio er oevrigt 20 aar gammel teknologi - har du overvejet noget andet ?
Avatar billede suicid3 Nybegynder
15. oktober 2008 - 18:37 #4
Næh, jeg er ny startet på IT-Supporter uddannelsen og i den forbindelse har vi C++ programmering. Så jeg er total nybegynder. Hvad er der af alternativer da? Jeg er som sagt under novice niveau, så alle guldkorn er velkomne :D
Avatar billede arne_v Ekspert
15. oktober 2008 - 18:47 #5
Enten noget Win32 API eller curses ville give mere mening.

Har du testet hvad getch returnerer ved ALT-A ?
Avatar billede suicid3 Nybegynder
15. oktober 2008 - 19:16 #6
Kan du uddybe eller give et link til en god forklaring??

Nej skal lige have puttet ungerne så tester jeg lige eller lidt senere(kommer an på hvor voldsomt sofaen kalder...).... :D
Avatar billede bertelbrander Praktikant
15. oktober 2008 - 20:00 #8
Man kunne lave noget i stil med:
#include <iostream>
#include <windows.h>

WORD GetChar()
{
  DWORD NumEventsRead;
  INPUT_RECORD InputRecord;

  while(1)
  {
    if(!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &InputRecord, 1, &NumEventsRead))
      return 0;
    if(InputRecord.EventType & KEY_EVENT && InputRecord.Event.KeyEvent.bKeyDown)
    {
      if(InputRecord.Event.KeyEvent.wVirtualKeyCode != VK_CONTROL &&
        InputRecord.Event.KeyEvent.wVirtualKeyCode != VK_MENU  &&
        InputRecord.Event.KeyEvent.wVirtualKeyCode != VK_SHIFT)
      {
        return InputRecord.Event.KeyEvent.wVirtualKeyCode;
      }
    }
  }
}

bool IsAltPressed()
{
  return GetAsyncKeyState(VK_MENU) & 0x8000 ? true : false;
}

int main()
{
  while(1)
  {
      WORD key = GetChar();
      if(key == 'A' && IsAltPressed())
        std::cout << "Alt+A" << std::endl;
  }
}
Avatar billede suicid3 Nybegynder
15. oktober 2008 - 20:55 #9
bertelbrander: super med koden, men der er langt langt langt over mit niveau. kan du lægge lidt commant på eller lægge et link til en side hvor jeg kan slå det hele, eller det meste, op?

jeg er som sagt MEGA n00b til det her...
Avatar billede bertelbrander Praktikant
15. oktober 2008 - 21:30 #10
Det er ikke helt simpelt. Her er et par links til de vigtigste funktioner:
http://msdn.microsoft.com/en-us/library/ms683231(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms684961(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx

GetChar returnerer den tast der er trykket, den kender ikke forskel på store og små bogstaver.

IsAltPressed checker bare om Alt er nede, Alt knappen hedder VK_MENU i windows...
Avatar billede suicid3 Nybegynder
19. oktober 2008 - 12:05 #11
bertelbrander: koden su skrev fejler når jeg prøver at compile den....

Info :Compiling C:\bc5\bin\test.cpp
Error:  test.cpp(7,27):Undefined symbol 'INPUT_RECORD'
Error:  test.cpp(7,27):Statement missing ;
Error:  test.cpp(11,26):Call to undefined function 'ReadConsoleInput'
Error:  test.cpp(11,39):Call to undefined function 'GetStdHandle'
Error:  test.cpp(11,56):Undefined symbol 'STD_INPUT_HANDLE'
Error:  test.cpp(11,71):Undefined symbol 'InputRecord'
Error:  test.cpp(13,41):Undefined symbol 'KEY_EVENT'
Error:  test.cpp(36,12):Qualifier 'std' is not a class or namespace name
Error:  test.cpp(36,14):Statement missing ;
Avatar billede bertelbrander Praktikant
19. oktober 2008 - 14:43 #12
Jeg har ikke rigtigt en fungerende Borland compiler for tinden, så jeg ved ikke helt hvad der går galt. Det virker mest som om der er nogle compiler flag der bliver sat forkert, et eller andet sted.
Jeg prøver at grave videre i aften...
Avatar billede suicid3 Nybegynder
19. oktober 2008 - 16:10 #13
ok super...
Avatar billede bertelbrander Praktikant
20. oktober 2008 - 00:39 #14
Min eneste Borland compiler ligger på den delvis defekt harddisk, så jeg skal lige have den monteret i den gamle spand og restoret derfra, det bliver ikke i aften...

Borland C++ 5.02 er det Borland Builder 5.0? Eller er det en endnu ældre sag?
Hvilket studie er det du går på? Det er vist mange år siden de fleste studier gik bort fra at bruge Borlands compilere.

Har compileren en wincon.h fil i sin include mappe?
Avatar billede suicid3 Nybegynder
26. oktober 2008 - 23:15 #15
Jeg vil lige starte med at undskylde for min noget ringe opfølgning på mit eget spørgsmål, men jeg har desværre været noget tidspresset. Undskyld.

Den kode som du skrev bertelbrander fik min lære til at virke i Visual Studio. og den virkede, jeg er ikke helt sikker hvad han gjorde men den virkede.

Jeg selv fandt frem til en kode der så sådan her ud:

void main(void)

{

char ch1,ch2;




while(1)

{

  ch1 = getch();

  if(ch1==0)

  {

  ch2 = getch();

  switch(ch2)

  {

    default:

    break;

    case 49: ny_ordre();
    // Alt-N
    break;

    case 30: exit(0);
        // Alt-A
    break;

    case 31: laeg_sammen();
  // Alt-S
    break;

  }

  }

}

}

Og den virker fint. og jeg endte med at bruge den, da jeg kan forklare mig ud af den kode og ikke den anden.

Men smid et svar bertelbrander så er pointene dine...
Avatar billede suicid3 Nybegynder
26. oktober 2008 - 23:16 #16
Unskyld for de ekstra mellemrum... Der må være gået noget galt under kopieringen...
Avatar billede bertelbrander Praktikant
26. oktober 2008 - 23:41 #17
Jeg har også set kode magen til din et andet sted, så den virker nok...
Jeg ved dog ikke hvorfor eller hvordan...
Jeg samler ikke på point.
Avatar billede suicid3 Nybegynder
28. oktober 2008 - 19:18 #18
!!! LUKKET !!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester