Как создать глобальный хук WH_GETMESSAGE с JNA? - PullRequest
0 голосов
/ 21 декабря 2011

вот мой код для тестирования ловушки, но метод обратного вызова никогда не вызывается. Я попытался создать класс MSGSTRUCT, расширяющий структуру (все еще не работает), но я обнаружил, что у jna уже есть класс MSG, поэтому я использовал его вместо этого.

Может кто-нибудь сказать мне правильный способ сделать это?

import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.HOOKPROC;
import com.sun.jna.platform.win32.WinUser.MSG;

public class GetMsgHookTest {

    public static final int WH_GETMESSAGE = 3;
    static HHOOK msgHook;   
    static HOOKPROC msgProc;

    public static void main(String[] args) {

        msgProc = new GetMsgProc() {

            @Override
            public LRESULT callback(int nCode, WPARAM wParam, MSG lParam) {
                System.out.println("get msg");
                return User32.INSTANCE.CallNextHookEx(msgHook, nCode, wParam, lParam.getPointer());
            }
        };

        HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
        msgHook = User32.INSTANCE.SetWindowsHookEx(WH_GETMESSAGE, msgProc, hMod, 0);

        MSG msg = new MSG();
        while (User32.INSTANCE.GetMessage(msg, null, 0, 0) != 0) {
            User32.INSTANCE.TranslateMessage(msg);
            User32.INSTANCE.DispatchMessage(msg);       
        }

        User32.INSTANCE.UnhookWindowsHookEx(msgHook);
    }

    public static interface GetMsgProc extends HOOKPROC {
        LRESULT callback(int nCode, WPARAM wParam, MSG lParam);
    }

}
...