【发布时间】:2012-05-24 04:29:58
【问题描述】:
以下java 程序调用C 中的本机方法,如果用户按下某个键,该方法应打印一条消息you pressed a key !。但是当我按下键时我看不到消息。我还检查函数SetWindowsHookEx是否返回null,但不是,它不返回null。
Java 代码:
package keylogger;
public class TestKeys {
private native void setWinHook();
public static void main(String args[]) {
TestKeys o = new TestKeys();
try {
o.setWinHook();
Thread.sleep(10000);
} catch(Exception exc) {
exc.printStackTrace();
}
}
static {
System.loadLibrary("MyHook");
}
} C 代码:
#include <stdio.h>
#include <windows.h>
#include <w32api.h>
#include "keylogger_TestKeys.h"
static HHOOK handleKeyboardHook = NULL;
HINSTANCE hInst = NULL;
static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
printf("You pressed a key !\n");
return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
}
void Java_keylogger_TestKeys_setWinHook
(JNIEnv *env, jobject obj) {
hInst = GetModuleHandle(NULL); // include or exclude,i don't see the result
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,NULL, 0);
if(handleKeyboardHook==NULL) {
printf("Is Null");
} else {
printf("Is not Null");
}
printf("Inside fucntion setWinHook !");
}
/*int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
printf("Hello World !");
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
if(handleKeyboardHook==NULL) {
printf("Is Null");
} else {
printf("Is not Null");
}
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}*/
我看到的唯一输出是 Is not NullInside fucntion setWinHook !
问题出在哪里?
我应该怎么做才能让这个程序在我按下键时返回消息。
我看到的唯一输出是:Inside function setWinHook !
注意:
如果上面的程序在别人的机器上运行,请注明。
输出图片:
我在按键时没有看到任何消息。程序仅在 10 秒后退出而不显示消息。
【问题讨论】:
-
在
printf().之后尝试fflush(stdout); -
见stackoverflow.com/questions/3078646/…。它会解决你的键盘钩子问题,虽然它不会解决你的“为什么我在运行 Java 程序时没有得到本机控制台输出”的问题。
-
顺便说一句,您确实需要自己的 GetMessage/PeekMessage 循环才能运行键盘挂钩(参见我上面给出的示例)。
-
@technomage 绝对.. jna 是在这种情况下要走的路!我认为您应该将其发布为答案...
标签: java c winapi java-native-interface keylogger