Keycodes mittels Inline-Assembler

Schnelle objektorientierte, kompilierende Programmiersprache.
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Keycodes mittels Inline-Assembler

Beitrag von nufan » So Feb 08, 2009 6:10 pm

Hallo!

Tja, heute an die Hausübung gesetzt und gemerkt, dass ich für ein Beispiel Sondertasten (--> Keycodes) brauche. :roll:
Mein Lehrer dachte wahrscheinlich an getch...

1. Gedanke: SDL
Ich weiß nicht, ob mein Lehrer mit einem SDL-Keyevent zufrieden wäre... das ist die letzte Alternative.

2. getch --> getchar
Hab dann ich versucht mit getchar das gleiche wie mit getch hinzubekommen was aber natürlich nicht funktionierte.

Ich hab mich schon genug damit beschäftigt um zu wissen, dass es keine reine C-Lösung dafür gibt. :(
Google brachte mich auf Assembler.

Ein bisschen gegoogelt und das hier gefunden:

http://www.koders.com/assembler/fid868D ... 35A71.aspx

Oder etwas kürzer:
https://www.buha.info/board/showthread.php?t=44108

Ich weiß nicht, ob die Codes das gleiche machen.

Ich stell mir das so vor:

Code: Alles auswählen

int getkeycode ()
{

  int keycode;

  asm ("Eingabe + Berechnung des Codes usw...");

  return keycode;

}
Dann in einen Header packen und fertig. ;)

Nun die Fragen:
Welcher Google-Code macht am ehesten das, was ich will? --> Kennt jemand eine bessere Lösung?
Wie funktioniert das mit dem Kompilieren des Codes genau?
Funktioniert das überhaupt?

:?:

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Keycodes mittels Inline-Assembler

Beitrag von cloidnerux » So Feb 08, 2009 6:24 pm

Also, ich würde dir empfehlen den Assemblercode extern zu ner Objektdatei zu Compilieren und nachher beim Linken einzubinden. Auf die Funktionen kannst du mit

Code: Alles auswählen

extern <Rückgabewert> Funktionsanme(<Parameter>);
zugreifen.
dass ich für ein Beispiel Sondertasten (--> Keycodes) brauche. :roll:
Was heiß Sondertasten?
Tasten wie "Einfügen", "Entfernen" usw. oder Sonderzeichen wie ┬ oder ◘?

Das Beispiel aus dem ersten Linkwird warscheinlich NICHT unter Windows > 1 und Linux nicht laufen, da dort die DOS Interupts (9H, 10H) genutz werden und die nur unter DOS funktionierten? Bin mir da nicht ganz sicher.
Inline Assembler würde ich nicht nutzen, da dort häufig irgendwas vom Compiler geändert oder nicht erkannt wird, was zu Fehlern und BUGs führt.
Der zweite link funktioniert bei mir nicht.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Keycodes mittels Inline-Assembler

Beitrag von nufan » So Feb 08, 2009 6:30 pm

cloidnerux hat geschrieben:Also, ich würde dir empfehlen den Assemblercode extern zu ner Objektdatei zu Compilieren
Ich nehme an damit würde ich mir das Neukompilieren des Assemblercodes ersparen. Das wäre schon praktisch...
cloidnerux hat geschrieben:Was heiß Sondertasten?
Tasten wie "Einfügen", "Entfernen" usw. oder Sonderzeichen wie ┬ oder ◘?
Damit meinte ich Taste wie Bild-Auf, Bild-Ab, Strg, Pfeiltasten, Einfügen, Entfernen, usw.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Keycodes mittels Inline-Assembler

Beitrag von cloidnerux » So Feb 08, 2009 6:37 pm

Hab ich ja noch vergessen, unter welchen System soll das Laufen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Keycodes mittels Inline-Assembler

Beitrag von nufan » So Feb 08, 2009 6:42 pm

cloidnerux hat geschrieben:Hab ich ja noch vergessen, unter welchen System soll das Laufen?
Es soll unter Windows und Linux laufen (wenn möglich).
Sonst hätt ich gleich getch nehmen können...

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Keycodes mittels Inline-Assembler

Beitrag von cloidnerux » So Feb 08, 2009 6:52 pm

Sonst hätt ich gleich getch nehmen können...
Soweit ich weiß, gibt getch auch nur ein char zuück.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Keycodes mittels Inline-Assembler

Beitrag von nufan » So Feb 08, 2009 7:00 pm

