diff --git a/.idea/artifacts/skunkworks_jar.xml b/.idea/artifacts/skunkworks_jar.xml
index 9387d8d..75e5f1e 100644
--- a/.idea/artifacts/skunkworks_jar.xml
+++ b/.idea/artifacts/skunkworks_jar.xml
@@ -11,6 +11,8 @@
+
+
\ No newline at end of file
diff --git a/Test.java b/Test.java
index 55b1e52..0324c27 100644
--- a/Test.java
+++ b/Test.java
@@ -17,9 +17,12 @@ public class Test {
}
windows.get(0).setBorder(true);
windows.get(0).setBorderRounded(false);
- windows.get(0).move(new Vec2i(1280, 720), new Vec2i(2560, 1440));
+ windows.get(0).move(new Recti(1280, 720, 2560, 1440));
windows.get(0).debugPrintStyles();
windows.get(0).debugPrintStylesEx();
+ Window.onKey();
+ Window.onNewWindow();
+ Window.messageLoop();
/*
var engine = new Engine();
var window = engine.openWindow(new Vec2i(1280, 720), "Skunkworks");
diff --git a/com/danitheskunk/skunkworks/windows/User32Extra.java b/com/danitheskunk/skunkworks/windows/User32Extra.java
index f13a171..47a8f0c 100644
--- a/com/danitheskunk/skunkworks/windows/User32Extra.java
+++ b/com/danitheskunk/skunkworks/windows/User32Extra.java
@@ -46,6 +46,9 @@ public interface User32Extra extends User32 {
long WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE);
long WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST);
+ int WH_SHELL = 10;
+
+ int HSHELL_WINDOWCREATED = 1;
// https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes
int VK_LBUTTON = 0x01;
int VK_RBUTTON = 0x02;
diff --git a/com/danitheskunk/skunkworks/windows/Window.java b/com/danitheskunk/skunkworks/windows/Window.java
index c6f9712..6648f44 100644
--- a/com/danitheskunk/skunkworks/windows/Window.java
+++ b/com/danitheskunk/skunkworks/windows/Window.java
@@ -1,8 +1,10 @@
package com.danitheskunk.skunkworks.windows;
+import com.danitheskunk.skunkworks.Recti;
import com.danitheskunk.skunkworks.Util;
import com.danitheskunk.skunkworks.Vec2i;
+import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.*;
import com.sun.jna.ptr.IntByReference;
@@ -188,11 +190,19 @@ public class Window {
var user32 = User32Extra.INSTANCE;
var dwm = Dwm.INSTANCE;
var out = new IntByReference();
- //dwm.DwmGetWindowAttribute(hwnd, Dwm.DWMWA_CLOAKED, out.getPointer(), new WinDef.DWORD(WinDef.DWORD.SIZE));
+ dwm.DwmGetWindowAttribute(hwnd, Dwm.DWMWA_CLOAKED, out.getPointer(), new WinDef.DWORD(WinDef.DWORD.SIZE));
var val = out.getValue();
return val != 0;
}
+ public boolean isClass(String str) {
+ return str.equals(getClassName());
+ }
+
+ public boolean isExecutableName(String str) {
+ return str.equals(getExecutableName());
+ }
+
public boolean isInAltTabList() {
var user32 = User32Extra.INSTANCE;
var walk = user32.GetAncestor(hwnd, WinUser.GA_ROOTOWNER);
@@ -210,9 +220,11 @@ public class Window {
return (getStyle() & User32Extra.WS_EX_TOOLWINDOW) != 0;
}
- public void move(Vec2i pos, Vec2i size) {
+ public void move(Recti rectangle) {
var user32 = User32Extra.INSTANCE;
var dwm = Dwm.INSTANCE;
+ var pos = rectangle.getPos();
+ var size = rectangle.getSize();
var rect_with_shadow = new WinDef.RECT();
var rect_without_shadow = new WinDef.RECT();
@@ -261,4 +273,47 @@ public class Window {
return windows;
}
+
+ public static void messageLoop() {
+ var user32 = User32Extra.INSTANCE;
+ var msg = new WinUser.MSG();
+ while(user32.GetMessage(msg, null, 0, 0) != 0) {
+ System.out.println("msg pump");
+ user32.TranslateMessage(msg);
+ user32.DispatchMessage(msg);
+ }
+ }
+
+ public static void onKey() {
+ var user32 = User32Extra.INSTANCE;
+ var kernel32 = Kernel32.INSTANCE;
+ var res = user32.SetWindowsHookEx(User32Extra.WH_KEYBOARD_LL, new WinUser.HOOKPROC() {
+ public WinDef.LRESULT callback(int nCode, WinDef.WPARAM wparam, WinDef.LPARAM lparam) {
+ System.out.println("got some message a");
+ return new WinDef.LRESULT(0);
+ }
+ }, null, 0);
+ if(res == null) {
+ throw new RuntimeException("Couldn't setwindowhookex: " + Native.getLastError());
+ }
+ }
+
+ public static void onNewWindow() {
+ var user32 = User32Extra.INSTANCE;
+ var kernel32 = Kernel32.INSTANCE;
+ var hmod = kernel32.GetModuleHandle("kernel32.dll");
+ //todo: try RegisterShellHookWindow instead
+ var res = user32.SetWindowsHookEx(User32Extra.WH_SHELL, new WinUser.HOOKPROC() {
+ public WinDef.LRESULT callback(int nCode, WinDef.WPARAM wparam, WinDef.LPARAM lparam) {
+ System.out.println("got some message b");
+ if(nCode == User32Extra.HSHELL_WINDOWCREATED) {
+ System.out.println("window created");
+ }
+ return new WinDef.LRESULT(0);
+ }
+ }, hmod, 0);
+ if(res == null) {
+ throw new RuntimeException("Couldn't setwindowhookex: " + Native.getLastError());
+ }
+ }
}