2009-10-10 2 views
3

У меня отличная идея обмануть экзамены. Моя школа использует очень старый IDE, (думаю, Turbo Pascal, Turbo C++ и другие 80-те), и что я хотел бы сделать это:Как я могу преобразовать некоторые нажатия клавиш в другие нажатия клавиш?

  • начать свою программу в фоновом режиме

  • перехватите нажатия клавиш и вместо отправки их непосредственно на экран, я хотел бы прочитать символ из предварительно сконфигурированного текстового файла и отправить его в качестве нажатой клавиши. Таким образом, независимо от того, что вы будете писать, текст из этого файла будет записан на экране.

Я нашел Stephen Toub's статью о ключах лесозаготовок, и я думаю, что это послужит хорошим началом в создании этого «tool». Есть ли лучшая альтернатива перехвату всех нажатых клавиш в системе, чем SetWindowsHookEx? Будет ли код помечен антивирусом как подозрительная программа? Если да, то могу ли я сделать что-нибудь еще для этого, не будучи помеченным антивирусом? Требуются ли права администратора?

Я знаю, что некоторые из вас, ребята, скажут, что если бы я проявил такой же интерес к обучению, как и я, избегая обучения, я бы отлично поработал, но я хотел бы попробовать это.

EDIT: Я добавил щедрость, меня интересуют некоторые методы захвата нажатий клавиш (меня не интересуют низкоуровневые подключения или продвинутые элементы - основные из них прекрасны), в основном имена методов и некоторые ссылки к документации. Я также хотел бы знать, будут ли они появляться как вредоносные программы для антивируса.

+5

Ну, вы, безусловно, откровенно о своих намерениях. Я дам вам это. –

+0

Зачем обманывать? Весь факт, что вы на SO, и у вас есть репутация, которую у вас есть, делает это недействительным. – aviraldg

+1

Я хочу обмануть, потому что учитель понятия не имеет о том, что она говорит. Она научилась тому, чему она учит сейчас около 20 лет назад, и она не примет никаких других альтернатив WORKING для задач, которые нам даны. Только ее. Слово за слово. – Geo

ответ

2

БОГ! Я только что нашел идеальный класс для этого другой день .. мне потребовалось некоторое время, чтобы найти оригинальный источник:

http://www.codeproject.com/KB/cs/globalhook.aspx

я использовал это (и SendKeys) в одиночку именно за то, что вам нужно, вы» Вам нужно будет использовать Handle = true для блокировки исходного сообщения.

SendKeys немного уродливый ... вы можете искать замену, если хотите ... но SendKeys будет работать на вас.

С SendKeys это что-то вроде:

private void HookManager_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.D){ 
      e.Handled = true; 
      SendKeys.Send("F"); 
     } 
    } 

Я на самом деле использовать этот метод, чтобы определить, какие prccess' окно находится в фокусе, так что приложение не будет делать ничего, если вы находитесь на другом приложении:

/// <summary> 
    /// The GetForegroundWindow function returns a handle to the foreground window. 
    /// </summary> 
    [DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 

    static bool IsProcessFocused(string processname) 
    { 
     if (processname == null || processname.Length == 0) 
     { 
      throw new ArgumentNullException("processname"); 
     } 

     Process[] runninProcesses = Process.GetProcessesByName(processname); 
     IntPtr activeWindowHandle = GetForegroundWindow(); 

     foreach (Process process in runninProcesses) 
     { 
      if (process.MainWindowHandle.Equals(activeWindowHandle)) 
      { 
       return true; 
      } 
     } 

     // Process was not found or didn't had the focus. 
     return false; 
    } 
+0

Ссылка, которую вы предоставили было здорово! Я думаю, что это соответствует моим потребностям, спасибо! – Geo

2

SetWindowsHookEx - лучший вариант. Мне сказали, что некоторые антивирусные программы отметят это, но я создал небольшое приложение после его использования и отсканировал его с помощью AVG, который не выдавал никаких вирусных предупреждений.

1

Насколько я могу судить, самым надежным способом для keylog является создание системного прерывания (я думаю, INT17h?), Но это довольно низкий уровень, учитывая, что ваш пост отмечен C#. Идите искать подходящий инструмент ... вы найдете много ...

+0

Я думаю, http://www.codeproject.com/KB/system/KeyHook.aspx должен помочь – aviraldg

2

Не то, чтобы я говорил, что обман - это хорошо, но мы понимаем вашу просьбу. Я не думаю, что это возможно, не попадая в API-перехватчики, поскольку .Net обертывает API WIN32 API, я не думаю, что они обернули методы для того, что вы хотите.

Для полноты, давайте добавим некоторые детали:

К сожалению, вы должны попасть в WIN32 API,: http://msdn.microsoft.com/en-us/library/ms645530(VS.85).aspx

WM_SYSKEYDOWN уведомление может быть использовано для получения ключевых штрихов, но это берет ручку окна, чтобы смотреть, поэтому он будет включать API * GetWindow **, чтобы получить дескриптор окна, которое вы хотите контролировать.

Попробуйте сделать SendInput или keybd_event [http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx] функции для имитации нажатия клавиш.

Google «WIN API Viewer» для утилиты, позволяющей легко находить и просматривать указанные API, существует также версия для кода .Net.

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

Смежные вопросы