Я могу изменить ввод с клавиатуры пользователя?

Я нашел этот код захвата клавиатуры, который я пытаюсь немного изменить в своих целях: http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx

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

Соответствующий метод, который я изменил теперь, похож:

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            //The truely typed character:
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);

            KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
            replacementKey.vkCode = 90; // char 'Z'
            Marshal.StructureToPtr(replacementKey, lParam, false);

            //Now changed to my set character
            vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

Консоль правильно производит это как:

E
Z
T
Z
G
Z
etc.

ОДНАКО в приложении фокуса все еще вводит 'E' вместо 'Z'. Почему? Я изменил крючковатый ввод с клавиатуры для содержания 'Z' вместо 'E', и консольные строки показывают, что он был изменен правильно!

Насколько я понимаю, вызов return CallNextHookEx(_hookID, nCode, wParam, lParam); то, что отправляет "печать это теперь" команда к открытому приложению. Это не, как это работает? Есть ли что-то, что это препятствует тому, чтобы я ввел символ, который я хочу? Я знаю, что приложения как AutoHotkey берут входной ключ, проверяют его и возвращают другой символ. Как я делаю то же здесь?

Спасибо!

8
задан cksubs 14 January 2010 в 20:39
поделиться

2 ответа

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

Затем я использовал SENDINPUT , чтобы отправить новый ключ, который я хотел «ввести».

Так что в основном это работает так:

  • Процедура крюка Указывает нажатие целевой клавиши
  • Вызов для SendInput, с новой клавишей
  • возврат 1 из процедуры крюка, чтобы игнорировать исходную клавишу

Осторожно из циклических перенаправлений, то есть «A» перенаправлено на «B», перенаправленную на «А», он может легко взрываться;)

5
ответ дан 5 December 2019 в 23:15
поделиться

Я согласен с некоторыми другими плакатами здесь, что вы можете попробовать и использовать трюки для работы с .NET Framework вместо того, чтобы пытаться заставить его работать с вами через GC.Collect.

Вы можете найти это видео Channel 9 , в котором обсуждаются способы ослабления давления на сборщик мусора.

-121--3677896-

Поскольку можно попросить сервер добавить префикс к возвращенному объекту JSON. Eg

функция _ префикс (json_object);

in порядок для браузера eval «inline» последовательности JSON в качестве выражения. Этот трюк дает возможность серверу «вводить» javascript-код непосредственно в браузере клиента и это с обходом ограничений «того же происхождения».

Другими словами, возможен междоменный обмен данными .


Как правило, XMLHtterRequest не разрешает междоменный обмен данными напрямую (необходимо пройти через сервер в том же домене), тогда как:

< script src = «some _ other _ domain/some _ data.js & = function _ prefix >» можно получить доступ к данным из домена, отличного от исходного.


Также стоит отметить: несмотря на то, что сервер должен рассматриваться как «доверенный» перед попыткой такого рода «трюка», побочные эффекты возможного изменения формата объекта и т.д. могут быть сдержаны. Если для приема объекта JSON используется префикс функции _ (т.е. соответствующая функция js), то указанная функция может выполнять проверки перед приемом/дальнейшей обработкой возвращенных данных.

-121--1896138-

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

Для того, чтобы установить его «в масштабах всей системы», вам понадобится две части: одна DLL, имеющая «поставщика крючков» и exe, управляющий им. Вот хорошее учебное пособие http://www.codeproject.com/KB/system/hooksys.aspx и вот пример: http://www.codeguru.com/cpp/com-tech/shell/article.php/c4509/

Но: 1. Установка общесистемных крючков может серьезно испортить систему (убедитесь, что вы пересылаете клавиши, которые не переводите). 2. Пожалуйста... не создавать еще один кейлоггер

0
ответ дан 5 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: