Skip to content

Commit e502ea5

Browse files
Dmitry Prokhorovmatthiasblaesing
authored andcommitted
Add LowLevelMouseProc
1 parent 8aed14b commit e502ea5

6 files changed

Lines changed: 87 additions & 16 deletions

File tree

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Features
1515
* [#1246](https://github.com/java-native-access/jna/pull/1246): Improve performance of `c.s.j.Structure#read` and `c.s.j.Structure#write` - [@joerg1985](https://github.com/joerg1985).
1616
* [#1260](https://github.com/java-native-access/jna/pull/1260): Add mapping for X11 generic events - [@lafoletc](https://github.com/lafoletc).
1717
* [#1265](https://github.com/java-native-access/jna/pull/1265): Add mapping for XQueryExtension - [@lafoletc](https://github.com/lafoletc).
18+
* [#1263](https://github.com/java-native-access/jna/pull/1263): Add LowLevelMouseProc - [@nordiakt](https://github.com/nordiakt)
1819

1920
Bug Fixes
2021
---------

contrib/platform/src/com/sun/jna/platform/win32/WinUser.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,10 @@ public interface WNDENUMPROC extends StdCallCallback {
369369
boolean callback(HWND hWnd, Pointer data);
370370
}
371371

372+
public interface LowLevelMouseProc extends HOOKPROC {
373+
LRESULT callback(int nCode, WPARAM wParam, MSLLHOOKSTRUCT lParam);
374+
}
375+
372376
public interface LowLevelKeyboardProc extends HOOKPROC {
373377
LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam);
374378
}
@@ -610,6 +614,15 @@ public CWPSTRUCT(Pointer p) {
610614
*/
611615
int ICON_SMALL2 = 2;
612616

617+
@FieldOrder({"pt", "mouseData", "flags", "time", "dwExtraInfo"})
618+
public class MSLLHOOKSTRUCT extends Structure {
619+
public POINT pt;
620+
public int mouseData;
621+
public int flags;
622+
public int time;
623+
public ULONG_PTR dwExtraInfo;
624+
}
625+
613626
@FieldOrder({"vkCode", "scanCode", "flags", "time", "dwExtraInfo"})
614627
public class KBDLLHOOKSTRUCT extends Structure {
615628
public int vkCode;
@@ -2075,4 +2088,4 @@ public String toString() {
20752088
* Bitmask for the RESERVED2 key modifier.
20762089
*/
20772090
int MODIFIER_RESERVED2_MASK = 32;
2078-
}
2091+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<projectDescription>
3-
<name>w32keyhook</name>
3+
<name>w32windowhooks</name>
44
<comment></comment>
55
<projects>
66
</projects>
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project name="jnacontrib.w32keyhook" default="jar" basedir=".">
3-
<description>Builds, tests, and runs the project jnacontrib.w32keyhook.</description>
2+
<project name="jnacontrib.w32windowhooks" default="jar" basedir=".">
3+
<description>Builds, tests, and runs the project jnacontrib.w32windowhooks.</description>
44
<!-- Locations -->
55
<property name="src" location="."/>
66
<property name="build" location="build"/>
77
<property name="jna-dist" location="../../../dist"/>
88

99
<property name="classes" location="${build}/classes"/>
10-
<property name="jar" location="${build}/demo-w32keyhook.jar"/>
10+
<property name="jar" location="${build}/demo-w32windowhooks.jar"/>
1111
<property name="file.reference.jna.jar" location="../../build/jna.jar"/>
12-
<property name="main-class" value="com.sun.jna.contrib.demo.KeyHook" />
12+
<property name="main-class" value="com.sun.jna.contrib.demo.WindowHooks" />
1313

1414
<path id="classpath">
1515
<fileset file="${file.reference.jna.jar}"/>

contrib/w32keyhook/com/sun/jna/contrib/demo/KeyHook.java renamed to contrib/w32windowhooks/com/sun/jna/contrib/demo/WindowHooks.java

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,32 @@
2626
import com.sun.jna.Pointer;
2727
import com.sun.jna.platform.win32.Kernel32;
2828
import com.sun.jna.platform.win32.User32;
29+
import com.sun.jna.platform.win32.WinDef;
2930
import com.sun.jna.platform.win32.WinDef.HMODULE;
3031
import com.sun.jna.platform.win32.WinDef.LRESULT;
3132
import com.sun.jna.platform.win32.WinDef.WPARAM;
3233
import com.sun.jna.platform.win32.WinDef.LPARAM;
3334
import com.sun.jna.platform.win32.WinUser;
34-
import com.sun.jna.platform.win32.WinUser.HHOOK;
3535
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
3636
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;
3737
import com.sun.jna.platform.win32.WinUser.MSG;
3838

39-
/** Sample implementation of a low-level keyboard hook on W32. */
40-
public class KeyHook {
39+
/** Sample implementation of a low-level window hooks on W32. */
40+
public class WindowHooks {
4141
private static volatile boolean quit;
42-
private static HHOOK hhk;
43-
private static LowLevelKeyboardProc keyboardHook;
42+
43+
private static WinUser.LowLevelMouseProc mouseProc;
44+
private static WinUser.HHOOK mouseHook;
45+
46+
private static WinUser.LowLevelKeyboardProc keyboardProc;
47+
private static WinUser.HHOOK keyboardHook;
4448

4549
public static void main(String[] args) {
4650
final User32 lib = User32.INSTANCE;
51+
4752
HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
48-
keyboardHook = new LowLevelKeyboardProc() {
53+
54+
keyboardProc = new LowLevelKeyboardProc() {
4955
@Override
5056
public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {
5157
if (nCode >= 0) {
@@ -63,19 +69,69 @@ public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {
6369

6470
Pointer ptr = info.getPointer();
6571
long peer = Pointer.nativeValue(ptr);
66-
return lib.CallNextHookEx(hhk, nCode, wParam, new LPARAM(peer));
72+
return lib.CallNextHookEx(keyboardHook, nCode, wParam, new LPARAM(peer));
6773
}
6874
};
69-
hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
75+
keyboardHook = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardProc, hMod, 0);
76+
7077
System.out.println("Keyboard hook installed, type anywhere, 'q' to quit");
78+
79+
mouseProc = new WinUser.LowLevelMouseProc() {
80+
@Override
81+
public LRESULT callback(int nCode, WPARAM wParam, WinUser.MSLLHOOKSTRUCT lParam) {
82+
if (nCode >= 0) {
83+
switch (wParam.intValue()) {
84+
case 512: {
85+
System.out.println("Mouse moved!");
86+
87+
break;
88+
}
89+
case 513: {
90+
System.out.println("Left button down!");
91+
92+
break;
93+
}
94+
case 514: {
95+
System.out.println("Left button up!");
96+
97+
break;
98+
}
99+
case 516: {
100+
System.out.println("Right button down!");
101+
102+
break;
103+
}
104+
case 517: {
105+
System.out.println("Right button up!");
106+
107+
break;
108+
}
109+
case 519: {
110+
System.out.println("Middle button down!");
111+
112+
break;
113+
}
114+
case 520: {
115+
System.out.println("Middle button up!");
116+
117+
break;
118+
}
119+
}
120+
}
121+
return lib.CallNextHookEx(mouseHook, nCode, wParam, new WinDef.LPARAM(Pointer.nativeValue(lParam.getPointer())));
122+
}
123+
};
124+
mouseHook = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_MOUSE_LL, mouseProc, hMod, 0);
125+
71126
new Thread() {
72127
@Override
73128
public void run() {
74129
while (!quit) {
75130
try { Thread.sleep(10); } catch(Exception e) { }
76131
}
77132
System.err.println("unhook and exit");
78-
lib.UnhookWindowsHookEx(hhk);
133+
lib.UnhookWindowsHookEx(keyboardHook);
134+
lib.UnhookWindowsHookEx(mouseHook);
79135
System.exit(0);
80136
}
81137
}.start();
@@ -94,6 +150,7 @@ public void run() {
94150
lib.DispatchMessage(msg);
95151
}
96152
}
97-
lib.UnhookWindowsHookEx(hhk);
153+
lib.UnhookWindowsHookEx(keyboardHook);
154+
lib.UnhookWindowsHookEx(mouseHook);
98155
}
99156
}

0 commit comments

Comments
 (0)