0

次のプログラムは、ユーザーがキーを押した場合にメッセージをjava出力するネイティブメソッドを呼び出します。しかし、キーを押すとメッセージが表示されません。関数がnullを返すかどうかも確認しますが、nullは返されません。Cyou pressed a key !SetWindowsHookEx

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;
}*/

私が見る唯一の出力は、NullInside関数setWinHookではありません!

問題はどこだ ?

キーを押したときにこのプログラムがメッセージを返すようにするにはどうすればよいですか。私が見る唯一の出力は:Inside function setWinHook !

ノート :

上記のプログラムが誰かのマシンで実行されている場合は、そのことを伝えてください。

出力写真:

ここに画像の説明を入力してください

キーをタップしてもメッセージが表示されません。プログラムはメッセージを表示せずに10秒後に終了します。

4

5 に答える 5

3

単純にローカルの HINSTANCE 変数を突然宣言して、それを関数に渡すことはできません。HINSTANCE は、アプリケーション インスタンスへのハンドルです。つまり、有効な場所を指している必要があるポインターです。独自のアプリケーションである HINSTANCE を使用する必要があります。

私の Windows API は少しさびていますが、GetModuleHandle() を介してこれを行うことができると思います。そう:

void Java_keylogger_TestKeys_setWinHook
     (JNIEnv *env, jobject obj) {
   HINSTANCE hInst;
   hInst = GetModuleHandle(null);
   handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInst, 0);
   printf("Inside function setWinHook !");
 }

また、Java goo が HINSTANCE をオブジェクトのどこかに隠している可能性も十分にあります。

于 2012-05-24T07:59:36.280 に答える
0

GetMessage/PeekMessageキーボード フックがイベントを受け取るには、ループが必要です。Windowsでのキーボード フックの Java 実装については、JNA Keyboard Hook in Windowsを参照するか、JNA プロジェクトで同じ機能を実行する提供パッケージ ( https://github.com/twall/jna/tree/master/contrib/ w32keyhook )。

于 2012-05-31T00:25:24.380 に答える
0

HHOOK変数は、共有データ セグメント内で宣言する必要がありますここでどのように行われるかを確認してください - http://www.codeproject.com/Articles/5002/Mousey-Roll-Over-and-Park

于 2012-05-30T06:15:50.107 に答える
0

Javaグローバル(低レベル)キーボード/マウスフックをチェックしてください

私は自分で書いてみましたが、不明な詳細が多すぎるようです (JNI、HOOKS、スレッドの問題など)。

于 2012-05-24T07:28:15.187 に答える