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()); + } + } }