2016-12-05 74 views
1

我正在嘗試編寫一個簡單的鍵盤記錄,它將檢查輸入的黑名單中的單詞,並在單詞被觸發時觸發屏幕截圖。這是因爲我們有一個新的預防議程,我們必須在英國學校中使用,以捕捉任何可能的極端主義觀點。鍵盤記錄API和轉換爲字符串

我已經從https://github.com/fabriciorissetto/KeystrokeAPI

看鍵盤記錄API我用下面的代碼的測試,但我想要的字符添加到字符串,所以我可以再火用的比較用戶按下空格鍵時的單詞列表。我遇到的麻煩是我無法將字符轉換爲字符串。是否有可能這樣做,以便我可以將它附加到另一個字符串a,同時等待空格鍵?

class Program 
{ 
    static void Main(string[] args) 
{ 
    using (var api = new KeystrokeAPI()) 
    { 
     api.CreateKeyboardHook((character) => { Console.Write(character); }); 
     Application.Run(); 
    } 
} 
} 

這是我到目前爲止,我得到的錯誤是在if語句轉換字符的字符串。

static void Main(string[] args) 
    { 

     string line = ""; 

     using (var api = new KeystrokeAPI()) 
     {        
      api.CreateKeyboardHook((character) => { 

       line += character.ToString(); 

       if (character.ToString() = "space") 
       { 
        Console.Write("Spacebar Hit"); 
       } 

       Console.Write(character.KeyCode); 

      }); 


      Application.Run(); 
     } 

    } 
+1

還有什麼你試過到目前爲止,任何諸如追加字符到一個數組,或者只要串聯到一個字符串作爲按鍵不等於空格鍵,然後執行你的比較? – ColinM

+2

您可以按枚舉比較鍵,而不是空格。 'if(character.KeyCode = KeyCode.Space)' – ColinM

+0

我在下面添加了一個答案。 – CathalMF

回答

0

你可以使用StringBuilder作爲緩衝?

像這樣

var buffer = new StringBuilder(); 

using (var api = new KeystrokeAPI()) 
{ 
    api.CreateKeyboardHook((character) => { 
     if (character.ToString() == " ") 
     { 
      //check the word 
      CallSomeMethodToCheckWord(buffer.ToString()); 

      //reset the buffer 
      buffer = new StringBuilder(); 
     } 
     else 
     { 
      //ToString returns special characters in it, so you could append here and parse later, or parse here. 
      buffer.Append(character.ToString()); 
     } 
    }); 
    Application.Run(); 
} 
+0

我得到的問題與我在原始代碼中得到的問題相同。不能隱式地將類型'char'轉換爲'Keystroke.API.CallbackObjects.KeyPressed'\t KeyLogger – Nathan

+1

好的,我看到發生了什麼。 'CreateKeyboardHook'有一個使用'KeyPressed'的參數。在他們的例子中,character是一個KeyPressed對象,而不是char。你很幸運,因爲該對象有一個方法[ToString()](https://github.com/fabriciorissetto/KeystrokeAPI/blob/master/Keystroke.API/Entities/CallbackObjects/KeyPressed.cs)應該給你一個按下字符的字符串。請記住,對於特殊鍵,它將具有您需要解析的之類的內容。編輯上面的代碼來展示這一點。 – Josh

1

編輯。 我重寫了這個。 捕獲兩種存儲空間,並輸入命令

static void Main(string[] args) 
{ 
    string line = string.Empty; 

    using (var api = new KeystrokeAPI()) 
    { 
     api.CreateKeyboardHook((character) => { 

      if (character.KeyCode.ToString() == "Space" || character.KeyCode.ToString() == "Return") 
      { 
       if(BannedWordsCheck(line)) 
       { 
        Console.WriteLine("Banned Word Typed: " + line); 
       } 

       line = string.Empty; 
      } 
      else 
      { 
       line += character.KeyCode.ToString(); 
      } 
     }); 

     Application.Run(); 
    } 
} 

static bool BannedWordsCheck(string word) 
{ 
    if(word.ToLower().Contains("terror")) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
1

您在代碼中收到的錯誤是由於以下行 if (character.ToString() = "space")

您正在嘗試「空間」來分配字符串文本character.ToString(),我也在我的評論中有這個錯誤,我不能再編輯了。

這裏有一個片段,將檢查重點代碼對枚舉而不是字符串,它會再調用HandleComparison方法,如果空間被按下,然後清除掉StringBuilder

我發現這裏是唯一的問題按Shift鍵會在字符串的前面加上<shift>,所以一些額外的邏輯必須應用於操作鍵,但這是讓您開始使用有效代碼示例的基礎。

我希望這會有所幫助。

class Program 
{ 
    private static StringBuilder builder; 
    static void Main(string[] args) 
    { 
     using (var api = new KeystrokeAPI()) 
     { 
      builder = new StringBuilder(); 
      api.CreateKeyboardHook(HandleKeyPress); 
      Application.Run(); 
     } 
    } 

    private static void HandleKeyPress(KeyPressed obj) 
    { 
     // To be more reliable, lets use the KeyCode enum instead 
     if (obj.KeyCode == KeyCode.Space) 
     { 
      // Spacebar was pressed, let's check the word and flush the StringBuilder 
      HandleComparison(builder.ToString()); 
      builder.Clear(); 

      return; 
     } 
     // Space wasn't pressed, let's add the word to the StringBuilder 
     builder.Append(obj); 
    } 
    // Handle comparison logic here, I.E check word if exists on blacklist 
    private static void HandleComparison(string compareString) 
    { 
     Console.WriteLine(compareString); 
    } 
}