cloidnerux hat geschrieben:
Sonst hätt ich gleich getch nehmen können...
Soweit ich weiß, gibt getch auch nur ein char zuück.
Du hast doch Windows, oder?

Versuch mal das:

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>

int main ()
{

  char richtung;

  richtung=getch ();

  if (richtung==0)
  {

    richtung=getch ();

    if (richtung==72)
      printf ("rauf");

    else if (richtung==80)
      printf ("runter");

    else if (richtung==75)
      printf ("links");

    else if (richtung==77)
      printf ("rechts");

  }

  return 0;

}
Und drück eine Pfeiltaste. Der Code ist jedoch ungetestet.

Sondertasten haben ASCII 0. Und mit noch einem getch kommt man an den Keycode.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Keycodes mittels Inline-Assembler

Beitrag von cloidnerux » So Feb 08, 2009 7:36 pm

Ähm, das funktioniert bei mir nicht.

Ich würde dir mehr dazu Raten, per DirectInput oder SDl die TAsten einzulesen, anstatt auf getch() zu setzen.
Denn für DirectInput kann ich dir ein bepiel geben.
Ist aber in C++ geschrieben.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Keycodes mittels Inline-Assembler

Beitrag von nufan » So Feb 08, 2009 7:52 pm

cloidnerux hat geschrieben:Ähm, das funktioniert bei mir nicht.
Ich hab gerade zum 1. Mal seit fast zwei Monaten Vista gestartet um es zu testen und es funktioniert bei mir ohne Probleme. Hast du es nicht aus der Konsole gestartet? Dann fehlt zum Schluss noch ein getch damit man die Ausgabe noch sieht.
Hier die verbesserte Version, beendet wird mit zweimal Escape:

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>

int main ()
{

  char richtung;

  do
  {

    richtung = getch ();

    if (richtung == 0)
    {

      richtung=getch ();

      if (richtung == 72)
        printf ("rauf\n");

      else if (richtung == 80)
        printf ("runter\n");

      else if (richtung == 75)
        printf ("links\n");

      else if (richtung == 77)
        printf ("rechts\n");

    }

  } while (richtung != 27);

  getch ();

  return 0;

}
Aber egal, ich sehe getch nicht wirklich als Alternative.
cloidnerux hat geschrieben:Ich würde dir mehr dazu Raten, per DirectInput oder SDl die TAsten einzulesen, anstatt auf getch() zu setzen.
SDL ist wie gesagt die letzte Alternative, sollte ich nichts anderes finden.
Was genau meinst du mit DirectInput?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Keycodes mittels Inline-Assembler

Beitrag von cloidnerux » So Feb 08, 2009 7:58 pm

Windows besitz DirectX, eine Element davon ist DirectInput.
Über DirectInput bekommste die Scancodes die du mit Macros nutzen kannst.

Code: Alles auswählen

class keyboard
{
private:
	LPDIRECTINPUTDEVICE8 keybrd;
public:
	void init();
	int poll(keybrd_keys *state);
};

void keyboard::init()
{
	mein_directinput.dinput->CreateDevice(GUID_SysKeyboard,&keybrd,NULL);
	keybrd->SetDataFormat(&c_dfDIKeyboard);
	keybrd->SetCooperativeLevel(balance_window, DISCL_NONEXCLUSIVE|DISCL_BACKGROUND);
}

int keyboard::poll(keybrd_keys *state)
{
	unsigned char key[256];
	ZeroMemory(key, 256);
	if(keybrd->Acquire() <0)
		return 0;
	keybrd->GetDeviceState(256, key);
	ZeroMemory(state, sizeof(keybrd_keys));
	state->w= key[DIK_W];			//Schreibt beim drücken der Vorwärtstaste das in diestruktur Keybord
	state->s= key[DIK_S];
	state->a= key[DIK_A];
	state->d= key[DIK_D];
	state->xp=key[DIK_7];
	state->yp=key[DIK_8];
	state->zp=key[DIK_9];
	state->xm=key[DIK_4];
	state->ym=key[DIK_5];
	state->zm=key[DIK_6];
	state->pftl=key[DIK_LEFT];              //Schreibt in die Strucktur wenn die taste Pfeil Links gedrückt wird.
	state->pftr=key[DIK_RIGHT];
	state->pftu=key[DIK_UP];
	state->pftd=key[DIK_DOWN];
	return 1;
}
Das ist ein Bsp. aus meinem Ego-Shooter.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten