Сначала вы должны определить класс менеджера, например:
package foo.bar
public class SomeHookManager {
public static void initialize (...) {
// <pre-initialization-routing>
_native_init_();
// <post-initialization-routing>
}
public static void registerCallback (IHookCallback callback)
{ /* save this callback */ }
// this method will be invoked in your C code.
protected static void invokeCallback () { /* invoke the saved callback */ }
// this is a native method, the native modifier tells the compiler this method
// is implemented in C, and linked at runtime.
protected native static void _native_init_ ();
}
Затем используйте javah
для генерации заголовка C, в результате получается что-то вроде ( Я не сделалфактически скомпилируйте этот код, так что это гипотетически ):
/*
* Class: Win32
* Method: _native_init_
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_foo_bar_Win32_native_init_
(JNIEnv * env, jobject obj);
Создайте проект C, включите этот файл и реализуйте этот метод.Убедитесь, что при срабатывании фактического перехвата вызовите invokeCallback
в своем коде C:
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mId = (*env)->GetStaticMethodID(env, cls, "invokeCallback", "()V");
if (mId == 0) { /* error handling */ }
(*env)->CallStaticVoidMethod(env, cls, mId);
Скомпилируйте проект C в файл DLL, скажем hookimpl_win32.dll
, и динамически скомпонуйте его где-нибудь в своем коде Java:
static {
System.loadLibrary("hookimpl_win32"); // no need of .dll or .so in Unix alike OS's
}
Убедитесь, что dll находится в той же папке, что и ваш jar.Или укажите -Djava.library.path=/path/to/your/dlls
в аргументах виртуальной машины.
Что касается того, как вы можете регистрировать каждое нажатие клавиши, ОС обычно предоставляет некоторые API для перехвата ключевого события.Для систем Windows вы можете достичь этого, перехватывая сообщения глобального ключа.У меня нет никакого опыта в других системах.В любом случае, вы можете установить правильные прерывания, что является тихим низким уровнем.Вы всегда можете погуглить свой ответ.:) * * 1021