<p><p>import com.sun.jna.examples.win32.Kernel32;</p><p>import com.sun.jna.examples.win32.User32;</p><p>import com.sun.jna.examples.win32.User32.HHOOK;</p><p>import com.sun.jna.examples.win32.User32.KBDLLHOOKSTRUCT;</p><p>import com.sun.jna.examples.win32.User32.LowLevelKeyboardProc;</p><p>import com.sun.jna.examples.win32.User32.MSG;</p><p>import com.sun.jna.examples.win32.W32API.HMODULE;</p><p>import com.sun.jna.examples.win32.W32API.LRESULT;</p><p>import com.sun.jna.examples.win32.W32API.WPARAM;</p><p><br></p><p>public class Dlltest extends Thread{</p><p><br></p><p><span class="Apple-tab-span" style="white-space:pre"> </span>private static volatile boolean quit = false;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>private static HHOOK hhk;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>private static LowLevelKeyboardProc keyboardHook;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>int WH_KEYBOARD_LL = 13;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span></p><p><span class="Apple-tab-span" style="white-space:pre"> </span>public Dlltest() {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>new Thread(this).start();</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>@Override</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>public void run() {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>// TODO 자동 생성된 메소드 스텁</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>super.run();</p><p><span class="Apple-tab-span" style="white-space:pre"> </span></p><p><span class="Apple-tab-span" style="white-space:pre"> </span>final User32 lib = User32.INSTANCE; </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>keyboardHook = new LowLevelKeyboardProc() {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>public LRESULT callback(int nCode, WPARAM wParam,</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>KBDLLHOOKSTRUCT info) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>if (nCode >= 0) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>test.area.setText("in callback, key=" + info.vkCode);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span></p><p><span class="Apple-tab-span" style="white-space:pre"> </span>System.err.println("in callback, key=" + info.vkCode);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>if (info.vkCode == 81) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>quit = true;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>};</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>hhk = lib.SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, hMod,0);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>System.out.println("Keyboard hook installed, type anywhere, 'q' to quit");</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>new Thread() {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>public void run() {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>while (!quit) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>try {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>Thread.sleep(10);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>} catch (Exception e) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>System.err.println("unhook and exit");</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>lib.UnhookWindowsHookEx(hhk);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>System.exit(0); </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}.start();</p><p><br></p><p><span class="Apple-tab-span" style="white-space:pre"> </span>// This bit never returns from GetMessage</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>int result;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>MSG msg = new MSG(); </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span></p><p><span class="Apple-tab-span" style="white-space:pre"> </span>if (result == -1) {</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>System.err.println("error in get message");</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>break;</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>} else { </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>System.err.println("got message"); </p><p><span class="Apple-tab-span" style="white-space:pre"> </span>lib.TranslateMessage(msg);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>lib.DispatchMessage(msg);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>System.out.println(result);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>lib.UnhookWindowsHookEx(hhk);</p><p><span class="Apple-tab-span" style="white-space:pre"> </span>}</p><p><br></p><p><span class="Apple-tab-span" style="white-space:pre"> </span></p><p>}</p><p><br></p><p>//============================================</p><p><br></p><p>JNA 를 사용한 java 에서 키보드 전역 후킹 </p></p>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.