some windows code

This commit is contained in:
DaniTheSkunk 2022-10-05 00:35:31 +00:00
parent d9ff38e221
commit ed672439a4
4 changed files with 69 additions and 9 deletions

View File

@ -1,5 +1,5 @@
<component name="ArtifactManager">
<artifact type="jar" name="skunkworks:jar">
<artifact type="jar" build-on-make="true" name="skunkworks:jar">
<output-path>$PROJECT_DIR$/out/artifacts/skunkworks_jar</output-path>
<root id="archive" name="skunkworks.jar">
<element id="module-output" name="skunkworks" />

View File

@ -48,12 +48,18 @@ public interface User32Extra extends User32 {
int WH_SHELL = 10;
int WM_TIMER = 0x0113;
int HSHELL_WINDOWCREATED = 1;
// https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes
int VK_LBUTTON = 0x01;
int VK_RBUTTON = 0x02;
int VK_MBUTTON = 0x04;
int PM_NOREMOVE = 0x00;
int PM_REMOVE = 0x01;
int PM_NOYIELD = 0x02;
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-gettitlebarinfo
boolean GetTitleBarInfo(WinDef.HWND hwnd, TITLEBARINFO titlebarinfo);

View File

@ -0,0 +1,12 @@
package com.danitheskunk.skunkworks.windows;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.win32.W32APIOptions;
public interface WinUserExtra extends WinUser, com.sun.jna.win32.StdCallLibrary {
WinUserExtra INSTANCE = Native.load("user32", WinUserExtra.class, W32APIOptions.DEFAULT_OPTIONS);
//todo: lpTimerFunc should be TIMERPROC
UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, PVOID lpTimerFunc);
}

View File

@ -3,12 +3,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;
import com.sun.jna.ptr.PointerByReference;
import java.util.ArrayList;
import java.util.List;
@ -139,6 +137,10 @@ public class Window {
return Util.nullTerminatedCharArrayToString(chars);
}
public String getKey() {
return getExecutableName() + " $ " + getClassName();
}
private int getStyle() {
var user32 = User32Extra.INSTANCE;
return user32.GetWindowLong(hwnd, WinUser.GWL_STYLE);
@ -208,16 +210,13 @@ public class Window {
var walk = user32.GetAncestor(hwnd, WinUser.GA_ROOTOWNER);
WinDef.HWND test;
while(!(test = user32.GetLastActivePopup(walk)).equals(test)) {
if(user32.IsWindowVisible(test)) break;
walk = test;
}
var window = new Window(hwnd);
if(walk == null) return false;
return walk.equals(hwnd) && user32.IsWindowVisible(hwnd) && window.getTitle().length() > 0 && !window.isToolWindow() && !window.isDwmCloaked() && !window.getClassName().equals("Progman");
}
public boolean isToolWindow() {
return (getStyle() & User32Extra.WS_EX_TOOLWINDOW) != 0;
return (getStyleEx() & User32Extra.WS_EX_TOOLWINDOW) != 0;
}
public void move(Recti rectangle) {
@ -257,6 +256,14 @@ public class Window {
user32.SetWindowPos(hwnd, null, 0, 0, 0, 0, WinUser.SWP_FRAMECHANGED | WinUser.SWP_NOZORDER | WinUser.SWP_NOOWNERZORDER | WinUser.SWP_NOMOVE | WinUser.SWP_NOSIZE | WinUser.SWP_NOACTIVATE);
}
@Override
public boolean equals(Object o) {
if(!(o instanceof Window)) {
return false;
}
return ((Window)o).hwnd.equals(this.hwnd);
}
//static functions
public static List<Window> getAllVisible() {
var user32 = User32Extra.INSTANCE;
@ -281,16 +288,47 @@ public class Window {
System.out.println("msg pump");
user32.TranslateMessage(msg);
user32.DispatchMessage(msg);
if(msg.message == User32Extra.WM_TIMER)
return;
}
}
public static void messageTick() {
//todo: check if this even works (switch to getmessage, and add timer function?)
var user32 = User32Extra.INSTANCE;
var msg = new WinUser.MSG();
//while(user32.PeekMessage(msg, null, 0, 0, User32Extra.PM_NOREMOVE)) {
user32.GetMessage(msg, null, 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) {
var kb = new WinUser.KBDLLHOOKSTRUCT() .newInstance(WinUser.KBDLLHOOKSTRUCT.class, lparam.toPointer());
System.out.println(kb.vkCode);
switch(wparam.intValue()) {
case User32Extra.WM_KEYDOWN:
System.out.println("WM_KEYDOWN");
break;
case User32Extra.WM_KEYUP:
System.out.println("WM_KEYUP");
break;
case User32Extra.WM_SYSKEYDOWN:
System.out.println("WM_SYSKEYDOWN");
break;
case User32Extra.WM_SYSKEYUP:
System.out.println("WM_SYSKEYUP");
break;
}
System.out.println("got some message a");
return new WinDef.LRESULT(0);
return user32.CallNextHookEx(null, nCode, wparam, lparam);
}
}, null, 0);
if(res == null) {
@ -316,4 +354,8 @@ public class Window {
throw new RuntimeException("Couldn't setwindowhookex: " + Native.getLastError());
}
}
public static void onTimer(int ms) {
WinUserExtra.INSTANCE.SetTimer(null, null, new WinDef.UINT(ms), null);
}
}