2015-11-29 69 views
2

我想在C++中製作一個簡單的鍵盤記錄程序(僅供學習),並且它不太適合我的工作方式。我的目標是讓它寫入一個txt。下面的代碼我到目前爲止:C++ Keylog無法正常工作

#include <iostream> 
#include <fstream> 
#include <conio.h> 
#define LOG(x) logger << x; 

int main() 
{ 
    using std::ofstream; 
    using std::fstream; 

    ofstream logger("logger.txt", fstream::app); 

    char ascii; 
    bool typing; 

    for(;;) 
    { 
     if(_kbhit()) 
     { 
      typing = true; 
      ascii = getch(); 
      while(typing == true) //tried 'if', doesn't work 
      { 
       LOG(ascii); 
       std::cout << ascii << std::endl; 
       //typing = false; 
       //break 
       //tried using the above two and didn't work 
      } 
     } 
     else typing = false; 
    } 

    logger.close(); 
} 

當我做while(typing == true)連續,即連續按下這個鍵纔會打印出來,但至少它實際上被保存到TXT。當我嘗試在一次鍵盤單擊後停止循環時,沒有任何內容保存到txt中。

那麼我做錯了什麼?謝謝你的幫助!

+0

由於我的編譯器和它的工作原理,我使用了你的註釋代碼,並且只爲'_getch'切換'getch',不知道你的問題是什麼。 –

+0

嗯...仍然不適合我。我無法保存一個角色,但程序會直接退出。 –

+0

在Windows上,我遇到了與@ArchieGertsman相同的問題。另外,我不喜歡你的'#define LOG(x)'。請使用一個函數,或者寫下你的意思,讓你的代碼更清晰。預處理器只能在必要時使用。 – Cebtenzzre

回答

2

變量typing從不設置爲false,所以它保持爲真,並且循環繼續。下面的代碼工作:

#include <fstream> 
#include <conio.h> 

int main() 
{ 
    std::ofstream logger("logger.txt", std::fstream::app); 

    for(char ascii; ascii != 3;) 
    { 
     ascii = getche(); 
     logger << ascii; 
    } 

    return 0; 
} 

getche()打印輸入的字符,並3Ctrl+C的ASCII碼。這會記錄所有字符,甚至是不可打印的字符。

您的代碼需要注意幾點:

  • 不要改變做什麼用的東西,除非你正在替換大量的代碼,並經常使用它,宏(#define)或計劃。

  • 您可以在不需要的地方使用循環和變量。 getch及相關功能等待輸入。

  • logger.close()logger超出範圍並被銷燬時自動完成。

  • return 0應該在main的末尾。這不是必需的,但是它被用來返回到操作系統和return 0,雖然自動放入,但爲清晰起見,這很重要。

  • 我個人不會用using聲明。只需寫出名稱空間,它有助於避免衝突。這就是它在命名空間中的原因。

+0

這也不適用於我,因爲我的電腦正在發送中止消息。 –

+0

@ArchieGertsman即使使用正常的編譯器選項,這對我也適用。這是有效的代碼。也許'getche'搞亂了你的電腦。嘗試替換'getch'。 – Cebtenzzre