Я нашел этот код захвата клавиатуры, который я пытаюсь немного изменить в своих целях: 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 берут входной ключ, проверяют его и возвращают другой символ. Как я делаю то же здесь?
Спасибо!
Я сделал это раньше, но немного отличается.
Вместо того, чтобы пытаться изменить параметры, отправленные в callnexthookex
, я «проглатывал» нажатие клавиши (вы можете сделать это, вернув ненулевое значение из процедуры крюка, чтобы предотвратить звонок последующих процедур).
Затем я использовал SENDINPUT , чтобы отправить новый ключ, который я хотел «ввести».
Так что в основном это работает так:
Осторожно из циклических перенаправлений, то есть «A» перенаправлено на «B», перенаправленную на «А», он может легко взрываться;)
Я согласен с некоторыми другими плакатами здесь, что вы можете попробовать и использовать трюки для работы с .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), то указанная функция может выполнять проверки перед приемом/дальнейшей обработкой возвращенных данных.
Вы, скорее всего, установили крюк «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. Пожалуйста... не создавать еще один кейлоггер