commit
43405b956d
@ -0,0 +1,3 @@ |
|||||||
|
Manifest-Version: 1.0 |
||||||
|
Main-Class: de.marenthyu.memedit.Main |
||||||
|
|
@ -0,0 +1,50 @@ |
|||||||
|
package de.marenthyu.memedit; |
||||||
|
|
||||||
|
import de.marenthyu.memedit.bunny.BunnyMemoryManager; |
||||||
|
import de.marenthyu.twitch.auth.AuthStore; |
||||||
|
import de.marenthyu.twitch.auth.oauth.OAuthToken; |
||||||
|
import de.marenthyu.twitch.pubsub.PubSubClient; |
||||||
|
|
||||||
|
import java.net.URISyntaxException; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
public class Main { |
||||||
|
private static final String CLIENT_ID = "ckqn7b448jawx00ar8pp5yq8l6a9kc"; |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
|
||||||
|
AuthStore.init(CLIENT_ID); |
||||||
|
while (!AuthStore.isInitialized()) { |
||||||
|
try { |
||||||
|
TimeUnit.MILLISECONDS.sleep(200); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
OAuthToken token = AuthStore.getToken(); |
||||||
|
PubSubClient pubSub = null; |
||||||
|
try { |
||||||
|
ArrayList<String> topics = new ArrayList<String>(); |
||||||
|
topics.add("channel-points-channel-v1." + token.getUserID()); |
||||||
|
pubSub = new PubSubClient(token, topics); |
||||||
|
|
||||||
|
} catch (URISyntaxException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
|
||||||
|
BunnyMemoryManager.init(); |
||||||
|
|
||||||
|
// Okay, we found bunny - time to do some stuff
|
||||||
|
|
||||||
|
assert pubSub != null; |
||||||
|
BunnyMemoryManager.addSetHPHandler(pubSub); |
||||||
|
BunnyMemoryManager.addFullHealHandler(pubSub); |
||||||
|
BunnyMemoryManager.addHealHandler(pubSub); |
||||||
|
BunnyMemoryManager.addBadgeHandlers(pubSub); |
||||||
|
|
||||||
|
System.out.println("============= SETUP COMPLETE! Leaving this running should work now. Close this window to kill it. ============="); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package de.marenthyu.memedit.bunny; |
||||||
|
|
||||||
|
public class BunnyConstants { |
||||||
|
final static String RABI_TITLE = "Rabi-Ribi ver 1.99t"; |
||||||
|
final static int RABI_SAVBLOCK_OFFSET = 0x01689290; |
||||||
|
final static int[] RABI_HEALTH_OFFSETS_IN_SAVBLOCK = {0x4DC}; |
||||||
|
final static int[] RABI_MAX_HEALTH_OFFSETS_IN_SAVBLOCK = {0x4EC}; |
||||||
|
final static int[] RABI_MANA_OFFSETS_IN_SAVBLOCK = {0x6BC}; // It's a float!
|
||||||
|
final static int RABI_BADGE_ARRAY_BASE_POINTER_OFFSET = 0x002ED130; // This still is a pointerpath, with offset 0 as the only one.
|
||||||
|
final static String[] RABI_BADGES = {"HEALTH_UP", "HEALTH_SURGE", "MANA_UP", "MANA_SURGE", "CRISIS_BOOST", |
||||||
|
"ATTACK_GROW", "DEFENSE_GROW", "ATTACK_TRADE", "DEFENSE_TRADE", "ARM_STRENGTH", "CARROT_BOOST", "WEAKEN", |
||||||
|
"SELF_DEFENSE", "ARMORED", "LUCKY_SEVEN", "HEX_CANCEL", "PURE_LOVE", "TOXIC_STRIKE", |
||||||
|
"FRAME_CANCEL", "HEALTH_WAGER", "MANA_WAGER", "STAMINA_PLUS", "BLESSED", "HITBOX_DOWN", "CASHBACK", |
||||||
|
"SURVIVAL", "TOP_FORM", "TOUGH_SKIN", "ERINA_BADGE", "RIBBON_BADGE", "AUTO_TRIGGER", "LILITHS_GIFT"}; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,194 @@ |
|||||||
|
package de.marenthyu.memedit.bunny; |
||||||
|
|
||||||
|
import com.sun.jna.Memory; |
||||||
|
import com.sun.jna.Pointer; |
||||||
|
import de.marenthyu.twitch.pubsub.PubSubClient; |
||||||
|
import de.marenthyu.twitch.pubsub.channelpoints.ChannelPointsRedemptionHandler; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
import static de.marenthyu.memedit.bunny.BunnyConstants.*; |
||||||
|
import static de.marenthyu.memedit.util.Shared.*; |
||||||
|
|
||||||
|
public class BunnyMemoryManager { |
||||||
|
|
||||||
|
|
||||||
|
static int RABI_BASE_SIZE; |
||||||
|
public static Pointer bunnyProcess; |
||||||
|
public static int bunnyPID; |
||||||
|
|
||||||
|
|
||||||
|
public static void init() { |
||||||
|
bunnyPID = getProcessId(RABI_TITLE); |
||||||
|
System.out.println("[BUNNY] Bunny PID: " + bunnyPID); |
||||||
|
bunnyProcess = openProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, bunnyPID); |
||||||
|
try { |
||||||
|
RABI_BASE_SIZE = getBaseAddress("rabiribi.exe"); |
||||||
|
if (RABI_BASE_SIZE == 0) { |
||||||
|
throw new IOException("Invalid Size Returned from Powershell"); |
||||||
|
} |
||||||
|
} catch (NumberFormatException | IOException e) { |
||||||
|
// e.printStackTrace();
|
||||||
|
System.out.println(); |
||||||
|
System.out.println("[BUNNY] Error getting the Module base address automatically, asking user."); |
||||||
|
String userInput = JOptionPane.showInputDialog("Please Enter the base address of rabiribi.exe\n If you dare, please help me automate this. I am at the end of my knowledge. If you don't know how to do this, ask whoever linked you this software."); |
||||||
|
try { |
||||||
|
RABI_BASE_SIZE = Integer.decode(userInput); |
||||||
|
} catch (Exception y) { |
||||||
|
try { |
||||||
|
RABI_BASE_SIZE = Integer.decode("0x" + userInput); |
||||||
|
} catch (Exception ex) { |
||||||
|
System.out.println("[BUNNY] You're stupid. I think. something went wrong."); |
||||||
|
e.printStackTrace(); |
||||||
|
ex.printStackTrace(); |
||||||
|
System.exit(2); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (bunnyPID == 0) { |
||||||
|
System.err.println("[BUNNY] COULD NOT LOCATE PID FOR " + RABI_TITLE + " - PLEASE MAKE SURE THE GAME IS RUNNING AND ON THE SPECIFIED VERSION!"); |
||||||
|
System.exit(1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void addSetHPHandler(PubSubClient pubSub) { |
||||||
|
pubSub.addChannelPointsRedemptionHandler(new ChannelPointsRedemptionHandler("[BUNNY][HP]") { |
||||||
|
@Override |
||||||
|
public void matched(String input) { |
||||||
|
try { |
||||||
|
int newHeahlth = Integer.parseInt(input); |
||||||
|
setHP(newHeahlth); |
||||||
|
System.out.println("[BUNNY][HP] HP set to " + newHeahlth); |
||||||
|
} catch (NumberFormatException e) { |
||||||
|
System.err.println("[BUNNY][HP] Invalid Number."); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
public static void addFullHealHandler(PubSubClient pubSub) { |
||||||
|
pubSub.addChannelPointsRedemptionHandler(new ChannelPointsRedemptionHandler("[BUNNY][FULLHEAL]") { |
||||||
|
@Override |
||||||
|
public void matched(String input) { |
||||||
|
fullHeal(); |
||||||
|
System.out.println("[BUNNY][FULLHEAL] Healed fully!"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
public static void addHealHandler(PubSubClient pubSub) { |
||||||
|
pubSub.addChannelPointsRedemptionHandler(new ChannelPointsRedemptionHandler("[BUNNY][HEAL]") { |
||||||
|
@Override |
||||||
|
public void matched(String input) { |
||||||
|
try { |
||||||
|
int amount = Integer.parseInt(input); |
||||||
|
heal(amount); |
||||||
|
System.out.println("[BUNNY][HEAL] Healed by " + amount); |
||||||
|
} catch (NumberFormatException e) { |
||||||
|
System.err.println("[BUNNY][HEAL] Invalid Number."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static void addBadgeHandlers(PubSubClient pubSub) { |
||||||
|
for (int i = 0;i < RABI_BADGES.length;i++) { |
||||||
|
for (int j = 0;j<=2;j++) { |
||||||
|
String type; |
||||||
|
switch (j) { |
||||||
|
case 0: |
||||||
|
{ |
||||||
|
type = "DELETE"; |
||||||
|
break; |
||||||
|
} |
||||||
|
case 1: { |
||||||
|
type = "UNLOCK"; |
||||||
|
break; |
||||||
|
} |
||||||
|
case 2: { |
||||||
|
type = "EQUIP"; |
||||||
|
break; |
||||||
|
} |
||||||
|
default: |
||||||
|
throw new IllegalStateException("Unexpected value: " + j); |
||||||
|
} |
||||||
|
final int finalJ = j; |
||||||
|
final int finalI = i; |
||||||
|
pubSub.addChannelPointsRedemptionHandler(new ChannelPointsRedemptionHandler("[BUNNY][BADGE][" + type + "][" + RABI_BADGES[finalI] + "]") { |
||||||
|
@Override |
||||||
|
public void matched(String input) { |
||||||
|
switch (finalJ) { |
||||||
|
case 0: |
||||||
|
{ |
||||||
|
removeBadge(finalI); |
||||||
|
break; |
||||||
|
} |
||||||
|
case 1: { |
||||||
|
unluckAndUnequipBadge(finalI); |
||||||
|
break; |
||||||
|
} |
||||||
|
case 2: { |
||||||
|
equipBadge(finalI); |
||||||
|
break; |
||||||
|
} |
||||||
|
default: |
||||||
|
throw new IllegalStateException("Unexpected value: " + finalJ); |
||||||
|
} |
||||||
|
System.out.println("[BUNNY][BADGE][" + type + "][" + RABI_BADGES[finalI] + "] Badges changed!"); |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static void setHP(int newHeahlth) { |
||||||
|
System.out.println("[BUNNY] Got request to change HP - setting it to " + newHeahlth); |
||||||
|
long dynAddress = findDynAddress(bunnyProcess, RABI_HEALTH_OFFSETS_IN_SAVBLOCK, RABI_BASE_SIZE + RABI_SAVBLOCK_OFFSET); |
||||||
|
int curHealth = getCurHP(); |
||||||
|
System.out.println(String.format("[BUNNY] Old health read from memory was: %d, setting it to %d", curHealth, newHeahlth)); |
||||||
|
writeMemory(bunnyProcess, dynAddress, intToBytes(newHeahlth)); |
||||||
|
} |
||||||
|
|
||||||
|
public static int getCurHP() { |
||||||
|
long dynAddress = findDynAddress(bunnyProcess, RABI_HEALTH_OFFSETS_IN_SAVBLOCK, RABI_BASE_SIZE + RABI_SAVBLOCK_OFFSET); |
||||||
|
Memory healthCurrentMem = readMemory(bunnyProcess, dynAddress, 4); |
||||||
|
return healthCurrentMem.getInt(0); |
||||||
|
} |
||||||
|
|
||||||
|
public static int getMaxHP() { |
||||||
|
long dynAddress = findDynAddress(bunnyProcess, RABI_MAX_HEALTH_OFFSETS_IN_SAVBLOCK, RABI_BASE_SIZE + RABI_SAVBLOCK_OFFSET); |
||||||
|
Memory healthCurrentMem = readMemory(bunnyProcess, dynAddress, 4); |
||||||
|
return healthCurrentMem.getInt(0); |
||||||
|
} |
||||||
|
|
||||||
|
public static void heal(int amount) { |
||||||
|
setHP(getCurHP() + amount); |
||||||
|
} |
||||||
|
|
||||||
|
public static void fullHeal() { |
||||||
|
setHP(getMaxHP()); |
||||||
|
} |
||||||
|
|
||||||
|
public static void equipBadge(int badgeID) { |
||||||
|
long dynAddress = findDynAddress(bunnyProcess, new int[]{badgeID * 4}, RABI_BASE_SIZE + RABI_BADGE_ARRAY_BASE_POINTER_OFFSET); |
||||||
|
writeMemory(bunnyProcess, dynAddress, new byte[]{0x02}); |
||||||
|
} |
||||||
|
|
||||||
|
public static void unluckAndUnequipBadge(int badgeID) { |
||||||
|
long dynAddress = findDynAddress(bunnyProcess, new int[]{badgeID * 4}, RABI_BASE_SIZE + RABI_BADGE_ARRAY_BASE_POINTER_OFFSET); |
||||||
|
writeMemory(bunnyProcess, dynAddress, new byte[]{0x01}); |
||||||
|
} |
||||||
|
|
||||||
|
public static void removeBadge(int badgeID) { |
||||||
|
long dynAddress = findDynAddress(bunnyProcess, new int[]{badgeID * 4}, RABI_BASE_SIZE + RABI_BADGE_ARRAY_BASE_POINTER_OFFSET); |
||||||
|
writeMemory(bunnyProcess, dynAddress, new byte[]{0x00}); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package de.marenthyu.memedit.util; |
||||||
|
|
||||||
|
import com.sun.jna.Pointer; |
||||||
|
import com.sun.jna.ptr.IntByReference; |
||||||
|
import com.sun.jna.win32.StdCallLibrary; |
||||||
|
|
||||||
|
public interface Kernel32 extends StdCallLibrary { |
||||||
|
// description from msdn
|
||||||
|
//BOOL WINAPI WriteProcessMemory(
|
||||||
|
//__in HANDLE hProcess,
|
||||||
|
//__in LPVOID lpBaseAddress,
|
||||||
|
//__in LPCVOID lpBuffer,
|
||||||
|
//__in SIZE_T nSize,
|
||||||
|
//__out SIZE_T *lpNumberOfBytesWritten
|
||||||
|
//);
|
||||||
|
boolean WriteProcessMemory(Pointer p, long address, Pointer buffer, int size, IntByReference written); |
||||||
|
|
||||||
|
|
||||||
|
//BOOL WINAPI ReadProcessMemory(
|
||||||
|
// __in HANDLE hProcess,
|
||||||
|
// __in LPCVOID lpBaseAddress,
|
||||||
|
// __out LPVOID lpBuffer,
|
||||||
|
// __in SIZE_T nSize,
|
||||||
|
// __out SIZE_T *lpNumberOfBytesRead
|
||||||
|
// );
|
||||||
|
boolean ReadProcessMemory(Pointer hProcess, long inBaseAddress, Pointer outputBuffer, int nSize, IntByReference outNumberOfBytesRead); |
||||||
|
|
||||||
|
|
||||||
|
//HANDLE WINAPI OpenProcess(
|
||||||
|
// __in DWORD dwDesiredAccess,
|
||||||
|
// __in BOOL bInheritHandle,
|
||||||
|
// __in DWORD dwProcessId
|
||||||
|
//);
|
||||||
|
Pointer OpenProcess(int desired, boolean inherit, int pid); |
||||||
|
|
||||||
|
/* derp */ |
||||||
|
int GetLastError(); |
||||||
|
} |
@ -0,0 +1,103 @@ |
|||||||
|
package de.marenthyu.memedit.util; |
||||||
|
|
||||||
|
import com.sun.jna.Memory; |
||||||
|
import com.sun.jna.Native; |
||||||
|
import com.sun.jna.Pointer; |
||||||
|
import com.sun.jna.ptr.IntByReference; |
||||||
|
|
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
|
||||||
|
public class Shared { |
||||||
|
static Kernel32 kernel32 = Native.load("kernel32", Kernel32.class); |
||||||
|
static User32 user32 = Native.load("user32", User32.class); |
||||||
|
|
||||||
|
public static int PROCESS_VM_READ = 0x0010; |
||||||
|
public static int PROCESS_VM_WRITE = 0x0020; |
||||||
|
public static int PROCESS_VM_OPERATION = 0x0008; |
||||||
|
|
||||||
|
public static int getProcessId(String window) { |
||||||
|
IntByReference pid = new IntByReference(0); |
||||||
|
user32.GetWindowThreadProcessId(user32.FindWindowA(null, window), pid); |
||||||
|
|
||||||
|
return pid.getValue(); |
||||||
|
} |
||||||
|
|
||||||
|
public static Pointer openProcess(int permissions, int pid) { |
||||||
|
Pointer process = kernel32.OpenProcess(permissions, true, pid); |
||||||
|
return process; |
||||||
|
} |
||||||
|
|
||||||
|
public static long findDynAddress(Pointer process, int[] offsets, long baseAddress) { |
||||||
|
|
||||||
|
long pointer = baseAddress; |
||||||
|
|
||||||
|
int size = 4; |
||||||
|
Memory pTemp = new Memory(size); |
||||||
|
long pointerAddress = 0; |
||||||
|
// System.out.println("initial pointerAddress: " + String.format("0x%X", pointer));
|
||||||
|
for (int i = 0; i < offsets.length; i++) { |
||||||
|
if (i == 0) { |
||||||
|
kernel32.ReadProcessMemory(process, pointer, pTemp, size, null); |
||||||
|
} |
||||||
|
|
||||||
|
pointerAddress = ((pTemp.getInt(0) + offsets[i])); |
||||||
|
|
||||||
|
// System.out.println("Current pointerAddress: " + String.format("0x%X", pointerAddress));
|
||||||
|
|
||||||
|
if (i != offsets.length - 1) |
||||||
|
kernel32.ReadProcessMemory(process, pointerAddress, pTemp, size, null); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
return pointerAddress; |
||||||
|
} |
||||||
|
|
||||||
|
public static Memory readMemory(Pointer process, long address, int bytesToRead) { |
||||||
|
IntByReference read = new IntByReference(0); |
||||||
|
Memory output = new Memory(bytesToRead); |
||||||
|
|
||||||
|
kernel32.ReadProcessMemory(process, address, output, bytesToRead, read); |
||||||
|
return output; |
||||||
|
} |
||||||
|
|
||||||
|
public static void writeMemory(Pointer process, long address, byte[] data) { |
||||||
|
int size = data.length; |
||||||
|
Memory toWrite = new Memory(size); |
||||||
|
|
||||||
|
for (int i = 0; i < size; i++) { |
||||||
|
toWrite.setByte(i, data[i]); |
||||||
|
} |
||||||
|
|
||||||
|
boolean b = kernel32.WriteProcessMemory(process, address, toWrite, size, null); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] intToBytes(final int data) { |
||||||
|
return new byte[]{ |
||||||
|
(byte) ((data >> 0) & 0xff), |
||||||
|
(byte) ((data >> 8) & 0xff), |
||||||
|
(byte) ((data >> 16) & 0xff), |
||||||
|
(byte) ((data >> 24) & 0xff) |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
public static int getBaseAddress(String executableName) throws IOException { |
||||||
|
String command = "powershell.exe \"$modules = Get-Process " + executableName.split("\\.")[0] + " -Module; $modules[0].BaseAddress;\""; |
||||||
|
// Executing the command
|
||||||
|
Process powerShellProcess = Runtime.getRuntime().exec(command); |
||||||
|
// Getting the results
|
||||||
|
powerShellProcess.getOutputStream().close(); |
||||||
|
String line; |
||||||
|
BufferedReader stdout = new BufferedReader(new InputStreamReader( |
||||||
|
powerShellProcess.getInputStream())); |
||||||
|
StringBuilder output = new StringBuilder(); |
||||||
|
while ((line = stdout.readLine()) != null) { |
||||||
|
output.append(line); |
||||||
|
} |
||||||
|
stdout.close(); |
||||||
|
return Integer.parseInt(output.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,196 @@ |
|||||||
|
package de.marenthyu.memedit.util; |
||||||
|
|
||||||
|
import com.sun.jna.Native; |
||||||
|
import com.sun.jna.Pointer; |
||||||
|
import com.sun.jna.Structure; |
||||||
|
import com.sun.jna.platform.win32.WinDef.RECT; |
||||||
|
import com.sun.jna.ptr.ByteByReference; |
||||||
|
import com.sun.jna.ptr.IntByReference; |
||||||
|
import com.sun.jna.win32.W32APIOptions; |
||||||
|
|
||||||
|
public interface User32 extends W32APIOptions { |
||||||
|
User32 INSTANCE = Native.load("user32", User32.class, DEFAULT_OPTIONS); |
||||||
|
|
||||||
|
Pointer GetDC(Pointer hWnd); |
||||||
|
|
||||||
|
int ReleaseDC(Pointer hWnd, Pointer hDC); |
||||||
|
|
||||||
|
int FLASHW_STOP = 0; |
||||||
|
int FLASHW_CAPTION = 1; |
||||||
|
int FLASHW_TRAY = 2; |
||||||
|
int FLASHW_ALL = (FLASHW_CAPTION | FLASHW_TRAY); |
||||||
|
int FLASHW_TIMER = 4; |
||||||
|
int FLASHW_TIMERNOFG = 12; |
||||||
|
|
||||||
|
public static class FLASHWINFO extends Structure { |
||||||
|
public int cbSize; |
||||||
|
public Pointer hWnd; |
||||||
|
public int dwFlags; |
||||||
|
public int uCount; |
||||||
|
public int dwTimeout; |
||||||
|
} |
||||||
|
|
||||||
|
int IMAGE_BITMAP = 0; |
||||||
|
int IMAGE_ICON = 1; |
||||||
|
int IMAGE_CURSOR = 2; |
||||||
|
int IMAGE_ENHMETAFILE = 3; |
||||||
|
int LR_DEFAULTCOLOR = 0x0000; |
||||||
|
int LR_MONOCHROME = 0x0001; |
||||||
|
int LR_COLOR = 0x0002; |
||||||
|
int LR_COPYRETURNORG = 0x0004; |
||||||
|
int LR_COPYDELETEORG = 0x0008; |
||||||
|
int LR_LOADFROMFILE = 0x0010; |
||||||
|
int LR_LOADTRANSPARENT = 0x0020; |
||||||
|
int LR_DEFAULTSIZE = 0x0040; |
||||||
|
int LR_VGACOLOR = 0x0080; |
||||||
|
int LR_LOADMAP3DCOLORS = 0x1000; |
||||||
|
int LR_CREATEDIBSECTION = 0x2000; |
||||||
|
int LR_COPYFROMRESOURCE = 0x4000; |
||||||
|
int LR_SHARED = 0x8000; |
||||||
|
|
||||||
|
Pointer FindWindowA(String winClass, String title); |
||||||
|
|
||||||
|
int GetClassName(Pointer hWnd, byte[] lpClassName, int nMaxCount); |
||||||
|
|
||||||
|
public static class GUITHREADINFO extends Structure { |
||||||
|
public int cbSize = size(); |
||||||
|
public int flags; |
||||||
|
Pointer hwndActive; |
||||||
|
Pointer hwndFocus; |
||||||
|
Pointer hwndCapture; |
||||||
|
Pointer hwndMenuOwner; |
||||||
|
Pointer hwndMoveSize; |
||||||
|
Pointer hwndCaret; |
||||||
|
RECT rcCaret; |
||||||
|
} |
||||||
|
|
||||||
|
boolean GetGUIThreadInfo(int idThread, GUITHREADINFO lpgui); |
||||||
|
|
||||||
|
public static class WINDOWINFO extends Structure { |
||||||
|
public int cbSize = size(); |
||||||
|
public RECT rcWindow; |
||||||
|
public RECT rcClient; |
||||||
|
public int dwStyle; |
||||||
|
public int dwExStyle; |
||||||
|
public int dwWindowStatus; |
||||||
|
public int cxWindowBorders; |
||||||
|
public int cyWindowBorders; |
||||||
|
public short atomWindowType; |
||||||
|
public short wCreatorVersion; |
||||||
|
} |
||||||
|
|
||||||
|
boolean GetWindowInfo(Pointer hWnd, WINDOWINFO pwi); |
||||||
|
|
||||||
|
boolean GetWindowRect(Pointer hWnd, RECT rect); |
||||||
|
|
||||||
|
int GetWindowText(Pointer hWnd, byte[] lpString, int nMaxCount); |
||||||
|
|
||||||
|
int GetWindowTextLength(Pointer hWnd); |
||||||
|
|
||||||
|
int GetWindowModuleFileName(Pointer hWnd, byte[] lpszFileName, int cchFileNameMax); |
||||||
|
|
||||||
|
int GetWindowThreadProcessId(Pointer hWnd, IntByReference lpdwProcessId); |
||||||
|
|
||||||
|
interface WNDENUMPROC extends StdCallCallback { |
||||||
|
/** |
||||||
|
* Return whether to continue enumeration. |
||||||
|
*/ |
||||||
|
boolean callback(Pointer hWnd, Pointer data); |
||||||
|
} |
||||||
|
|
||||||
|
boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer data); |
||||||
|
|
||||||
|
boolean EnumThreadWindows(int dwThreadId, WNDENUMPROC lpEnumFunc, Pointer data); |
||||||
|
|
||||||
|
boolean FlashWindowEx(FLASHWINFO info); |
||||||
|
|
||||||
|
Pointer LoadIcon(Pointer hInstance, String iconName); |
||||||
|
|
||||||
|
Pointer LoadImage(Pointer hinst, // handle to instance
|
||||||
|
String name, // image to load
|
||||||
|
int type, // image type
|
||||||
|
int xDesired, // desired width
|
||||||
|
int yDesired, // desired height
|
||||||
|
int load // load options
|
||||||
|
); |
||||||
|
|
||||||
|
boolean DestroyIcon(Pointer hicon); |
||||||
|
|
||||||
|
int GWL_EXSTYLE = -20; |
||||||
|
int GWL_STYLE = -16; |
||||||
|
int GWL_WNDPROC = -4; |
||||||
|
int GWL_HINSTANCE = -6; |
||||||
|
int GWL_ID = -12; |
||||||
|
int GWL_USERDATA = -21; |
||||||
|
int DWL_DLGPROC = 4; |
||||||
|
int DWL_MSGRESULT = 0; |
||||||
|
int DWL_USER = 8; |
||||||
|
int WS_EX_COMPOSITED = 0x20000000; |
||||||
|
int WS_EX_LAYERED = 0x80000; |
||||||
|
int WS_EX_TRANSPARENT = 32; |
||||||
|
|
||||||
|
int GetWindowLong(Pointer hWnd, int nIndex); |
||||||
|
|
||||||
|
int SetWindowLong(Pointer hWnd, int nIndex, int dwNewLong); |
||||||
|
|
||||||
|
int LWA_COLORKEY = 1; |
||||||
|
int LWA_ALPHA = 2; |
||||||
|
int ULW_COLORKEY = 1; |
||||||
|
int ULW_ALPHA = 2; |
||||||
|
int ULW_OPAQUE = 4; |
||||||
|
|
||||||
|
boolean SetLayeredWindowAttributes(Pointer hwnd, int crKey, |
||||||
|
byte bAlpha, int dwFlags); |
||||||
|
|
||||||
|
boolean GetLayeredWindowAttributes(Pointer hwnd, |
||||||
|
IntByReference pcrKey, |
||||||
|
ByteByReference pbAlpha, |
||||||
|
IntByReference pdwFlags); |
||||||
|
|
||||||
|
/** |
||||||
|
* Defines the x- and y-coordinates of a point. |
||||||
|
*/ |
||||||
|
public static class POINT extends Structure { |
||||||
|
public int x, y; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Specifies the width and height of a rectangle. |
||||||
|
*/ |
||||||
|
public static class SIZE extends Structure { |
||||||
|
public int cx, cy; |
||||||
|
} |
||||||
|
|
||||||
|
int AC_SRC_OVER = 0x00; |
||||||
|
int AC_SRC_ALPHA = 0x01; |
||||||
|
int AC_SRC_NO_PREMULT_ALPHA = 0x01; |
||||||
|
int AC_SRC_NO_ALPHA = 0x02; |
||||||
|
|
||||||
|
public static class BLENDFUNCTION extends Structure { |
||||||
|
public byte BlendOp = AC_SRC_OVER; // only valid value
|
||||||
|
public byte BlendFlags = 0; // only valid value
|
||||||
|
public byte SourceConstantAlpha; |
||||||
|
public byte AlphaFormat; |
||||||
|
} |
||||||
|
|
||||||
|
boolean UpdateLayeredWindow(Pointer hwnd, Pointer hdcDst, |
||||||
|
POINT pptDst, SIZE psize, |
||||||
|
Pointer hdcSrc, POINT pptSrc, int crKey, |
||||||
|
BLENDFUNCTION pblend, int dwFlags); |
||||||
|
|
||||||
|
int SetWindowRgn(Pointer hWnd, Pointer hRgn, boolean bRedraw); |
||||||
|
|
||||||
|
int VK_SHIFT = 16; |
||||||
|
int VK_LSHIFT = 0xA0; |
||||||
|
int VK_RSHIFT = 0xA1; |
||||||
|
int VK_CONTROL = 17; |
||||||
|
int VK_LCONTROL = 0xA2; |
||||||
|
int VK_RCONTROL = 0xA3; |
||||||
|
int VK_MENU = 18; |
||||||
|
int VK_LMENU = 0xA4; |
||||||
|
int VK_RMENU = 0xA5; |
||||||
|
|
||||||
|
boolean GetKeyboardState(byte[] state); |
||||||
|
|
||||||
|
short GetAsyncKeyState(int vKey); |
||||||
|
} |
Loading…
Reference in new issue