Как я могу преобразовать некоторые нажатия клавиш в другие нажатия клавиш? - PullRequest
3 голосов
/ 10 октября 2009

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

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

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

Я нашел статью Стивена Туба о регистрации ключей, и я думаю, что она послужит хорошим началом для создания этого * tool. Есть ли лучшая альтернатива перехвату всех нажатых в системе клавиш, чем SetWindowsHookEx? Будет ли код помечен антивирусом как подозрительная программа? Если да, могу ли я использовать что-либо еще, чтобы не быть помеченным антивирусом? Требуются ли права администратора?

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

РЕДАКТИРОВАТЬ: я добавил награду, меня интересуют некоторые методы для захвата нажатий клавиш (я не интересуюсь перехватом низкого уровня или продвинутыми вещами - базовые хорошо), в основном названия методов и некоторые ссылки на документация. Я также хотел бы знать, появятся ли они как вредоносные программы для антивируса.

Ответы [ 4 ]

2 голосов
/ 23 октября 2009

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

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;
    }
2 голосов
/ 22 октября 2009

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

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

2 голосов
/ 10 октября 2009

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

1 голос
/ 10 октября 2009

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

...