2016-12-05 2 views
1

Я пытаюсь написать простой кейлоггер, который проверяет введенные слова против черного списка и запускает скриншот при запуске слова. Это связано с тем, что у нас есть новая программа PREVENT, которую мы должны использовать в школах Великобритании, чтобы охватить любые возможные экстремистские взгляды.API Keylogger и преобразование в строку

Я смотрел на API Keylogger из https://github.com/fabriciorissetto/KeystrokeAPI

Я использую следующий код в качестве теста, но я пытаюсь добавить символы в строку, так что я могу затем огонь сравнения с список слов, когда пользователь нажимает клавишу пробела. У меня проблема в том, что я не могу преобразовать символ в строку. Возможно ли это сделать, поэтому я могу добавить его в другую строку, ожидая клавишу пробела?

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

Это то, что я до сих пор, ошибка я получаю на, если оператор преобразования символа в строку.

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

Что еще вы пробовали до сих пор, ничего такого, как прилагая символы в массив, или конкатенации к строке, пока нажата клавиша не равна Spacebar, а затем выполняет ваше сравнение? – 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». В их примере символ - это объект KeyPressed, а не символ. Вам повезло, потому что у этого объекта есть метод [ToString()] (https://github.com/fabriciorissetto/KeystrokeAPI/blob/master/Keystroke.API/Entities/CallbackObjects/KeyPressed.cs), который должен дать вам строка с нажатым символом. Имейте в виду, что для специальных клавиш у него будет что-то вроде , что вам нужно будет разобрать. Редактирование кода выше, чтобы показать это. – Josh

1

Edit. Я переписал это. захватывает оба пространства и вводить команды

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 если Space была нажата, а затем зачистить 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); 
    } 
} 
Смежные вопросы