Захватывать любые нажатия клавиш (например, кейлоггер), желательно c # .net, но подойдет любой - PullRequest
7 голосов
/ 24 июня 2011

Мне нужно захватить все, что я печатаю на своей клавиатуре, а затем сохранить это различными способами.Я бы предпочел, чтобы это было написано на C # для .Net, но все будет хорошо.Мои причины написать этот «кейлоггер» просты:

Недавно я стал владельцем игровой перчатки Peregrine.Это очень крутая вещь, которая позволяет вам давать команды, делая жесты пальцами, и в то же время, это очень тонкая перчатка, так что вы можете печатать этой рукой с небольшим дискомфортом.

Кроме того, я нашел хорошую программу под названием AutoHotkey, которая может серьезно повысить вашу производительность, делая макросы для любого действия.Вы можете привязать любую клавишу к любой другой клавише или серии клавиш или команд.

Проблема в том, что вы не можете сказать это просто так: «это то, что я делаю больше всего» и «это то, что я»м редко использую. "Действительно, можете ли вы сказать, какой ключ вы используете больше, вниз или вниз?Используете ли вы alt + tab чаще, чем escape или переключатель разметки (ctrl-shift или alt-shift)?Я не могу этого сказать.Я не могу сказать, какие действия я должен автоматизировать или переключиться на более простой интерфейс, без статистических данных.

Итак, я хочу написать программу для запуска в фоновом режиме и записывать все, что я печатаю.Затем эта программа будет хранить гистограмму моих действий первого, второго и третьего порядка (например, она будет хранить, сколько раз я нажимал какую-либо одну клавишу, например, ввод, сколько раз я нажимал последовательность из двух клавиш, например, alt и затем tab,и сколько раз я нажимал последовательность из трех клавиш, таких как ctrl, alt и затем удалял или ctrl, shift и затем escape)

Затем, через некоторое время, потраченное на работу / игру / что угодно, я получу информациюо том, какие действия я должен пытаться привязать к этому интерфейсу (перчатке) или автоматизировать с помощью программы AutoHotkey, чтобы повысить скорость взаимодействия с ПК.

Другими словами, простой научный эксперимент, просто для удовольствияи прогресс:)

Ответы [ 2 ]

6 голосов
/ 24 июня 2011

Вам нужен глобальный обработчик клавиатуры.

Если это Windows, вам придется использовать Windows API и использовать следующее:

SetWndowsHookEx

UnhookWindowsHookEx

CallNextHookEx

Вам необходимо настроить глобальный «крючок» для прослушивания событий клавиатуры и мыши.

У меня есть класс C #, который делает это и вызывает событие .Net для клавиатуры и мышиargs, но я не собираюсь публиковать код в Интернете, так как этот вид деятельности может использоваться для гнусных средств.

Почему мы это сделали?Мы встраивали powerpoint в наше приложение, но мы не хотели, чтобы пользователь редактировал слайды powerpoint, просматривая их, поэтому в нашем приложении C # мы установили хук для отслеживания и перехвата событий мыши и клавиатуры, если они находились в элементе управления powerpoint.Отлично работало, но мы должны были убедиться:

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

Вот ссылка API.

http://msdn.microsoft.com/en-us/library/ff468842(v=VS.85).aspx

3 голосов
/ 29 сентября 2015

Старый вопрос, но ...

В Windows вы можете использовать API user32.dll .

Для очень простого кейлоггера вы можете использовать метод GetAsyncKeyState (), проверяющий, нажат ли каждый символ таблицы ASCII.

Весь код для очень простого и глупого кейлоггера, написанного в Консольном приложении , будет:

[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(Int32 i);

static void Main(string[] args)
{
    while (true)
    {
        Thread.Sleep(100);

        for (int i = 0; i < 255; i++)
        {
            int keyState = GetAsyncKeyState(i);
            if (keyState == 1 || keyState == -32767)
            {
                Console.WriteLine((Keys)i);
                break;
            }
        }
    }

KeystrokeAPI

Для тех, кто ищет что-то более надежное и чистое, я создал API, который облегчает эту задачу. Вам нужно только сделать это:

api.CreateKeyboardHook((character) => { Console.Write(character); });

Подробнее здесь: https://github.com/fabriciorissetto/KeystrokeAPI

...