Hallo
Ich versuche gerade Windows beizubringen, dass es bei jedem Tastendruck, egal ob meine Anwendung den Fokus hat oder nicht, eine Methode meines Java-Programms aufruft. Um dies zu realisieren, ruft meine Java-Anwendung beim Start die Methode
in meiner selbstgeschriebenen DLL (der C-Code befindet sich ein Stück weiter unten) auf, die die Methode
als Keyboard-Callback registriert. Soweit funktioniert alles und die
wird auch bei jedem Tastendruck aufgerufen. Mein Problem ist, dass ich in
nicht auf die JVM zugreifen kann. Jeder Aufruf über den javaVm-Pointer schlägt fehlt und auch
gibt 0 gefundene VMs (nVMs) zurück :-(
Ermittelt man in der Methode "Java_autopilot_KeyboardHook_start" mit JNI_GetCreatedJavaVMs(...) die verfügbaren VMs, dann bekommt man die eine existierende zurückgegeben.
Habt Ihr eine Idee, wieso die VM für die Keyboard-Callback-Methode nicht existiert ?
Danke
Thomas
Ich versuche gerade Windows beizubringen, dass es bei jedem Tastendruck, egal ob meine Anwendung den Fokus hat oder nicht, eine Methode meines Java-Programms aufruft. Um dies zu realisieren, ruft meine Java-Anwendung beim Start die Methode
Code:
Java_autopilot_KeyboardHook_start
Code:
KeyboardProc
Code:
KeyboardProc
Code:
KeyboardProc
Code:
JNI_GetCreatedJavaVMs
Ermittelt man in der Methode "Java_autopilot_KeyboardHook_start" mit JNI_GetCreatedJavaVMs(...) die verfügbaren VMs, dann bekommt man die eine existierende zurückgegeben.
Habt Ihr eine Idee, wieso die VM für die Keyboard-Callback-Methode nicht existiert ?
Danke
Thomas
Code:
#pragma data_seg("myJVM")
JavaVM* javaVm = NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:myJVM,RWS")
JNIEXPORT jint JNICALL JNI_OnLoad( JavaVM *vm, void *pvt ) {
javaVm = vm;
printf("JNI_OnLoad(): javaVm = %X\n", javaVm);
return JNI_VERSION_1_2;
}
JNIEXPORT void JNICALL Java_autopilot_KeyboardHook_start(JNIEnv* env, jobject obj) {
HHOOK hook;
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, dllInst, 0);
if (hook == NULL) {
printf("hookErr = %d\n", GetLastError());
} else {
Sleep(5000);
UnhookWindowsHookEx(hook);
}
}
extern "C" __declspec (dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
FILE* file;
char* buffer = new char[255];
jint result = 4711;
JNIEnv* env;
jsize nVMs = 4711;
JavaVM * vmBuf;
fopen_s(&file, "C://hook.txt", "a");
sprintf_s(buffer, 255, "w = %10X l = %10X vm = %X\n", wParam, lParam, javaVm);
fputs(buffer, file);
result = JNI_GetCreatedJavaVMs(&vmBuf, 1, &nVMs);
sprintf_s(buffer, 255, "JNI_GetCreatedJavaVMs: result = %X nVMs = %X\n", result, nVMs);
fputs(buffer, file);
result = javaVm->AttachCurrentThreadAsDaemon((void**)&env, NULL);
sprintf_s(buffer, 255, "AttachCurrentThreadAsDaemon: result = %d\n", result);
fputs(buffer, file);
fclose(file);
return CallNextHookEx(NULL, code, wParam, lParam);
}