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;
}
}
어떻게 단축키로 마우스 이벤트를 사용합니까? 또한 마치 글로벌 마우스 수신기를 원하는 것처럼 보이고 Java가이 도구를위한 최상의 도구가 아닐 수도 있습니다. 대신이 응용 프로그램은 Windows 응용 프로그램이므로 [AutoIt v3] (http://www.autoitscript.com/site/)을 사용해보십시오. –
첫 번째 질문에 답하십시오. 메모장에서 왼쪽 버튼을 클릭하면 메뉴가 표시됩니다. 하지만 내 왼쪽 클릭에 핫키가 필요하다고 해. 나는 클릭을 떠났고, 그것은 메뉴와 마코 (maco)를 가져와 자동 스크롤을하고 '붙여 넣기'를 선택한다. 이것은 간단한 예이지만 많은 가능성이 있습니다. autoit에 관해서는, 우리는 그것을 사용합니다; 그러나 그것은 가장 성가시다. 다른 언어와 관련하여 네가 아마 맞을 것이다. 이 언어에는 아마도 더 우수한 언어가있을 것입니다. 그러나 저는 기존의 많은 라이브러리를 사용하고 선호하는 언어를 사용하고 있습니다. – user697111
AutoIt은 GUI를 만드는 데 성가 시며 끔찍한 데 동의합니다.하지만 아주 작은 유틸리티를 만드는 데는 좋으며, Java GUI에서이 유틸리티를 호출하는 데 성공했습니다. –