2011-08-10 3 views
1

키보드의 경우 키보드 입력을 캡처하는 데 사용하고 있습니다. JIntellitypeJava에서 마우스를 클릭하여 단축키로 사용 하시겠습니까?

매우 잘 작동하지만 마우스 이벤트 (구체적으로 클릭)를 캡처하여이를 전역 "단축키"로 사용하고 싶습니다.

플랫폼은 Windows 전용이며 언어는 Java입니다. 나는 멋진 자바 패키지를 선호하고 JNI/JNA 호출이나 Win32 직접 사용하지 않기를 바란다. (좋은 wrapper에 있다면 괜찮을 것이다.)

+0

어떻게 단축키로 마우스 이벤트를 사용합니까? 또한 마치 글로벌 마우스 수신기를 원하는 것처럼 보이고 Java가이 도구를위한 최상의 도구가 아닐 수도 있습니다. 대신이 응용 프로그램은 Windows 응용 프로그램이므로 [AutoIt v3] (http://www.autoitscript.com/site/)을 사용해보십시오. –

+0

첫 번째 질문에 답하십시오. 메모장에서 왼쪽 버튼을 클릭하면 메뉴가 표시됩니다. 하지만 내 왼쪽 클릭에 핫키가 필요하다고 해. 나는 클릭을 떠났고, 그것은 메뉴와 마코 (maco)를 가져와 자동 스크롤을하고 '붙여 넣기'를 선택한다. 이것은 간단한 예이지만 많은 가능성이 있습니다. autoit에 관해서는, 우리는 그것을 사용합니다; 그러나 그것은 가장 성가시다. 다른 언어와 관련하여 네가 아마 맞을 것이다. 이 언어에는 아마도 더 우수한 언어가있을 것입니다. 그러나 저는 기존의 많은 라이브러리를 사용하고 선호하는 언어를 사용하고 있습니다. – user697111

+0

AutoIt은 GUI를 만드는 데 성가 시며 끔찍한 데 동의합니다.하지만 아주 작은 유틸리티를 만드는 데는 좋으며, Java GUI에서이 유틸리티를 호출하는 데 성공했습니다. –

답변

4

JNA를 사용하려는 경우 다음 코드와 비슷한 것을 사용할 수 있습니다.

JNA 3.3.0 및 JNA 플랫폼 JAR을 사용합니다.

자세한 내용은 LowLevelMouseProc 함수 here 및 마우스 이벤트 here에서 확인하십시오.

MouseHook.java :

package jnatest; 

import jnatest.WinUserX.LowLevelMouseProc; 
import jnatest.WinUserX.MSLLHOOKSTRUCT; 

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; 
import com.sun.jna.platform.win32.WinUser.HHOOK; 
import com.sun.jna.platform.win32.WinUser.MSG; 

public class MouseHook 
{ 
    private static volatile boolean quit; 
    private static HHOOK hhk; 
    private static LowLevelMouseProc mouseHook; 

    public static void main(String[] args) 
    { 
     System.out.println("Press middle button to quit."); 
     final User32 lib = User32.INSTANCE; 
     HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); 
     mouseHook = new LowLevelMouseProc() 
     { 
      public LRESULT callback(int nCode, WPARAM wParam, MSLLHOOKSTRUCT info) 
      { 
       if (nCode >= 0) 
       { 
        switch (wParam.intValue()) 
        { 
         case WinUserX.WM_LBUTTONDOWN: 
          System.out.println("Left button click at " + info.pt.x + ", " + info.pt.y); 
          break; 
         case WinUserX.WM_LBUTTONUP: 
          System.out.println("Left button release."); 
          break; 
         case WinUserX.WM_MBUTTONDOWN: 
          System.out.println("Middle button."); 
          quit = true; 
          break; 
        } 
       } 
       return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); 
      } 
     }; 
     hhk = lib.SetWindowsHookEx(WinUser.WH_MOUSE_LL, mouseHook, hMod, 0); 
     new Thread() 
     { 
      public void run() 
      { 
       while (!quit) 
       { 
        try { Thread.sleep(10); } catch(InterruptedException e) { } 
       } 
       System.err.println("unhook and exit"); 
       lib.UnhookWindowsHookEx(hhk); 
       System.exit(0); 
      } 
     }.start(); 

     // This bit never returns from GetMessage 
     int result; 
     MSG msg = new MSG(); 
     while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) 
     { 
      if (result == -1) 
      { 
       System.err.println("error in get message"); 
       break; 
      } 
      else 
      { 
       System.err.println("got message"); 
       lib.TranslateMessage(msg); 
       lib.DispatchMessage(msg); 
      } 
     } 
     lib.UnhookWindowsHookEx(hhk); 
    } 
}   

WinUserX.java :

package jnatest; 

import com.sun.jna.Structure; 
import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR; 
import com.sun.jna.platform.win32.WinDef.LRESULT; 
import com.sun.jna.platform.win32.WinDef.WPARAM; 
import com.sun.jna.platform.win32.WinUser; 

public interface WinUserX extends WinUser 
{ 
    public int WM_LBUTTONDOWN = 0x0201; 
    public int WM_LBUTTONUP = 0x0202; 
    public int WM_MOUSEMOVE = 0x0200; 
    public int WM_MOUSEWHEEL = 0x020A; 
    public int WM_MOUSEHWHEEL = 0x020E; 
    public int WM_RBUTTONDOWN = 0x0204; 
    public int WM_RBUTTONUP = 0x0205; 
    public int WM_MBUTTONDOWN = 0x0207; 

    public interface LowLevelMouseProc extends HOOKPROC 
    { 
     LRESULT callback(int nCode, WPARAM wParam, MSLLHOOKSTRUCT lParam); 
    } 

    public class MSLLHOOKSTRUCT extends Structure 
    { 
     public POINT pt; 
     public int mouseData; 
     public int flags; 
     public int time; 
     public ULONG_PTR dwExtraInfo; 
    } 
} 
관련 문제