Короче говоря:
В последней итерации
for(int i = 0; i<=name.length; i++) {
i
будет равно name.length
, что является незаконным индексом, так как индексы массива равны нулю, основанный.
Ваш код должен читать
for(int i = 0; i < name.length; i++)
^
В этом сообщении блога есть инструкции: http://zairon.wordpress.com/2006/12/06/any-application-defined-hook-procedure-on-my-machine/
Нет. Вам, вероятно, придется подключиться к самой SetWindowsHookEx (), чтобы обнаружить это.
Я не думаю, что вы можете, нет функции GetWindowsHook, которая возвращала бы хук (ы). Кроме того, у меня сложилось впечатление, что основная процедура обработки клавиатуры подключается через SetWindowsHookEx (), поэтому даже если ловушек нет, есть по крайней мере одна, сама Windows.
Это во многом зависит от того, на каком уровне абстракции вы получаете нажатия клавиш.
Для максимального обнаружения вы можете использовать аппаратное обеспечение напрямую или пойти как можно ниже (некоторые крючки работают на уровне драйверов HW).
В целях безопасности вы также можете использовать виртуальную клавиатуру - крючки должны быть направлены специально на ваше приложение, чтобы имитировать нажатие клавиш.