まず、次のようなマネージャー クラスを定義する必要があります。
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
、VM args で指定します。
すべてのキーストロークをログに記録する方法については、OS は通常、キーイベントをインターセプトするためのいくつかの API を提供しています。Windows システムでは、グローバル キー メッセージをインターセプトすることでこれを実現できます。他のシステムでの経験はありません。とにかく、静かな低レベルである適切な割り込みを設定できます。いつでも答えをググることができます。:)