Move objects and interfaces to designated files

This commit is contained in:
2015-10-18 16:19:41 +01:00
parent 7ff9b7947f
commit 91af6d2141
15 changed files with 1977 additions and 1739 deletions

View File

@@ -9,29 +9,31 @@ package org.synthuse;
import java.awt.Point; import java.awt.Point;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.synthuse.Api.WinDefEx.*; import org.synthuse.interfaces.Kernel32Ex;
import org.synthuse.interfaces.PsapiEx;
import org.synthuse.interfaces.User32Ex;
import org.synthuse.objects.LVITEM_VISTA;
import com.sun.jna.Callback;
import com.sun.jna.Native; import com.sun.jna.Native;
import com.sun.jna.Pointer; import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.platform.win32.Advapi32Util; import com.sun.jna.platform.win32.Advapi32Util;
import com.sun.jna.platform.win32.BaseTSD.LONG_PTR;
import com.sun.jna.platform.win32.BaseTSD.SIZE_T; import com.sun.jna.platform.win32.BaseTSD.SIZE_T;
import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;
import com.sun.jna.platform.win32.WinBase.SYSTEM_INFO; import com.sun.jna.platform.win32.WinBase.SYSTEM_INFO;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinDef.HDC;
import com.sun.jna.platform.win32.WinDef.HMENU; import com.sun.jna.platform.win32.WinDef.HMENU;
import com.sun.jna.platform.win32.WinDef.HPEN;
import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinDef.WPARAM; import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinNT.HANDLE; import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.platform.win32.WinNT.LARGE_INTEGER;
import com.sun.jna.platform.win32.WinReg; import com.sun.jna.platform.win32.WinReg;
import com.sun.jna.platform.win32.WinUser; import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.platform.win32.WinNT.LARGE_INTEGER;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference; import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.StdCallLibrary.StdCallCallback; import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
@@ -40,8 +42,6 @@ import com.sun.jna.win32.W32APIOptions;
public class Api { public class Api {
public static boolean EXACT = false; public static boolean EXACT = false;
// Constants
public static int WM_SETTEXT = 0x000c; public static int WM_SETTEXT = 0x000c;
public static int WM_GETTEXT = 0x000D; public static int WM_GETTEXT = 0x000D;
public static int WM_GETTEXTLENGTH = 0x000E; public static int WM_GETTEXTLENGTH = 0x000E;
@@ -84,7 +84,6 @@ public class Api {
public static int WM_CLEAR = 0x303; public static int WM_CLEAR = 0x303;
public static int WM_UNDO = 0x304; public static int WM_UNDO = 0x304;
public static int PROCESS_QUERY_INFORMATION = 0x0400; public static int PROCESS_QUERY_INFORMATION = 0x0400;
public static int PROCESS_VM_READ = 0x0010; public static int PROCESS_VM_READ = 0x0010;
public static int PROCESS_VM_WRITE = 0x0020; public static int PROCESS_VM_WRITE = 0x0020;
@@ -169,248 +168,36 @@ public class Api {
protected HWND hWndFound; protected HWND hWndFound;
public static final int POINT_Y(long i) public static final int POINT_Y(long i) {
{
return (int) (i >> 32); return (int) (i >> 32);
} }
public static final int POINT_X(long i) public static final int POINT_X(long i) {
{
return (int) (i & 0xFFFF); return (int) (i & 0xFFFF);
} }
public static long MAKELONG(int low, int high) public static long MAKELONG(int low, int high) {
{
return ((long) (((short) ((int) (low) & 0xffff)) | ((int) ((short) ((int) (high) & 0xffff))) << 16)); return ((long) (((short) ((int) (low) & 0xffff)) | ((int) ((short) ((int) (high) & 0xffff))) << 16));
} }
public interface WinDefEx extends com.sun.jna.platform.win32.WinDef {
//Structures
public class MENUITEMINFO extends Structure {
public static final int MFS_CHECKED = 0x00000008;
public static final int MFS_DEFAULT = 0x00001000;
public static final int MFS_DISABLED = 0x00000003;
public static final int MFS_ENABLED = 0x00000000;
public static final int MFS_GRAYED = 0x00000003;
public static final int MFS_HILITE = 0x00000080;
public static final int MFS_UNCHECKED = 0x00000000;
public static final int MFS_UNHILITE = 0x00000000;
public static final int MFT_STRING = 0x0000;
public static final int MIIM_DATA = 0x00000020;
public static final int MIIM_STRING = 0x0040;
public static final int MIIM_SUBMENU = 0x0004;
public static final int MIIM_TYPE = 0x0010;
public static class ByValue extends MENUITEMINFO implements Structure.ByValue {
}
public static class ByReference extends MENUITEMINFO implements Structure.ByReference {
}
public MENUITEMINFO() {
cbSize = size();
}
public MENUITEMINFO(Pointer p) {
super(p);
}
@Override
protected List<?> getFieldOrder() {
return Arrays.asList(new String[] { "cbSize", "fMask", "fType", "fState", "wID", "hSubMenu", "hbmpChecked",
"hbmpUnchecked", "dwItemData", "dwTypeData", "cch", "hbmpItem" });
}
public int cbSize; //The size of the structure, in bytes. The caller must set this member to sizeof(MENUITEMINFO).
public int fMask; //Indicates the members to be retrieved or set. MIIM_STRING or MIIM_SUBMENU or ...
public int fType; //The menu item type. fType is used only if fMask has a value of MIIM_FTYPE.
public int fState; //The menu item state. This member can be one or more of these values. Set fMask to MIIM_STATE to use fState.
public int wID; //An application-defined value that identifies the menu item. Set fMask to MIIM_ID to use wID.
public HMENU hSubMenu; //A handle to the drop-down menu or submenu associated with the menu item. Or NULL
public HBITMAP hbmpChecked; //A handle to the bitmap to display next to the item if it is selected.
public HBITMAP hbmpUnchecked; //A handle to the bitmap to display next to the item if it is not selected.
public ULONG_PTR dwItemData; //An application-defined value associated with the menu item. Set fMask to MIIM_DATA
//public byte[] dwTypeData = new byte[256];
public String dwTypeData; //The contents of the menu item, depends on the value of fType and is used only if the MIIM_TYPE flag is set in the fMask member
public int cch; //The length of the menu item text, in characters, when information is received about a menu item of the MFT_STRING type.
public HBITMAP hbmpItem; //A handle to the bitmap to be displayed, or it can be one of the values in the following table.
}
//64bit LVITEM size 88
//32bit LVITEM size 60
public static class LVITEM_VISTA extends Structure {
public int mask;
public int iItem;
public int iSubItem;
public int state;
public int stateMask;
public Pointer pszText;
public int cchTextMax;
public int iImage;
public LPARAM lParam;
public int iIndent;
public int iGoupId;
public int cColumns;
public Pointer puColumns;
//NTDDI_VERSION >= NTDDI_VISTA
public Pointer piColFmt;
public int iGroup;
@Override
protected List<?> getFieldOrder() {
return Arrays.asList(new String[] {
"mask", "iItem", "iSubItem", "state", "stateMask", "pszText", "cchTextMax", "iImage", "lParam", "iIndent", "iGoupId", "cColumns", "puColumns", "piColFmt", "iGroup" });
}
}
public static class COPYDATASTRUCT extends Structure {
//The by-reference version of this structure.
public static class ByReference extends COPYDATASTRUCT implements Structure.ByReference { }
public COPYDATASTRUCT() { }
//Instantiates a new COPYDATASTRUCT with existing data given the address of that data.
public COPYDATASTRUCT(final long pointer) {
this(new Pointer(pointer));
}
//Instantiates a new COPYDATASTRUCT with existing data given a pointer to that data.
public COPYDATASTRUCT(final Pointer memory) {
super(memory);
read();
}
public ULONG_PTR dwData; // The data to be passed to the receiving application.
public int cbData; //The size, in bytes, of the data pointed to by the lpData
public Pointer lpData;
@SuppressWarnings("rawtypes")
@Override
protected final List getFieldOrder() {
return Arrays.asList(new String[] {"dwData", "cbData", "lpData" });
}
}
}
interface WNDPROC extends StdCallCallback { interface WNDPROC extends StdCallCallback {
LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam); LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam);
}
public interface User32Ex extends W32APIOptions {
User32Ex instance = (User32Ex) Native.loadLibrary("user32", User32Ex.class, DEFAULT_OPTIONS);
int SetWindowLongPtr(HWND hWnd, int nIndex, Callback callback);
LRESULT CallWindowProc(LONG_PTR proc, HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam);
boolean ShowWindow(HWND hWnd, int nCmdShow);
boolean SetForegroundWindow(HWND hWnd);
void SwitchToThisWindow(HWND hWnd, boolean fAltTab);
HWND SetFocus(HWND hWnd);
HWND FindWindow(String winClass, String title);
LRESULT PostMessage(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);
LRESULT SendMessage(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);
LRESULT SendMessage(HWND hWnd, int Msg, WPARAM wParam, LVITEM_VISTA lParam);
LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
boolean DestroyWindow(HWND hWnd);
boolean EnumWindows (WNDENUMPROC wndenumproc, int lParam);
boolean EnumChildWindows(HWND hWnd, WNDENUMPROC lpEnumFunc, Pointer data);
HWND GetParent(HWND hWnd);
boolean IsWindowVisible(HWND hWnd);
boolean IsWindow(HWND hWnd);
int GetWindowRect(HWND hWnd, RECT r);
int MapWindowPoints(HWND hWndFrom, HWND hWndTo, RECT r, int cPoints);
HWND GetDesktopWindow();
HDC GetWindowDC(HWND hWnd);
int ReleaseDC(HWND hWnd, HDC hDC);
boolean InvalidateRect(HWND hWnd, long lpRect, boolean bErase);
boolean UpdateWindow(HWND hWnd);
boolean RedrawWindow(HWND hWnd, long lprcUpdate, long hrgnUpdate, int flags);
void GetWindowTextA(HWND hWnd, byte[] buffer, int buflen);
int GetTopWindow(HWND hWnd);
int GetWindow(HWND hWnd, int flag);
final int GW_HWNDNEXT = 2;
int GetClassName(HWND hWnd, char[] buffer2, int i);
int GetWindowModuleFileName(HWND hWnd, char[] buffer2, int i);
int GetWindowThreadProcessId(HWND hWnd, PointerByReference pref);
//int GetWindowThreadProcessId(HWND hWnd, IntByReference lpdwProcessId);
boolean GetCursorPos(long[] lpPoint); //use macros POINT_X() and POINT_Y() on long lpPoint[0]
HWND WindowFromPoint(long point);
HWND ChildWindowFromPointEx(HWND hwndParent, long point, int uFlags);
boolean ClientToScreen(HWND hWnd, long[] lpPoint);//use macros POINT_X() and POINT_Y() on long lpPoint[0]
boolean ScreenToClient(HWND hWnd, long[] lpPoint);//use macros POINT_X() and POINT_Y() on long lpPoint[0]
//HWND WindowFromPoint(int xPoint, int yPoint);
//HWND WindowFromPoint(POINT point);
HMENU GetMenu(HWND hWnd);
HMENU GetSystemMenu(HWND hWnd, boolean bRevert);
boolean IsMenu(HMENU hMenu);
int GetMenuString(HMENU hMenu, int uIDItem, char[] buffer, int nMaxCount, int uFlag);
HMENU GetSubMenu(HMENU hMenu, int nPos);
int GetMenuItemCount(HMENU hMenu);
int GetMenuItemID(HMENU hMenu, int nPos);
//BOOL WINAPI GetMenuItemInfo(_In_ HMENU hMenu, _In_ UINT uItem, _In_ BOOL fByPosition, _Inout_ LPMENUITEMINFO lpmii);
boolean GetMenuItemInfoA(HMENU hMenu, int uItem, boolean fByPosition, WinDefEx.MENUITEMINFO mii); //MENUITEMINFO
boolean TrackPopupMenu(HMENU hMenu, int uFlags, int x, int y, int nReserved, HWND hWnd, long prcRect);
boolean GetMenuItemRect(HWND hWnd, HMENU hMenu, int uItem, RECT rect);
int GetDlgCtrlID(HWND hwndCtl);
int GetDlgItemText(HWND hDlg, int nIDDlgItem, byte[] buffer, int nMaxCount);
int GetMenuState(HMENU hMenuTopMenu, int uId, int uFlags);
HWND GetDlgItem(HWND hDlg, int nIDDlgItem);
} }
public interface Gdi32Ex extends W32APIOptions { public interface Gdi32Ex extends W32APIOptions {
Gdi32Ex instance = (Gdi32Ex) Native.loadLibrary("gdi32", Gdi32Ex.class, DEFAULT_OPTIONS); Gdi32Ex instance = (Gdi32Ex) Native.loadLibrary("gdi32", Gdi32Ex.class, DEFAULT_OPTIONS);
HANDLE SelectObject(HDC hdc, HANDLE hgdiobj); HANDLE SelectObject(HDC hdc, HANDLE hgdiobj);
HANDLE GetStockObject(int fnObject); HANDLE GetStockObject(int fnObject);
boolean Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); boolean Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
HPEN CreatePen(int fnPenStyle, int nWidth, int crColor); HPEN CreatePen(int fnPenStyle, int nWidth, int crColor);
} }
public interface PsapiEx extends W32APIOptions {
PsapiEx instance = (PsapiEx) Native.loadLibrary("psapi", PsapiEx.class, DEFAULT_OPTIONS);
int GetModuleBaseNameW(Pointer hProcess, Pointer hmodule, char[] lpBaseName, int size);
}
public interface Kernel32Ex extends W32APIOptions {
Kernel32Ex instance = (Kernel32Ex) Native.loadLibrary("kernel32", Kernel32Ex.class, DEFAULT_OPTIONS);
boolean GetDiskFreeSpaceEx(String lpDirectoryName, LARGE_INTEGER.ByReference lpFreeBytesAvailable, LARGE_INTEGER.ByReference lpTotalNumberOfBytes, LARGE_INTEGER.ByReference lpTotalNumberOfFreeBytes);
int GetLastError();
Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer pointer);
//int OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer pointer);
boolean CloseHandle(HANDLE hObject);
void GetNativeSystemInfo(SYSTEM_INFO lpSystemInfo);
boolean IsWow64Process(HANDLE hProcess, IntByReference Wow64Process);
//LPVOID VirtualAllocEx(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
//int VirtualAllocEx(HANDLE hProcess, int lpAddress, int dwSize, DWORD flAllocationType, DWORD flProtect);
IntByReference VirtualAllocEx(HANDLE hProc, IntByReference addr, SIZE_T size, int allocType, int prot);
Pointer VirtualAllocEx(HANDLE hProc, int i, int lngMemLen2, int allocType, int pAGE_READWRITE);
boolean VirtualFreeEx(HANDLE hProcess, IntByReference lpAddress, SIZE_T dwSize, DWORD dwFreeType);
boolean WriteProcessMemory(HANDLE hProcess, IntByReference lpBaseAddress, Pointer lpBuffer, int len, IntByReference bytesWritten);
//boolean WriteProcessMemory(Pointer p, long address, Pointer buffer, int size, IntByReference written);
boolean ReadProcessMemory(Pointer hProcess, long inBaseAddress, Pointer outputBuffer, int nSize, IntByReference outNumberOfBytesRead);
int WriteProcessMemory(HANDLE handle, Pointer lngMemVar2, LVITEM_VISTA lvi,
int lngMemLen2, IntByReference byteIO);
int ReadProcessMemory(HANDLE handle, Pointer lngMemVar1,
Pointer lngVarPtr1, int lngMemLen1, IntByReference byteIO);
int VirtualFreeEx(HANDLE hProcess, Pointer lngMemVar1, int i,
int mEM_RELEASE);
}
public Api() { public Api() {
user32 = User32Ex.instance; user32 = User32Ex.instance;
psapi = PsapiEx.instance; psapi = PsapiEx.instance;
@@ -467,33 +254,38 @@ public class Api {
} }
public static HWND getWindowFromCursorPos() { public static HWND getWindowFromCursorPos() {
long[] getPos = new long[1]; long[] getPos = new long[1];
User32Ex.instance.GetCursorPos(getPos); User32Ex.instance.GetCursorPos(getPos);
HWND hwnd = User32Ex.instance.WindowFromPoint(getPos[0]); HWND hwnd = User32Ex.instance.WindowFromPoint(getPos[0]);
HWND childHwnd = getHiddenChildWindowFromPoint(hwnd, getPos[0]); HWND childHwnd = getHiddenChildWindowFromPoint(hwnd, getPos[0]);
hwnd = childHwnd; hwnd = childHwnd;
//System.out.println(getPos[0] + "," + getPos[1] + " int: " + x + ", " + y); // System.out.println(getPos[0] + "," + getPos[1] + " int: " + x + ", "
//System.out.println("child: " + GetHandleAsString(childHwnd) + " " + POINT_X(getPos[0]) +", " + POINT_Y(getPos[0])); // + y);
// System.out.println("child: " + GetHandleAsString(childHwnd) + " " +
// POINT_X(getPos[0]) +", " + POINT_Y(getPos[0]));
return hwnd; return hwnd;
} }
public static HWND getHiddenChildWindowFromPoint(HWND inHwnd, long point) public static HWND getHiddenChildWindowFromPoint(HWND inHwnd, long point) {
{
// int x = POINT_X(point);int y = POINT_Y(point); // int x = POINT_X(point);int y = POINT_Y(point);
long[] getPos = new long[1]; long[] getPos = new long[1];
getPos[0] = point; getPos[0] = point;
// if (!User32.instance.ClientToScreen(inHwnd, getPos)) return lHWND; // if (!User32.instance.ClientToScreen(inHwnd, getPos)) return lHWND;
// x = POINT_X(getPos[0]);y = POINT_Y(getPos[0]); // x = POINT_X(getPos[0]);y = POINT_Y(getPos[0]);
//System.out.println("ClientToScreen " + GetHandleAsString(inHwnd) + ", " + x + ", " + y); // System.out.println("ClientToScreen " + GetHandleAsString(inHwnd) +
// ", " + x + ", " + y);
if (!User32Ex.instance.ScreenToClient(inHwnd, getPos)) return inHwnd; // if point is not correct use original hwnd. if (!User32Ex.instance.ScreenToClient(inHwnd, getPos))
return inHwnd; // if point is not correct use original hwnd.
// x = POINT_X(getPos[0]);y = POINT_Y(getPos[0]); // x = POINT_X(getPos[0]);y = POINT_Y(getPos[0]);
//System.out.println("ScreenToClient " + GetHandleAsString(inHwnd) + ", " + x + ", " + y); // System.out.println("ScreenToClient " + GetHandleAsString(inHwnd) +
// ", " + x + ", " + y);
HWND childHwnd = User32Ex.instance.ChildWindowFromPointEx(inHwnd, getPos[0], CWP_ALL); HWND childHwnd = User32Ex.instance.ChildWindowFromPointEx(inHwnd, getPos[0], CWP_ALL);
//System.out.println("ChildWindowFromPointEx2 " + GetHandleAsString(inHwnd) + ", " + x + ", " + y + " = " + GetHandleAsString(childHwnd)); // System.out.println("ChildWindowFromPointEx2 " +
// GetHandleAsString(inHwnd) + ", " + x + ", " + y + " = " +
// GetHandleAsString(childHwnd));
if (childHwnd == null) // if childHwnd is not correct use original hwnd. if (childHwnd == null) // if childHwnd is not correct use original hwnd.
return inHwnd; return inHwnd;
@@ -593,22 +385,25 @@ public class Api {
user32.GetMenuString(hmenu, position, buffer, 256, 0x0400); user32.GetMenuString(hmenu, position, buffer, 256, 0x0400);
return Native.toString(buffer); return Native.toString(buffer);
/* /*
Api.WinDefExt.MENUITEMINFO mii = new Api.WinDefExt.MENUITEMINFO(); // = (MENUITEMINFO)Api.MENUITEMINFO.newInstance(Api.MENUITEMINFO.class); * Api.WinDefExt.MENUITEMINFO mii = new Api.WinDefExt.MENUITEMINFO(); //
mii.fMask = Api.WinDefExt.MENUITEMINFO.MIIM_TYPE; * = (MENUITEMINFO)Api.MENUITEMINFO.newInstance(Api.MENUITEMINFO.class);
mii.fType = Api.WinDefExt.MENUITEMINFO.MFT_STRING; * mii.fMask = Api.WinDefExt.MENUITEMINFO.MIIM_TYPE; mii.fType =
mii.cch = 0; * Api.WinDefExt.MENUITEMINFO.MFT_STRING; mii.cch = 0; mii.dwTypeData =
mii.dwTypeData = ""; * "";
@SuppressWarnings("unused") *
boolean result = Api.User32.instance.GetMenuItemInfoA(hmenu, position, true, mii); * @SuppressWarnings("unused") boolean result =
//System.out.println(position + " GetMenuItemInfo (" + result + ") : " + mii.cch + " " + mii.dwTypeData); * Api.User32.instance.GetMenuItemInfoA(hmenu, position, true, mii);
mii.fMask = Api.WinDefExt.MENUITEMINFO.MIIM_TYPE; * //System.out.println(position + " GetMenuItemInfo (" + result +
mii.fType = Api.WinDefExt.MENUITEMINFO.MFT_STRING; * ") : " + mii.cch + " " + mii.dwTypeData); mii.fMask =
mii.cch += 1; * Api.WinDefExt.MENUITEMINFO.MIIM_TYPE; mii.fType =
mii.dwTypeData = "";//new String(new char[mii.cch]).replace("\0", " "); //buffer string with spaces * Api.WinDefExt.MENUITEMINFO.MFT_STRING; mii.cch += 1; mii.dwTypeData =
result = Api.User32.instance.GetMenuItemInfoA(hmenu, position, true, mii); * "";//new String(new char[mii.cch]).replace("\0", " "); //buffer
//System.out.println(position + " GetMenuItemInfo2 (" + result + ") Text: " + mii.dwTypeData + " " + mii.cch + " " + mii.wID); * string with spaces result =
//System.out.println("last error: " + Api.Kernel32.instance.GetLastError()); * Api.User32.instance.GetMenuItemInfoA(hmenu, position, true, mii);
return mii.dwTypeData; * //System.out.println(position + " GetMenuItemInfo2 (" + result +
* ") Text: " + mii.dwTypeData + " " + mii.cch + " " + mii.wID);
* //System.out.println("last error: " +
* Api.Kernel32.instance.GetLastError()); return mii.dwTypeData;
*/ */
} }
@@ -616,8 +411,10 @@ public class Api {
Point windowPoint = new Point(); Point windowPoint = new Point();
RECT rect = new RECT(); RECT rect = new RECT();
user32.GetWindowRect(handle, rect); user32.GetWindowRect(handle, rect);
//System.out.println("rect: l" + rect.left + ",t" + rect.top + ",r" + rect.right + ",b" + rect.bottom); // System.out.println("rect: l" + rect.left + ",t" + rect.top + ",r" +
//user32.MapWindowPoints(user32.GetDesktopWindow(), user32.GetParent(handle), rect, 2); // rect.right + ",b" + rect.bottom);
// user32.MapWindowPoints(user32.GetDesktopWindow(),
// user32.GetParent(handle), rect, 2);
windowPoint.x = ((rect.right - rect.left) / 2) + rect.left; windowPoint.x = ((rect.right - rect.left) / 2) + rect.left;
windowPoint.y = ((rect.bottom - rect.top) / 2) + rect.top; windowPoint.y = ((rect.bottom - rect.top) / 2) + rect.top;
return windowPoint; return windowPoint;
@@ -627,8 +424,10 @@ public class Api {
Point windowPoint = new Point(); Point windowPoint = new Point();
RECT rect = new RECT(); RECT rect = new RECT();
user32.GetMenuItemRect(handle, hMenu, pos, rect); user32.GetMenuItemRect(handle, hMenu, pos, rect);
//System.out.println("rect: l" + rect.left + ",t" + rect.top + ",r" + rect.right + ",b" + rect.bottom); // System.out.println("rect: l" + rect.left + ",t" + rect.top + ",r" +
//user32.MapWindowPoints(user32.GetDesktopWindow(), user32.GetParent(handle), rect, 2); // rect.right + ",b" + rect.bottom);
// user32.MapWindowPoints(user32.GetDesktopWindow(),
// user32.GetParent(handle), rect, 2);
windowPoint.x = ((rect.right - rect.left) / 2) + rect.left; windowPoint.x = ((rect.right - rect.left) / 2) + rect.left;
windowPoint.y = ((rect.bottom - rect.top) / 2) + rect.top; windowPoint.y = ((rect.bottom - rect.top) / 2) + rect.top;
return windowPoint; return windowPoint;
@@ -645,14 +444,16 @@ public class Api {
Kernel32Ex.instance.GetDiskFreeSpaceEx(target, lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes); Kernel32Ex.instance.GetDiskFreeSpaceEx(target, lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes);
double freeBytes = lpTotalNumberOfFreeBytes.getValue(); double freeBytes = lpTotalNumberOfFreeBytes.getValue();
double totalBytes = lpTotalNumberOfBytes.getValue(); double totalBytes = lpTotalNumberOfBytes.getValue();
//System.out.println("freespace " + humanReadableByteCount(freeBytes) + "/ totalspace " + humanReadableByteCount(totalBytes)); // System.out.println("freespace " + humanReadableByteCount(freeBytes) +
// "/ totalspace " + humanReadableByteCount(totalBytes));
return (int) (((totalBytes - freeBytes) / totalBytes) * 100.0); return (int) (((totalBytes - freeBytes) / totalBytes) * 100.0);
} }
public static String humanReadableByteCount(double bytes) { public static String humanReadableByteCount(double bytes) {
boolean si = true; boolean si = true;
int unit = si ? 1000 : 1024; int unit = si ? 1000 : 1024;
if (bytes < unit) return bytes + " B"; if (bytes < unit)
return bytes + " B";
int exp = (int) (Math.log(bytes) / Math.log(unit)); int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
@@ -661,7 +462,8 @@ public class Api {
public static void highlightWindow(HWND hwnd) { public static void highlightWindow(HWND hwnd) {
RECT rect = new RECT(); RECT rect = new RECT();
User32Ex.instance.GetWindowRect(hwnd, rect); User32Ex.instance.GetWindowRect(hwnd, rect);
//System.out.println("RECT: " + rect.left + "," + rect.top + "," + (rect.right - rect.left) + "," + (rect.bottom - rect.top)); // System.out.println("RECT: " + rect.left + "," + rect.top + "," +
// (rect.right - rect.left) + "," + (rect.bottom - rect.top));
highlightWindow(hwnd, 0, 0, rect.right - rect.left, rect.bottom - rect.top); highlightWindow(hwnd, 0, 0, rect.right - rect.left, rect.bottom - rect.top);
} }
@@ -669,16 +471,20 @@ public class Api {
public static void highlightWindow(HWND hwnd, int x, int y, int x2, int y2) { public static void highlightWindow(HWND hwnd, int x, int y, int x2, int y2) {
// COLORREF i.e. 0x00804070 Red = 0x70 green = 0x40 blue = 0x80 // COLORREF i.e. 0x00804070 Red = 0x70 green = 0x40 blue = 0x80
// g_hRectanglePen = CreatePen (PS_SOLID, 3, RGB(256, 0, 0)); // g_hRectanglePen = CreatePen (PS_SOLID, 3, RGB(256, 0, 0));
HPEN rectPen = Gdi32Ex.instance.CreatePen(PS_SOLID, 3, 0x00000099); //RGB(255, 0, 0) HPEN rectPen = Gdi32Ex.instance.CreatePen(PS_SOLID, 3, 0x00000099); // RGB(255,
// 0,
// 0)
HDC dc = User32Ex.instance.GetWindowDC(hwnd); HDC dc = User32Ex.instance.GetWindowDC(hwnd);
if (dc != null) { if (dc != null) {
// Select our created pen into the DC and backup the previous pen. // Select our created pen into the DC and backup the previous pen.
HANDLE prevPen = Gdi32Ex.instance.SelectObject(dc, rectPen); HANDLE prevPen = Gdi32Ex.instance.SelectObject(dc, rectPen);
// Select a transparent brush into the DC and backup the previous brush. // Select a transparent brush into the DC and backup the previous
// brush.
HANDLE prevBrush = Gdi32Ex.instance.SelectObject(dc, Gdi32Ex.instance.GetStockObject(HOLLOW_BRUSH)); HANDLE prevBrush = Gdi32Ex.instance.SelectObject(dc, Gdi32Ex.instance.GetStockObject(HOLLOW_BRUSH));
// Draw a rectangle in the DC covering the entire window area of the found window. // Draw a rectangle in the DC covering the entire window area of the
// found window.
Gdi32Ex.instance.Rectangle(dc, x, y, x2, y2); Gdi32Ex.instance.Rectangle(dc, x, y, x2, y2);
// Reinsert the previous pen and brush into the found window's DC. // Reinsert the previous pen and brush into the found window's DC.
@@ -712,38 +518,34 @@ public class Api {
return false; return false;
} }
public static boolean isProcess64bit(int pid) public static boolean isProcess64bit(int pid) {
{
try { try {
SYSTEM_INFO lpSystemInfo = new SYSTEM_INFO(); SYSTEM_INFO lpSystemInfo = new SYSTEM_INFO();
Kernel32Ex.instance.GetNativeSystemInfo(lpSystemInfo); Kernel32Ex.instance.GetNativeSystemInfo(lpSystemInfo);
if (lpSystemInfo.processorArchitecture.dwOemID.intValue() == 0) if (lpSystemInfo.processorArchitecture.dwOemID.intValue() == 0) {
{
System.out.println("intel x86"); // not a 64 bit os System.out.println("intel x86"); // not a 64 bit os
return false; return false;
} }
Pointer process = Kernel32Ex.instance.OpenProcess(Api.PROCESS_QUERY_INFORMATION | Api.PROCESS_VM_READ, false, new Pointer(pid)); Pointer process = Kernel32Ex.instance.OpenProcess(Api.PROCESS_QUERY_INFORMATION | Api.PROCESS_VM_READ, false, new Pointer(pid));
IntByReference isWow64 = new IntByReference(0); IntByReference isWow64 = new IntByReference(0);
if (!Kernel32Ex.instance.IsWow64Process(new HANDLE(process), isWow64)) if (!Kernel32Ex.instance.IsWow64Process(new HANDLE(process), isWow64)) {
{
// handle error // handle error
} }
//System.out.println("isProcess64bit " + pid + " = " + isWow64.getValue()); // System.out.println("isProcess64bit " + pid + " = " +
// isWow64.getValue());
Kernel32Ex.instance.CloseHandle(new HANDLE(process)); Kernel32Ex.instance.CloseHandle(new HANDLE(process));
if (isWow64.getValue() == 1) if (isWow64.getValue() == 1)
return false; return false;
return true; return true;
// CloseHandle() // CloseHandle()
} catch(Exception ex) } catch (Exception ex) {
{
ex.printStackTrace(); ex.printStackTrace();
} }
return false; return false;
} }
public static HWND FindMainWindowFromPid(final long targetProcessId) { public static HWND FindMainWindowFromPid(final long targetProcessId) {
final List<HWND> resultList = new ArrayList<HWND>(); final List<HWND> resultList = new ArrayList<HWND>();
class ParentWindowCallback implements WinUser.WNDENUMPROC { class ParentWindowCallback implements WinUser.WNDENUMPROC {
@Override @Override
@@ -758,27 +560,27 @@ public class Api {
} }
} }
Api.User32Ex.instance.EnumWindows(new ParentWindowCallback(), 0); User32Ex.instance.EnumWindows(new ParentWindowCallback(), 0);
if (!resultList.isEmpty()) if (!resultList.isEmpty())
return resultList.get(0); return resultList.get(0);
return null; return null;
} }
public static void SelectListViewItemByIndex(HWND listViewHwnd, int index) public static void SelectListViewItemByIndex(HWND listViewHwnd, int index) {
{
/* /*
HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, 0x0000c130); * HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE |
LPVOID epLvi = VirtualAllocEx(hProcess, NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); * PROCESS_VM_OPERATION, FALSE, 0x0000c130); LPVOID epLvi =
* VirtualAllocEx(hProcess, NULL, 4096, MEM_RESERVE | MEM_COMMIT,
LVITEM lvi; * PAGE_READWRITE);
lvi.state = LVIS_FOCUSED | LVIS_SELECTED; *
lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED; * LVITEM lvi; lvi.state = LVIS_FOCUSED | LVIS_SELECTED; lvi.stateMask =
SIZE_T cbWritten = 0; * LVIS_FOCUSED | LVIS_SELECTED; SIZE_T cbWritten = 0;
WriteProcessMemory(hProcess, epLvi, &lvi, sizeof(lvi), &cbWritten); * WriteProcessMemory(hProcess, epLvi, &lvi, sizeof(lvi), &cbWritten);
DWORD dw = SendMessage((HWND)0x00020C4C, LVM_SETITEMSTATE, 1, (LPARAM)epLvi); * DWORD dw = SendMessage((HWND)0x00020C4C, LVM_SETITEMSTATE, 1,
* (LPARAM)epLvi);
VirtualFreeEx(hProcess, epLvi, 4096, MEM_DECOMMIT | MEM_RELEASE); *
CloseHandle(hProcess); * VirtualFreeEx(hProcess, epLvi, 4096, MEM_DECOMMIT | MEM_RELEASE);
* CloseHandle(hProcess);
*/ */
PointerByReference pointer = new PointerByReference(); PointerByReference pointer = new PointerByReference();
User32Ex.instance.GetWindowThreadProcessId(listViewHwnd, pointer); User32Ex.instance.GetWindowThreadProcessId(listViewHwnd, pointer);
@@ -792,17 +594,16 @@ public class Api {
lvitem.stateMask = LVIS_FOCUSED | LVIS_SELECTED; lvitem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
lvitem.state = LVIS_FOCUSED | LVIS_SELECTED; lvitem.state = LVIS_FOCUSED | LVIS_SELECTED;
IntByReference bytesWritten = new IntByReference(); IntByReference bytesWritten = new IntByReference();
Api.Kernel32Ex.instance.WriteProcessMemory(new HANDLE(process), epLvi, lvitem.getPointer(), lvitem.size(),bytesWritten); Kernel32Ex.instance.WriteProcessMemory(new HANDLE(process), epLvi, lvitem.getPointer(), lvitem.size(), bytesWritten);
Api.User32Ex.instance.SendMessage(listViewHwnd, LVM_SETITEMSTATE, new WPARAM(index), lvitem); User32Ex.instance.SendMessage(listViewHwnd, LVM_SETITEMSTATE, new WPARAM(index), lvitem);
Api.Kernel32Ex.instance.VirtualFreeEx(new HANDLE(process), epLvi, new SIZE_T(4096), new DWORD(MEM_DECOMMIT | MEM_RELEASE)); Kernel32Ex.instance.VirtualFreeEx(new HANDLE(process), epLvi, new SIZE_T(4096), new DWORD(MEM_DECOMMIT | MEM_RELEASE));
Api.Kernel32Ex.instance.CloseHandle(new HANDLE(process)); Kernel32Ex.instance.CloseHandle(new HANDLE(process));
} }
public static void SelectListItemByIndex(HWND listHwnd, int index) public static void SelectListItemByIndex(HWND listHwnd, int index) {
{
// com.sun.jna.platform.win32.User32.INSTANCE // com.sun.jna.platform.win32.User32.INSTANCE
Api.User32Ex.instance.SendMessage(listHwnd, LB_SETCURSEL, new WPARAM(index), new LPARAM(0)); User32Ex.instance.SendMessage(listHwnd, LB_SETCURSEL, new WPARAM(index), new LPARAM(0));
SelectListViewItemByIndex(listHwnd, index); SelectListViewItemByIndex(listHwnd, index);
// GetListViewItemByIndex(listHwnd, index); // GetListViewItemByIndex(listHwnd, index);
// LVITEM lvitem = new LVITEM(); // LVITEM lvitem = new LVITEM();
@@ -839,7 +640,6 @@ public class Api {
return new WPARAM(itemID); return new WPARAM(itemID);
} }
public HWND findTopWindow(String text, String className) { public HWND findTopWindow(String text, String className) {
hWndFound = null; hWndFound = null;
user32.EnumWindows(new WinUser.WNDENUMPROC() { user32.EnumWindows(new WinUser.WNDENUMPROC() {

View File

@@ -5,7 +5,6 @@
* last modified by ejakubowski7@gmail.com * last modified by ejakubowski7@gmail.com
*/ */
package org.synthuse; package org.synthuse;
//import java.awt.event.KeyEvent; //import java.awt.event.KeyEvent;
@@ -23,18 +22,19 @@ import com.sun.jna.win32.W32APIOptions;
public class KeyboardHook implements Runnable { public class KeyboardHook implements Runnable {
// Keyboard event class, interface, and array list // Keyboard event class, interface, and array list
public static class TargetKeyPress { public static class TargetKeyPress {
int idNumber; int idNumber;
int targetKeyCode; int targetKeyCode;
boolean withShift, withCtrl, withAlt; boolean withShift, withCtrl, withAlt;
public TargetKeyPress(int targetKeyCode) { public TargetKeyPress(int targetKeyCode) {
this.targetKeyCode = targetKeyCode; this.targetKeyCode = targetKeyCode;
this.withShift = false; this.withShift = false;
this.withCtrl = false; this.withCtrl = false;
this.withAlt = false; this.withAlt = false;
} }
public TargetKeyPress(int idNumber, int targetKeyCode, boolean withShift, boolean withCtrl, boolean withAlt) { public TargetKeyPress(int idNumber, int targetKeyCode, boolean withShift, boolean withCtrl, boolean withAlt) {
this.idNumber = idNumber; this.idNumber = idNumber;
this.targetKeyCode = targetKeyCode; this.targetKeyCode = targetKeyCode;
@@ -42,6 +42,7 @@ public class KeyboardHook implements Runnable{
this.withCtrl = withCtrl; this.withCtrl = withCtrl;
this.withAlt = withAlt; this.withAlt = withAlt;
} }
public TargetKeyPress(int targetKeyCode, boolean withShift, boolean withCtrl, boolean withAlt) { public TargetKeyPress(int targetKeyCode, boolean withShift, boolean withCtrl, boolean withAlt) {
this.targetKeyCode = targetKeyCode; this.targetKeyCode = targetKeyCode;
this.withShift = withShift; this.withShift = withShift;
@@ -50,14 +51,23 @@ public class KeyboardHook implements Runnable{
} }
} }
public static List<TargetKeyPress> targetList = Collections.synchronizedList(new ArrayList<TargetKeyPress>());// all keys we want to throw events on public static List<TargetKeyPress> targetList = Collections.synchronizedList(new ArrayList<TargetKeyPress>());// all
// keys
// we
// want
// to
// throw
// events
// on
public static interface KeyboardEvents { public static interface KeyboardEvents {
void keyPressed(TargetKeyPress target); void keyPressed(TargetKeyPress target);
} }
public KeyboardEvents events = new KeyboardEvents() { public KeyboardEvents events = new KeyboardEvents() {
public void keyPressed(TargetKeyPress target) { public void keyPressed(TargetKeyPress target) {
//System.out.println("target key pressed: " + target.targetKeyCode); // System.out.println("target key pressed: " +
// target.targetKeyCode);
} }
}; };
@@ -84,28 +94,39 @@ public class KeyboardHook implements Runnable{
private static Thread khThread = null; private static Thread khThread = null;
public interface User32Ex extends W32APIOptions { public interface User32Ex extends W32APIOptions {
User32Ex instance = (User32Ex) Native.loadLibrary("user32", User32Ex.class, DEFAULT_OPTIONS); User32Ex instance = (User32Ex) Native.loadLibrary("user32", User32Ex.class, DEFAULT_OPTIONS);
LRESULT LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); LRESULT LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HMODULE hMod, int dwThreadId); HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HMODULE hMod, int dwThreadId);
LRESULT CallNextHookEx(HHOOK idHook, int nCode, WPARAM wParam, LPARAM lParam); LRESULT CallNextHookEx(HHOOK idHook, int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CallNextHookEx(HHOOK idHook, int nCode, WPARAM wParam, Pointer lParam); LRESULT CallNextHookEx(HHOOK idHook, int nCode, WPARAM wParam, Pointer lParam);
boolean PeekMessage(MSG lpMsg, HWND hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg); boolean PeekMessage(MSG lpMsg, HWND hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg);
boolean UnhookWindowsHookEx(HHOOK idHook); boolean UnhookWindowsHookEx(HHOOK idHook);
short GetKeyState(int nVirtKey); short GetKeyState(int nVirtKey);
short GetAsyncKeyState(int nVirtKey); short GetAsyncKeyState(int nVirtKey);
/* /*
DWORD WINAPI MsgWaitForMultipleObjects( * DWORD WINAPI MsgWaitForMultipleObjects( __in DWORD nCount, //The
__in DWORD nCount, //The number of object handles in the array pointed to by pHandles. * number of object handles in the array pointed to by pHandles. __in
__in const HANDLE *pHandles, //An array of object handles. * const HANDLE *pHandles, //An array of object handles. __in BOOL
__in BOOL bWaitAll, //If this parameter is TRUE, the function returns when the states of all objects in the pHandles array have been set to signaled and an input event has been received. * bWaitAll, //If this parameter is TRUE, the function returns when the
__in DWORD dwMilliseconds, //if dwMilliseconds is INFINITE, the function will return only when the specified objects are signaled. * states of all objects in the pHandles array have been set to signaled
__in DWORD dwWakeMask //The input types for which an input event object handle will be added to the array of object handles. * and an input event has been received. __in DWORD dwMilliseconds, //if
);*/ * dwMilliseconds is INFINITE, the function will return only when the
* specified objects are signaled. __in DWORD dwWakeMask //The input
* types for which an input event object handle will be added to the
* array of object handles. );
*/
int MsgWaitForMultipleObjects(int nCount, Pointer pHandles, boolean bWaitAll, int dwMilliSeconds, int dwWakeMask); int MsgWaitForMultipleObjects(int nCount, Pointer pHandles, boolean bWaitAll, int dwMilliSeconds, int dwWakeMask);
boolean RegisterHotKey(Pointer hWnd, int id, int fsModifiers, int vk); boolean RegisterHotKey(Pointer hWnd, int id, int fsModifiers, int vk);
// public static interface HOOKPROC extends StdCallCallback { // public static interface HOOKPROC extends StdCallCallback {
@@ -130,7 +151,14 @@ public class KeyboardHook implements Runnable{
@SuppressWarnings("unused") @SuppressWarnings("unused")
public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam) { public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam) {
// System.out.println("here " + lParam.vkCode); // System.out.println("here " + lParam.vkCode);
TargetKeyPress target = getTargetKeyPressed(lParam.vkCode); //find if this is a target key pressed TargetKeyPress target = getTargetKeyPressed(lParam.vkCode); // find
// if
// this
// is
// a
// target
// key
// pressed
if (target != null) if (target != null)
events.keyPressed(target); events.keyPressed(target);
// if (lParam.vkCode == 87) //w // if (lParam.vkCode == 87) //w
@@ -149,7 +177,9 @@ public class KeyboardHook implements Runnable{
while (!quit) { while (!quit) {
User32.INSTANCE.PeekMessage(msg, null, 0, 0, 1); User32.INSTANCE.PeekMessage(msg, null, 0, 0, 1);
if (msg.message == User32.WM_HOTKEY){ // && msg.wParam.intValue() == 1 if (msg.message == User32.WM_HOTKEY) { // &&
// msg.wParam.intValue()
// == 1
// System.out.println("Hot key pressed!"); // System.out.println("Hot key pressed!");
msg = new MSG(); // must clear msg so it doesn't repeat msg = new MSG(); // must clear msg so it doesn't repeat
} }
@@ -164,7 +194,8 @@ public class KeyboardHook implements Runnable{
// Create HotKeys Windows hook and wait until quit == true // Create HotKeys Windows hook and wait until quit == true
public void createHotKeysHook() { public void createHotKeysHook() {
registerAllHotKeys(); registerAllHotKeys();
//User32Ex.instance.MsgWaitForMultipleObjects(0, Pointer.NULL, true, INFINITE, QS_HOTKEY); // User32Ex.instance.MsgWaitForMultipleObjects(0, Pointer.NULL, true,
// INFINITE, QS_HOTKEY);
// System.out.println("starting message loop"); // System.out.println("starting message loop");
MSG msg = new MSG(); MSG msg = new MSG();
@@ -172,7 +203,9 @@ public class KeyboardHook implements Runnable{
while (!quit) { while (!quit) {
User32.INSTANCE.PeekMessage(msg, null, 0, 0, 1); User32.INSTANCE.PeekMessage(msg, null, 0, 0, 1);
if (msg.message == User32.WM_HOTKEY){ // && msg.wParam.intValue() == 1 if (msg.message == User32.WM_HOTKEY) { // &&
// msg.wParam.intValue()
// == 1
// System.out.println("Hot key pressed " + msg.wParam); // System.out.println("Hot key pressed " + msg.wParam);
TargetKeyPress target = findTargetKeyPressById(msg.wParam.intValue()); TargetKeyPress target = findTargetKeyPressById(msg.wParam.intValue());
if (target != null) if (target != null)
@@ -201,8 +234,7 @@ public class KeyboardHook implements Runnable{
// stops Keyboard hook and causes the unhook command to be called // stops Keyboard hook and causes the unhook command to be called
public static void stopKeyboardHook() { public static void stopKeyboardHook() {
quit = true; quit = true;
if (khThread != null) if (khThread != null) {
{
try { try {
khThread.join(); khThread.join();
} catch (Exception e) { } catch (Exception e) {
@@ -211,7 +243,8 @@ public class KeyboardHook implements Runnable{
} }
} }
// search target keyboard event list for a match and return it otherwise return null if no match // search target keyboard event list for a match and return it otherwise
// return null if no match
private TargetKeyPress getTargetKeyPressed(int keyCode) { private TargetKeyPress getTargetKeyPressed(int keyCode) {
TargetKeyPress target = null; TargetKeyPress target = null;
@@ -229,8 +262,7 @@ public class KeyboardHook implements Runnable{
return target; return target;
} }
private TargetKeyPress findTargetKeyPressById(int idNumber) private TargetKeyPress findTargetKeyPressById(int idNumber) {
{
TargetKeyPress target = null; TargetKeyPress target = null;
for (TargetKeyPress tkp : KeyboardHook.targetList) { for (TargetKeyPress tkp : KeyboardHook.targetList) {
if (tkp.idNumber == idNumber) if (tkp.idNumber == idNumber)
@@ -244,7 +276,6 @@ public class KeyboardHook implements Runnable{
KeyboardHook.targetList.clear(); KeyboardHook.targetList.clear();
} }
// add more target keys to watch for // add more target keys to watch for
public static void addKeyEvent(int targetKeyCode, boolean withShift, boolean withCtrl, boolean withAlt) { public static void addKeyEvent(int targetKeyCode, boolean withShift, boolean withCtrl, boolean withAlt) {
KeyboardHook.targetList.add(new TargetKeyPress(KeyboardHook.targetList.size() + 1, targetKeyCode, withShift, withCtrl, withAlt)); KeyboardHook.targetList.add(new TargetKeyPress(KeyboardHook.targetList.size() + 1, targetKeyCode, withShift, withCtrl, withAlt));
@@ -255,12 +286,14 @@ public class KeyboardHook implements Runnable{
KeyboardHook.targetList.add(new TargetKeyPress(targetKeyCode)); KeyboardHook.targetList.add(new TargetKeyPress(targetKeyCode));
} }
private void registerAllHotKeys() // must register hot keys in the same
private void registerAllHotKeys() // must register hot keys in the same thread that is watching for hotkey messages // thread that is watching for hotkey
// messages
{ {
// System.out.println("registering hotkeys"); // System.out.println("registering hotkeys");
for (TargetKeyPress tkp : KeyboardHook.targetList) { for (TargetKeyPress tkp : KeyboardHook.targetList) {
//BOOL WINAPI RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk); // BOOL WINAPI RegisterHotKey(HWND hWnd, int id, UINT fsModifiers,
// UINT vk);
int modifiers = User32.MOD_NOREPEAT; int modifiers = User32.MOD_NOREPEAT;
if (tkp.withShift) if (tkp.withShift)
modifiers = modifiers | User32.MOD_SHIFT; modifiers = modifiers | User32.MOD_SHIFT;
@@ -268,21 +301,22 @@ public class KeyboardHook implements Runnable{
modifiers = modifiers | User32.MOD_CONTROL; modifiers = modifiers | User32.MOD_CONTROL;
if (tkp.withAlt) if (tkp.withAlt)
modifiers = modifiers | User32.MOD_ALT; modifiers = modifiers | User32.MOD_ALT;
//System.out.println("RegisterHotKey " + tkp.idNumber + "," + modifiers + ", " + tkp.targetKeyCode); // System.out.println("RegisterHotKey " + tkp.idNumber + "," +
// modifiers + ", " + tkp.targetKeyCode);
if (!User32.INSTANCE.RegisterHotKey(new WinDef.HWND(Pointer.NULL), tkp.idNumber, modifiers, tkp.targetKeyCode)) if (!User32.INSTANCE.RegisterHotKey(new WinDef.HWND(Pointer.NULL), tkp.idNumber, modifiers, tkp.targetKeyCode)) {
{
System.out.println("Couldn't register hotkey " + tkp.targetKeyCode); System.out.println("Couldn't register hotkey " + tkp.targetKeyCode);
} }
} }
} }
private void unregisterAllHotKeys() // must register hot keys in the same thread that is watching for hotkey messages private void unregisterAllHotKeys() // must register hot keys in the same
// thread that is watching for hotkey
// messages
{ {
// System.out.println("unregistering hotkeys"); // System.out.println("unregistering hotkeys");
for (TargetKeyPress tkp : KeyboardHook.targetList) { for (TargetKeyPress tkp : KeyboardHook.targetList) {
if (!User32.INSTANCE.UnregisterHotKey(Pointer.NULL, tkp.idNumber)) if (!User32.INSTANCE.UnregisterHotKey(Pointer.NULL, tkp.idNumber)) {
{
System.out.println("Couldn't unregister hotkey " + tkp.targetKeyCode); System.out.println("Couldn't unregister hotkey " + tkp.targetKeyCode);
} }
} }
@@ -310,25 +344,20 @@ public class KeyboardHook implements Runnable{
} }
/* /*
// testing * // testing public static void main(String[] args) throws Exception {
public static void main(String[] args) throws Exception { * //add target keys KeyboardHook.addKeyEvent(KeyEvent.VK_3, true, true,
//add target keys * false); KeyboardHook.addKeyEvent(KeyEvent.VK_5, false, true, false);
KeyboardHook.addKeyEvent(KeyEvent.VK_3, true, true, false); * KeyboardHook.addKeyEvent(KeyEvent.VK_Q);
KeyboardHook.addKeyEvent(KeyEvent.VK_5, false, true, false); *
KeyboardHook.addKeyEvent(KeyEvent.VK_Q); * //add global hook and event
* KeyboardHook.StartGlobalKeyboardHookThreaded(new
//add global hook and event * KeyboardHook.KeyboardEvents() {
KeyboardHook.StartGlobalKeyboardHookThreaded(new KeyboardHook.KeyboardEvents() { *
@Override * @Override public void keyPressed(KeyboardHook.TargetKeyPress target) {
public void keyPressed(KeyboardHook.TargetKeyPress target) { * System.out.println("target key pressed " + target.targetKeyCode); if
System.out.println("target key pressed " + target.targetKeyCode); * (target.targetKeyCode == KeyEvent.VK_Q){ // if Q was pressed then unhook
if (target.targetKeyCode == KeyEvent.VK_Q){ // if Q was pressed then unhook * KeyboardHook.stopGlobalKeyboardHook(); System.out.println("unhooking"); }
KeyboardHook.stopGlobalKeyboardHook(); * } }); }
System.out.println("unhooking");
}
}
});
}
*/ */
} }

View File

@@ -1,103 +0,0 @@
/*
* Copyright 2014, Synthuse.org
* Released under the Apache Version 2.0 License.
*
* last modified by ejakubowski7@gmail.com
*/
package org.synthuse;
import java.math.BigInteger;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.*;
public class MenuInfo {
public HMENU hmenu = null;
public String hmenuStr = "";
public String hwndStr = "";
public int menuCount = 0;
public String text = "";
public String unaltered = "";
public int id = 0;
public int position = 0;
public boolean hasSubMenu = false;
public HMENU submenu = null;
public String submenuStr = "";
public int submenuCount = 0;
public String center = "";
public MenuInfo(String hwndStr, HMENU hmenu) {
this.hwndStr = hwndStr;
loadMenuBase(hmenu);
}
public MenuInfo(String hwndStr, HMENU hmenu, int position) {
this.hwndStr = hwndStr;
loadMenuBase(hmenu);
if (this.menuCount > 0)
loadMenuDetails(hmenu, position);
}
public void loadMenuBase(HMENU hmenu) {
Api api = new Api();
this.hmenu = hmenu;
this.hmenuStr = GetHandleMenuAsString(hmenu);
this.menuCount = api.user32.GetMenuItemCount(hmenu);
}
public void loadMenuDetails(HMENU hmenu, int position) {
Api api = new Api();
this.position = position;
this.unaltered = api.GetMenuItemText(hmenu, position);
this.text = unaltered;
if (this.unaltered.contains("\t"))
this.text = this.text.substring(0, this.text.indexOf("\t"));
this.text = text.replaceAll("[^a-zA-Z0-9.,\\+ ]", "");
this.id = api.user32.GetMenuItemID(hmenu, position);
/*
HWND hWnd = Api.GetHandleFromString(hwndStr);
RECT rect = new RECT();
api.user32.GetMenuItemRect(hWnd, hmenu, position, rect);
int centerX = ((rect.right - rect.left) / 2) + rect.left;
int centerY = ((rect.bottom - rect.top) / 2) + rect.top;
this.center = centerX + "," + centerY;
*/
HMENU submenu = api.user32.GetSubMenu(hmenu, position);
if (submenu != null) {
int subCount = api.user32.GetMenuItemCount(submenu);
if (subCount > 0) {
this.hasSubMenu = true;
this.submenu = submenu;
this.submenuStr = GetHandleMenuAsString(submenu);
this.submenuCount = subCount;
}
}
}
public static String GetHandleMenuAsString(HMENU hmenu) {
if (hmenu == null)
return "0";
//String longHexStr = hWnd.toString().substring("native@".length());
//String longHexStr = hmenu.getPointer()
String longHexStr = hmenu.getPointer().toString().substring("native@0x".length());
long l = new BigInteger(longHexStr, 16).longValue();
return l + "";
}
public static HMENU GetHandleMenuFromString(String hmenu) {
if (hmenu == null)
return null;
if (hmenu.isEmpty())
return null;
String cleanNumericHandle = hmenu.replaceAll("[^\\d.]", "");
try {
return (new HMENU(new Pointer(Long.parseLong(cleanNumericHandle))));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@@ -167,18 +167,42 @@ public class RobotMacro {
Robot robot = new Robot(); Robot robot = new Robot();
int keyCode = 0; int keyCode = 0;
switch (functionNum) { switch (functionNum) {
case 1: keyCode = KeyEvent.VK_F1; break; case 1:
case 2: keyCode = KeyEvent.VK_F2; break; keyCode = KeyEvent.VK_F1;
case 3: keyCode = KeyEvent.VK_F3; break; break;
case 4: keyCode = KeyEvent.VK_F4; break; case 2:
case 5: keyCode = KeyEvent.VK_F5; break; keyCode = KeyEvent.VK_F2;
case 6: keyCode = KeyEvent.VK_F6; break; break;
case 7: keyCode = KeyEvent.VK_F7; break; case 3:
case 8: keyCode = KeyEvent.VK_F8; break; keyCode = KeyEvent.VK_F3;
case 9: keyCode = KeyEvent.VK_F9; break; break;
case 10: keyCode = KeyEvent.VK_F10; break; case 4:
case 11: keyCode = KeyEvent.VK_F11; break; keyCode = KeyEvent.VK_F4;
case 12: keyCode = KeyEvent.VK_F12; break; break;
case 5:
keyCode = KeyEvent.VK_F5;
break;
case 6:
keyCode = KeyEvent.VK_F6;
break;
case 7:
keyCode = KeyEvent.VK_F7;
break;
case 8:
keyCode = KeyEvent.VK_F8;
break;
case 9:
keyCode = KeyEvent.VK_F9;
break;
case 10:
keyCode = KeyEvent.VK_F10;
break;
case 11:
keyCode = KeyEvent.VK_F11;
break;
case 12:
keyCode = KeyEvent.VK_F12;
break;
} }
robot.keyPress(keyCode); robot.keyPress(keyCode);
robot.keyRelease(keyCode); robot.keyRelease(keyCode);
@@ -195,53 +219,14 @@ public class RobotMacro {
lastException = e; lastException = e;
} }
} }
/* SendKeys Special Keys List
{BACKSPACE}, {BS}, or {BKSP}
{BREAK}
{CAPSLOCK}
{DELETE} or {DEL}
{DOWN}
{END}
{ENTER} or ~
{ESC}
{HELP}
{HOME}
{INSERT} or {INS}
{LEFT}
{NUMLOCK}
{PGDN}
{PGUP}
{PRTSC} (reserved for future use)
{RIGHT}
{SCROLLLOCK}
{TAB}
{UP}
{F1}
{F2}
{F3}
{F4}
{F5}
{F6}
{F7}
{F8}
{F9}
{F10}
{F11}
{F12}
{F13}
{F14}
{F15}
{F16}
{ADD}
{SUBTRACT}
{MULTIPLY}
{DIVIDE}
{{}
{}}
SHIFT +
CTRL ^
ALT %
/*
* SendKeys Special Keys List {BACKSPACE}, {BS}, or {BKSP} {BREAK}
* {CAPSLOCK} {DELETE} or {DEL} {DOWN} {END} {ENTER} or ~ {ESC} {HELP}
* {HOME} {INSERT} or {INS} {LEFT} {NUMLOCK} {PGDN} {PGUP} {PRTSC} (reserved
* for future use) {RIGHT} {SCROLLLOCK} {TAB} {UP} {F1} {F2} {F3} {F4} {F5}
* {F6} {F7} {F8} {F9} {F10} {F11} {F12} {F13} {F14} {F15} {F16} {ADD}
* {SUBTRACT} {MULTIPLY} {DIVIDE} {{} {}} SHIFT + CTRL ^ ALT %
*/ */
public static boolean sendKeys(String keyCommands) { public static boolean sendKeys(String keyCommands) {
@@ -260,15 +245,17 @@ ALT %
specialKey = "{"; specialKey = "{";
} }
if (!specialKeyFlag) { //not special key(tab,enter,...) just press normal keys and modifiers if (!specialKeyFlag) { // not special key(tab,enter,...) just
// press normal keys and modifiers
// Modifier key logic // Modifier key logic
if (key == '+' || key == '^' || key == '%') { //shift alt or ctrl if (key == '+' || key == '^' || key == '%') { // shift alt
// or ctrl
if (!modifierKeyFlag) { if (!modifierKeyFlag) {
modifierKeys = key + ""; modifierKeys = key + "";
modifierKeyFlag = true; modifierKeyFlag = true;
} } else
else modifierKeys += key + ""; // append multiple
modifierKeys += key + ""; //append multiple modifiers // modifiers
if (key == '+') if (key == '+')
robot.keyPress(KeyEvent.VK_SHIFT); robot.keyPress(KeyEvent.VK_SHIFT);
if (key == '^') if (key == '^')
@@ -283,168 +270,127 @@ ALT %
if (specialKey.equals("{ENTER}")) { if (specialKey.equals("{ENTER}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_ENTER }); pressKeyCodes(robot, new int[] { KeyEvent.VK_ENTER });
} } else if (specialKey.equals("{ESC}")) {
else if (specialKey.equals("{ESC}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_ESCAPE }); pressKeyCodes(robot, new int[] { KeyEvent.VK_ESCAPE });
} } else if (specialKey.equals("{HOME}")) {
else if (specialKey.equals("{HOME}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_HOME }); pressKeyCodes(robot, new int[] { KeyEvent.VK_HOME });
} } else if (specialKey.equals("{END}")) {
else if (specialKey.equals("{END}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_END }); pressKeyCodes(robot, new int[] { KeyEvent.VK_END });
} } else if (specialKey.equals("{PGDN}")) {
else if (specialKey.equals("{PGDN}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_PAGE_DOWN }); pressKeyCodes(robot, new int[] { KeyEvent.VK_PAGE_DOWN });
} } else if (specialKey.equals("{PGUP}")) {
else if (specialKey.equals("{PGUP}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_PAGE_UP }); pressKeyCodes(robot, new int[] { KeyEvent.VK_PAGE_UP });
} } else if (specialKey.equals("{TAB}")) {
else if (specialKey.equals("{TAB}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_TAB }); pressKeyCodes(robot, new int[] { KeyEvent.VK_TAB });
} } else if (specialKey.equals("{UP}")) {
else if (specialKey.equals("{UP}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_UP }); pressKeyCodes(robot, new int[] { KeyEvent.VK_UP });
} } else if (specialKey.equals("{DOWN}")) {
else if (specialKey.equals("{DOWN}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_DOWN }); pressKeyCodes(robot, new int[] { KeyEvent.VK_DOWN });
} } else if (specialKey.equals("{LEFT}")) {
else if (specialKey.equals("{LEFT}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_LEFT }); pressKeyCodes(robot, new int[] { KeyEvent.VK_LEFT });
} } else if (specialKey.equals("{RIGHT}")) {
else if (specialKey.equals("{RIGHT}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_RIGHT }); pressKeyCodes(robot, new int[] { KeyEvent.VK_RIGHT });
} } else if (specialKey.equals("{PRTSC}")) {
else if (specialKey.equals("{PRTSC}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_PRINTSCREEN }); pressKeyCodes(robot, new int[] { KeyEvent.VK_PRINTSCREEN });
} } else if (specialKey.equals("{DELETE}") || specialKey.equals("{DEL}")) {
else if (specialKey.equals("{DELETE}") || specialKey.equals("{DEL}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_DELETE }); pressKeyCodes(robot, new int[] { KeyEvent.VK_DELETE });
} } else if (specialKey.equals("{BACKSPACE}") || specialKey.equals("{BS}")) {
else if (specialKey.equals("{BACKSPACE}") || specialKey.equals("{BS}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_BACK_SPACE }); pressKeyCodes(robot, new int[] { KeyEvent.VK_BACK_SPACE });
} } else if (specialKey.equals("{F1}")) {
else if (specialKey.equals("{F1}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F1 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F1 });
} } else if (specialKey.equals("{F2}")) {
else if (specialKey.equals("{F2}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F2 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F2 });
} } else if (specialKey.equals("{F3}")) {
else if (specialKey.equals("{F3}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F3 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F3 });
} } else if (specialKey.equals("{F4}")) {
else if (specialKey.equals("{F4}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F4 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F4 });
} } else if (specialKey.equals("{F5}")) {
else if (specialKey.equals("{F5}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F5 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F5 });
} } else if (specialKey.equals("{F6}")) {
else if (specialKey.equals("{F6}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F6 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F6 });
} } else if (specialKey.equals("{F7}")) {
else if (specialKey.equals("{F7}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F7 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F7 });
} } else if (specialKey.equals("{F8}")) {
else if (specialKey.equals("{F8}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F8 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F8 });
} } else if (specialKey.equals("{F9}")) {
else if (specialKey.equals("{F9}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F9 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F9 });
} } else if (specialKey.equals("{F10}")) {
else if (specialKey.equals("{F10}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F10 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F10 });
} } else if (specialKey.equals("{F11}")) {
else if (specialKey.equals("{F11}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F11 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F11 });
} } else if (specialKey.equals("{F12}")) {
else if (specialKey.equals("{F12}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F12 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F12 });
} } else if (specialKey.equals("{F13}")) {
else if (specialKey.equals("{F13}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F13 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F13 });
} } else if (specialKey.equals("{F14}")) {
else if (specialKey.equals("{F14}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F14 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F14 });
} } else if (specialKey.equals("{F15}")) {
else if (specialKey.equals("{F15}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F15 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F15 });
} } else if (specialKey.equals("{F16}")) {
else if (specialKey.equals("{F16}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_F16 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_F16 });
} } else if (specialKey.equals("{PRTSC}")) {
else if (specialKey.equals("{PRTSC}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_PRINTSCREEN }); pressKeyCodes(robot, new int[] { KeyEvent.VK_PRINTSCREEN });
} } else if (specialKey.equals("{ADD}")) {
else if (specialKey.equals("{ADD}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_ADD }); pressKeyCodes(robot, new int[] { KeyEvent.VK_ADD });
} } else if (specialKey.equals("{SUBTRACT}")) {
else if (specialKey.equals("{SUBTRACT}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_SUBTRACT }); pressKeyCodes(robot, new int[] { KeyEvent.VK_SUBTRACT });
} } else if (specialKey.equals("{MULTIPLY}")) {
else if (specialKey.equals("{MULTIPLY}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_MULTIPLY }); pressKeyCodes(robot, new int[] { KeyEvent.VK_MULTIPLY });
} } else if (specialKey.equals("{DIVIDE}")) {
else if (specialKey.equals("{DIVIDE}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_DIVIDE }); pressKeyCodes(robot, new int[] { KeyEvent.VK_DIVIDE });
} } else if (specialKey.equals("{PERCENT}")) {
else if (specialKey.equals("{PERCENT}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_5 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_5 });
} } else if (specialKey.equals("{CARROT}")) {
else if (specialKey.equals("{CARROT}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_6 }); pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_6 });
} } else if (specialKey.equals("{INSERT}")) {
else if (specialKey.equals("{INSERT}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_INSERT }); pressKeyCodes(robot, new int[] { KeyEvent.VK_INSERT });
} } else if (specialKey.equals("{BREAK}")) {
else if (specialKey.equals("{BREAK}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_CANCEL }); pressKeyCodes(robot, new int[] { KeyEvent.VK_CANCEL });
} } else if (specialKey.equals("{BAR}")) {
else if (specialKey.equals("{BAR}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH }); pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH });
} } else if (specialKey.equals("{{}")) {
else if (specialKey.equals("{{}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET }); pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET });
} } else if (specialKey.equals("{}}")) {
else if (specialKey.equals("{}}")) {
specialKeyFlag = false; specialKeyFlag = false;
pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET }); pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET });
} }
@@ -527,103 +473,203 @@ ALT %
public static int[] getKeyCode(char key) { public static int[] getKeyCode(char key) {
switch (key) { switch (key) {
case 'a': return(new int[]{KeyEvent.VK_A}); case 'a':
case 'b': return(new int[]{KeyEvent.VK_B}); return (new int[] { KeyEvent.VK_A });
case 'c': return(new int[]{KeyEvent.VK_C}); case 'b':
case 'd': return(new int[]{KeyEvent.VK_D}); return (new int[] { KeyEvent.VK_B });
case 'e': return(new int[]{KeyEvent.VK_E}); case 'c':
case 'f': return(new int[]{KeyEvent.VK_F}); return (new int[] { KeyEvent.VK_C });
case 'g': return(new int[]{KeyEvent.VK_G}); case 'd':
case 'h': return(new int[]{KeyEvent.VK_H}); return (new int[] { KeyEvent.VK_D });
case 'i': return(new int[]{KeyEvent.VK_I}); case 'e':
case 'j': return(new int[]{KeyEvent.VK_J}); return (new int[] { KeyEvent.VK_E });
case 'k': return(new int[]{KeyEvent.VK_K}); case 'f':
case 'l': return(new int[]{KeyEvent.VK_L}); return (new int[] { KeyEvent.VK_F });
case 'm': return(new int[]{KeyEvent.VK_M}); case 'g':
case 'n': return(new int[]{KeyEvent.VK_N}); return (new int[] { KeyEvent.VK_G });
case 'o': return(new int[]{KeyEvent.VK_O}); case 'h':
case 'p': return(new int[]{KeyEvent.VK_P}); return (new int[] { KeyEvent.VK_H });
case 'q': return(new int[]{KeyEvent.VK_Q}); case 'i':
case 'r': return(new int[]{KeyEvent.VK_R}); return (new int[] { KeyEvent.VK_I });
case 's': return(new int[]{KeyEvent.VK_S}); case 'j':
case 't': return(new int[]{KeyEvent.VK_T}); return (new int[] { KeyEvent.VK_J });
case 'u': return(new int[]{KeyEvent.VK_U}); case 'k':
case 'v': return(new int[]{KeyEvent.VK_V}); return (new int[] { KeyEvent.VK_K });
case 'w': return(new int[]{KeyEvent.VK_W}); case 'l':
case 'x': return(new int[]{KeyEvent.VK_X}); return (new int[] { KeyEvent.VK_L });
case 'y': return(new int[]{KeyEvent.VK_Y}); case 'm':
case 'z': return(new int[]{KeyEvent.VK_Z}); return (new int[] { KeyEvent.VK_M });
case 'A': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_A}); case 'n':
case 'B': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_B}); return (new int[] { KeyEvent.VK_N });
case 'C': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_C}); case 'o':
case 'D': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_D}); return (new int[] { KeyEvent.VK_O });
case 'E': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_E}); case 'p':
case 'F': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_F}); return (new int[] { KeyEvent.VK_P });
case 'G': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_G}); case 'q':
case 'H': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_H}); return (new int[] { KeyEvent.VK_Q });
case 'I': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_I}); case 'r':
case 'J': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_J}); return (new int[] { KeyEvent.VK_R });
case 'K': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_K}); case 's':
case 'L': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_L}); return (new int[] { KeyEvent.VK_S });
case 'M': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_M}); case 't':
case 'N': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_N}); return (new int[] { KeyEvent.VK_T });
case 'O': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_O}); case 'u':
case 'P': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_P}); return (new int[] { KeyEvent.VK_U });
case 'Q': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_Q}); case 'v':
case 'R': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_R}); return (new int[] { KeyEvent.VK_V });
case 'S': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_S}); case 'w':
case 'T': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_T}); return (new int[] { KeyEvent.VK_W });
case 'U': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_U}); case 'x':
case 'V': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_V}); return (new int[] { KeyEvent.VK_X });
case 'W': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_W}); case 'y':
case 'X': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_X}); return (new int[] { KeyEvent.VK_Y });
case 'Y': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_Y}); case 'z':
case 'Z': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_Z}); return (new int[] { KeyEvent.VK_Z });
case '`': return(new int[]{KeyEvent.VK_BACK_QUOTE}); case 'A':
case '0': return(new int[]{KeyEvent.VK_0}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_A });
case '1': return(new int[]{KeyEvent.VK_1}); case 'B':
case '2': return(new int[]{KeyEvent.VK_2}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_B });
case '3': return(new int[]{KeyEvent.VK_3}); case 'C':
case '4': return(new int[]{KeyEvent.VK_4}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_C });
case '5': return(new int[]{KeyEvent.VK_5}); case 'D':
case '6': return(new int[]{KeyEvent.VK_6}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_D });
case '7': return(new int[]{KeyEvent.VK_7}); case 'E':
case '8': return(new int[]{KeyEvent.VK_8}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_E });
case '9': return(new int[]{KeyEvent.VK_9}); case 'F':
case '-': return(new int[]{KeyEvent.VK_MINUS}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_F });
case '=': return(new int[]{KeyEvent.VK_EQUALS}); case 'G':
case '~': return(new int[]{KeyEvent.VK_ENTER});//return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_QUOTE}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_G });
case '!': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_1}); case 'H':
case '@': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_2}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_H });
case '#': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_3}); case 'I':
case '$': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_4}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_I });
case '%': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_5}); case 'J':
case '^': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_6}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_J });
case '&': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_7}); case 'K':
case '*': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_8}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_K });
case '(': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_9}); case 'L':
case ')': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_0}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_L });
case '_': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_MINUS}); case 'M':
case '+': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_EQUALS}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_M });
case '\t': return(new int[]{KeyEvent.VK_TAB}); case 'N':
case '\n': return(new int[]{KeyEvent.VK_ENTER}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_N });
case '[': return(new int[]{KeyEvent.VK_OPEN_BRACKET}); case 'O':
case ']': return(new int[]{KeyEvent.VK_CLOSE_BRACKET}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_O });
case '\\': return(new int[]{KeyEvent.VK_BACK_SLASH}); case 'P':
case '{': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_P });
case '}': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET}); case 'Q':
case '|': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_Q });
case ';': return(new int[]{KeyEvent.VK_SEMICOLON}); case 'R':
case ':': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_SEMICOLON}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_R });
case '\'': return(new int[]{KeyEvent.VK_QUOTE}); case 'S':
case '"': return(new int[]{KeyEvent.VK_QUOTEDBL}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_S });
case ',': return(new int[]{KeyEvent.VK_COMMA}); case 'T':
case '<': return(new int[]{KeyEvent.VK_LESS}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_T });
case '.': return(new int[]{KeyEvent.VK_PERIOD}); case 'U':
case '>': return(new int[]{KeyEvent.VK_GREATER}); return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_U });
case '/': return(new int[]{KeyEvent.VK_SLASH}); case 'V':
case '?': return(new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_SLASH}); // needs Shift return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_V });
case ' ': return(new int[]{KeyEvent.VK_SPACE}); case 'W':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_W });
case 'X':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_X });
case 'Y':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_Y });
case 'Z':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_Z });
case '`':
return (new int[] { KeyEvent.VK_BACK_QUOTE });
case '0':
return (new int[] { KeyEvent.VK_0 });
case '1':
return (new int[] { KeyEvent.VK_1 });
case '2':
return (new int[] { KeyEvent.VK_2 });
case '3':
return (new int[] { KeyEvent.VK_3 });
case '4':
return (new int[] { KeyEvent.VK_4 });
case '5':
return (new int[] { KeyEvent.VK_5 });
case '6':
return (new int[] { KeyEvent.VK_6 });
case '7':
return (new int[] { KeyEvent.VK_7 });
case '8':
return (new int[] { KeyEvent.VK_8 });
case '9':
return (new int[] { KeyEvent.VK_9 });
case '-':
return (new int[] { KeyEvent.VK_MINUS });
case '=':
return (new int[] { KeyEvent.VK_EQUALS });
case '~':
return (new int[] { KeyEvent.VK_ENTER });// return(new
// int[]{KeyEvent.VK_SHIFT,
// KeyEvent.VK_BACK_QUOTE});
case '!':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_1 });
case '@':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_2 });
case '#':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_3 });
case '$':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_4 });
case '%':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_5 });
case '^':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_6 });
case '&':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_7 });
case '*':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_8 });
case '(':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_9 });
case ')':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_0 });
case '_':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_MINUS });
case '+':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_EQUALS });
case '\t':
return (new int[] { KeyEvent.VK_TAB });
case '\n':
return (new int[] { KeyEvent.VK_ENTER });
case '[':
return (new int[] { KeyEvent.VK_OPEN_BRACKET });
case ']':
return (new int[] { KeyEvent.VK_CLOSE_BRACKET });
case '\\':
return (new int[] { KeyEvent.VK_BACK_SLASH });
case '{':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET });
case '}':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET });
case '|':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH });
case ';':
return (new int[] { KeyEvent.VK_SEMICOLON });
case ':':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_SEMICOLON });
case '\'':
return (new int[] { KeyEvent.VK_QUOTE });
case '"':
return (new int[] { KeyEvent.VK_QUOTEDBL });
case ',':
return (new int[] { KeyEvent.VK_COMMA });
case '<':
return (new int[] { KeyEvent.VK_LESS });
case '.':
return (new int[] { KeyEvent.VK_PERIOD });
case '>':
return (new int[] { KeyEvent.VK_GREATER });
case '/':
return (new int[] { KeyEvent.VK_SLASH });
case '?':
return (new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_SLASH }); // needs
// Shift
case ' ':
return (new int[] { KeyEvent.VK_SPACE });
default: default:
throw new IllegalArgumentException("Cannot find Key Code for character " + key); throw new IllegalArgumentException("Cannot find Key Code for character " + key);
} }

View File

@@ -1,70 +0,0 @@
/*
* Copyright 2014, Synthuse.org
* Released under the Apache Version 2.0 License.
*
* last modified by ejakubowski7@gmail.com
*/
package org.synthuse;
import com.sun.jna.platform.win32.WinDef.HWND;
public class WinPtr {
public HWND hWnd = null;
public String hWndStr = "";
public String runtimeId = "";
public String hmenuStr = "";//store menu handle
public int hmenuPos = -1;//store menu position or id
public WinPtr() {
}
public WinPtr(HWND hWnd) {
this.hWnd = hWnd;
this.hWndStr = Api.GetHandleAsString(hWnd);
}
public WinPtr(String runtimeId) {
this.runtimeId = runtimeId;
}
public boolean isWin32() {
return (hWnd != null || !hWndStr.equals(""));
}
public boolean isWpf() {
return (!runtimeId.equals(""));
}
public boolean isEmpty() {
return (hWnd == null && hWndStr.equals("") && runtimeId.equals(""));
}
public static boolean isWpfRuntimeIdFormat(String runtimeIdTest) {
return (runtimeIdTest.contains("-"));
}
public void convertToNativeHwnd()
{
if (isWpfRuntimeIdFormat(runtimeId)){
hWndStr = runtimeId.split("-")[1];
hWnd = Api.GetHandleFromString(hWndStr);
}
}
public String toString() {
if (isWin32() && !hWndStr.equals(""))
return hWndStr;
else if (isWin32() && hWnd != null)
{
hWndStr = Api.GetHandleAsString(hWnd);
return hWndStr;
}
else if (isWpf())
return runtimeId;
else
return null;
}
}

View File

@@ -0,0 +1,54 @@
package org.synthuse.interfaces;
import org.synthuse.objects.LVITEM_VISTA;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.BaseTSD.SIZE_T;
import com.sun.jna.platform.win32.WinBase.SYSTEM_INFO;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.platform.win32.WinNT.LARGE_INTEGER;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.W32APIOptions;
public interface Kernel32Ex extends W32APIOptions {
Kernel32Ex instance = (Kernel32Ex) Native.loadLibrary("kernel32", Kernel32Ex.class, DEFAULT_OPTIONS);
boolean GetDiskFreeSpaceEx(String lpDirectoryName, LARGE_INTEGER.ByReference lpFreeBytesAvailable, LARGE_INTEGER.ByReference lpTotalNumberOfBytes, LARGE_INTEGER.ByReference lpTotalNumberOfFreeBytes);
int GetLastError();
Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer pointer);
// int OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer
// pointer);
boolean CloseHandle(HANDLE hObject);
void GetNativeSystemInfo(SYSTEM_INFO lpSystemInfo);
boolean IsWow64Process(HANDLE hProcess, IntByReference Wow64Process);
// LPVOID VirtualAllocEx(HANDLE hProcess, LPVOID lpAddress, SIZE_T
// dwSize, DWORD flAllocationType, DWORD flProtect);
// int VirtualAllocEx(HANDLE hProcess, int lpAddress, int dwSize, DWORD
// flAllocationType, DWORD flProtect);
IntByReference VirtualAllocEx(HANDLE hProc, IntByReference addr, SIZE_T size, int allocType, int prot);
Pointer VirtualAllocEx(HANDLE hProc, int i, int lngMemLen2, int allocType, int pAGE_READWRITE);
boolean VirtualFreeEx(HANDLE hProcess, IntByReference lpAddress, SIZE_T dwSize, DWORD dwFreeType);
boolean WriteProcessMemory(HANDLE hProcess, IntByReference lpBaseAddress, Pointer lpBuffer, int len, IntByReference bytesWritten);
// boolean WriteProcessMemory(Pointer p, long address, Pointer buffer,
// int size, IntByReference written);
boolean ReadProcessMemory(Pointer hProcess, long inBaseAddress, Pointer outputBuffer, int nSize, IntByReference outNumberOfBytesRead);
int WriteProcessMemory(HANDLE handle, Pointer lngMemVar2, LVITEM_VISTA lvi, int lngMemLen2, IntByReference byteIO);
int ReadProcessMemory(HANDLE handle, Pointer lngMemVar1, Pointer lngVarPtr1, int lngMemLen1, IntByReference byteIO);
int VirtualFreeEx(HANDLE hProcess, Pointer lngMemVar1, int i, int mEM_RELEASE);
}

View File

@@ -0,0 +1,11 @@
package org.synthuse.interfaces;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.win32.W32APIOptions;
public interface PsapiEx extends W32APIOptions {
PsapiEx instance = (PsapiEx) Native.loadLibrary("psapi", PsapiEx.class, DEFAULT_OPTIONS);
int GetModuleBaseNameW(Pointer hProcess, Pointer hmodule, char[] lpBaseName, int size);
}

View File

@@ -0,0 +1,138 @@
package org.synthuse.interfaces;
import org.synthuse.objects.LVITEM_VISTA;
import com.sun.jna.Callback;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.BaseTSD.LONG_PTR;
import com.sun.jna.platform.win32.WinDef.HDC;
import com.sun.jna.platform.win32.WinDef.HMENU;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.W32APIOptions;
public interface User32Ex extends W32APIOptions {
User32Ex instance = (User32Ex) Native.loadLibrary("user32", User32Ex.class, DEFAULT_OPTIONS);
int SetWindowLongPtr(HWND hWnd, int nIndex, Callback callback);
LRESULT CallWindowProc(LONG_PTR proc, HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam);
boolean ShowWindow(HWND hWnd, int nCmdShow);
boolean SetForegroundWindow(HWND hWnd);
void SwitchToThisWindow(HWND hWnd, boolean fAltTab);
HWND SetFocus(HWND hWnd);
HWND FindWindow(String winClass, String title);
LRESULT PostMessage(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);
LRESULT SendMessage(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);
LRESULT SendMessage(HWND hWnd, int Msg, WPARAM wParam, LVITEM_VISTA lParam);
LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
boolean DestroyWindow(HWND hWnd);
boolean EnumWindows(WNDENUMPROC wndenumproc, int lParam);
boolean EnumChildWindows(HWND hWnd, WNDENUMPROC lpEnumFunc, Pointer data);
HWND GetParent(HWND hWnd);
boolean IsWindowVisible(HWND hWnd);
boolean IsWindow(HWND hWnd);
int GetWindowRect(HWND hWnd, RECT r);
int MapWindowPoints(HWND hWndFrom, HWND hWndTo, RECT r, int cPoints);
HWND GetDesktopWindow();
HDC GetWindowDC(HWND hWnd);
int ReleaseDC(HWND hWnd, HDC hDC);
boolean InvalidateRect(HWND hWnd, long lpRect, boolean bErase);
boolean UpdateWindow(HWND hWnd);
boolean RedrawWindow(HWND hWnd, long lprcUpdate, long hrgnUpdate, int flags);
void GetWindowTextA(HWND hWnd, byte[] buffer, int buflen);
int GetTopWindow(HWND hWnd);
int GetWindow(HWND hWnd, int flag);
final int GW_HWNDNEXT = 2;
int GetClassName(HWND hWnd, char[] buffer2, int i);
int GetWindowModuleFileName(HWND hWnd, char[] buffer2, int i);
int GetWindowThreadProcessId(HWND hWnd, PointerByReference pref);
// int GetWindowThreadProcessId(HWND hWnd, IntByReference
// lpdwProcessId);
boolean GetCursorPos(long[] lpPoint); // use macros POINT_X() and
// POINT_Y() on long lpPoint[0]
HWND WindowFromPoint(long point);
HWND ChildWindowFromPointEx(HWND hwndParent, long point, int uFlags);
boolean ClientToScreen(HWND hWnd, long[] lpPoint);// use macros
// POINT_X() and
// POINT_Y() on long
// lpPoint[0]
boolean ScreenToClient(HWND hWnd, long[] lpPoint);// use macros
// POINT_X() and
// POINT_Y() on long
// lpPoint[0]
// HWND WindowFromPoint(int xPoint, int yPoint);
// HWND WindowFromPoint(POINT point);
HMENU GetMenu(HWND hWnd);
HMENU GetSystemMenu(HWND hWnd, boolean bRevert);
boolean IsMenu(HMENU hMenu);
int GetMenuString(HMENU hMenu, int uIDItem, char[] buffer, int nMaxCount, int uFlag);
HMENU GetSubMenu(HMENU hMenu, int nPos);
int GetMenuItemCount(HMENU hMenu);
int GetMenuItemID(HMENU hMenu, int nPos);
// BOOL WINAPI GetMenuItemInfo(_In_ HMENU hMenu, _In_ UINT uItem, _In_
// BOOL fByPosition, _Inout_ LPMENUITEMINFO lpmii);
boolean GetMenuItemInfoA(HMENU hMenu, int uItem, boolean fByPosition, WinDefEx.MENUITEMINFO mii); // MENUITEMINFO
boolean TrackPopupMenu(HMENU hMenu, int uFlags, int x, int y, int nReserved, HWND hWnd, long prcRect);
boolean GetMenuItemRect(HWND hWnd, HMENU hMenu, int uItem, RECT rect);
int GetDlgCtrlID(HWND hwndCtl);
int GetDlgItemText(HWND hDlg, int nIDDlgItem, byte[] buffer, int nMaxCount);
int GetMenuState(HMENU hMenuTopMenu, int uId, int uFlags);
HWND GetDlgItem(HWND hDlg, int nIDDlgItem);
}

View File

@@ -0,0 +1,80 @@
package org.synthuse.interfaces;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;
public interface WinDefEx extends com.sun.jna.platform.win32.WinDef {
// Structures
public class MENUITEMINFO extends Structure {
public static final int MFS_CHECKED = 0x00000008;
public static final int MFS_DEFAULT = 0x00001000;
public static final int MFS_DISABLED = 0x00000003;
public static final int MFS_ENABLED = 0x00000000;
public static final int MFS_GRAYED = 0x00000003;
public static final int MFS_HILITE = 0x00000080;
public static final int MFS_UNCHECKED = 0x00000000;
public static final int MFS_UNHILITE = 0x00000000;
public static final int MFT_STRING = 0x0000;
public static final int MIIM_DATA = 0x00000020;
public static final int MIIM_STRING = 0x0040;
public static final int MIIM_SUBMENU = 0x0004;
public static final int MIIM_TYPE = 0x0010;
public static class ByValue extends MENUITEMINFO implements Structure.ByValue {
}
public static class ByReference extends MENUITEMINFO implements Structure.ByReference {
}
public MENUITEMINFO() {
cbSize = size();
}
public MENUITEMINFO(Pointer p) {
super(p);
}
@Override
protected List<?> getFieldOrder() {
return Arrays.asList(new String[] { "cbSize", "fMask", "fType", "fState", "wID", "hSubMenu", "hbmpChecked", "hbmpUnchecked", "dwItemData", "dwTypeData", "cch", "hbmpItem" });
}
public int cbSize; // The size of the structure, in bytes. The
// caller must set this member to
// sizeof(MENUITEMINFO).
public int fMask; // Indicates the members to be retrieved or set.
// MIIM_STRING or MIIM_SUBMENU or ...
public int fType; // The menu item type. fType is used only if fMask
// has a value of MIIM_FTYPE.
public int fState; // The menu item state. This member can be one or
// more of these values. Set fMask to MIIM_STATE
// to use fState.
public int wID; // An application-defined value that identifies the
// menu item. Set fMask to MIIM_ID to use wID.
public HMENU hSubMenu; // A handle to the drop-down menu or submenu
// associated with the menu item. Or NULL
public HBITMAP hbmpChecked; // A handle to the bitmap to display
// next to the item if it is selected.
public HBITMAP hbmpUnchecked; // A handle to the bitmap to display
// next to the item if it is not
// selected.
public ULONG_PTR dwItemData; // An application-defined value
// associated with the menu item. Set
// fMask to MIIM_DATA
// public byte[] dwTypeData = new byte[256];
public String dwTypeData; // The contents of the menu item, depends
// on the value of fType and is used only
// if the MIIM_TYPE flag is set in the
// fMask member
public int cch; // The length of the menu item text, in characters,
// when information is received about a menu item of
// the MFT_STRING type.
public HBITMAP hbmpItem; // A handle to the bitmap to be displayed,
// or it can be one of the values in the
// following table.
}
}

View File

@@ -0,0 +1,42 @@
package org.synthuse.objects;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;
public class COPYDATASTRUCT extends Structure {
// The by-reference version of this structure.
public static class ByReference extends COPYDATASTRUCT implements Structure.ByReference {
}
public COPYDATASTRUCT() {
}
// Instantiates a new COPYDATASTRUCT with existing data given the
// address of that data.
public COPYDATASTRUCT(final long pointer) {
this(new Pointer(pointer));
}
// Instantiates a new COPYDATASTRUCT with existing data given a
// pointer to that data.
public COPYDATASTRUCT(final Pointer memory) {
super(memory);
read();
}
public ULONG_PTR dwData; // The data to be passed to the receiving
// application.
public int cbData; // The size, in bytes, of the data pointed to by
// the lpData
public Pointer lpData;
@SuppressWarnings("rawtypes")
@Override
protected final List getFieldOrder() {
return Arrays.asList(new String[] { "dwData", "cbData", "lpData" });
}
}

View File

@@ -0,0 +1,34 @@
package org.synthuse.objects;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef.LPARAM;
// 64bit LVITEM size 88
// 32bit LVITEM size 60
public class LVITEM_VISTA extends Structure {
public int mask;
public int iItem;
public int iSubItem;
public int state;
public int stateMask;
public Pointer pszText;
public int cchTextMax;
public int iImage;
public LPARAM lParam;
public int iIndent;
public int iGoupId;
public int cColumns;
public Pointer puColumns;
// NTDDI_VERSION >= NTDDI_VISTA
public Pointer piColFmt;
public int iGroup;
@Override
protected List<?> getFieldOrder() {
return Arrays.asList(new String[] { "mask", "iItem", "iSubItem", "state", "stateMask", "pszText", "cchTextMax", "iImage", "lParam", "iIndent", "iGoupId", "cColumns", "puColumns", "piColFmt", "iGroup" });
}
}

View File

@@ -0,0 +1,104 @@
/*
* Copyright 2014, Synthuse.org
* Released under the Apache Version 2.0 License.
*
* last modified by ejakubowski7@gmail.com
*/
package org.synthuse.objects;
import java.math.BigInteger;
import org.synthuse.Api;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.*;
public class MenuInfo {
public HMENU hmenu = null;
public String hmenuStr = "";
public String hwndStr = "";
public int menuCount = 0;
public String text = "";
public String unaltered = "";
public int id = 0;
public int position = 0;
public boolean hasSubMenu = false;
public HMENU submenu = null;
public String submenuStr = "";
public int submenuCount = 0;
public String center = "";
public MenuInfo(String hwndStr, HMENU hmenu) {
this.hwndStr = hwndStr;
loadMenuBase(hmenu);
}
public MenuInfo(String hwndStr, HMENU hmenu, int position) {
this.hwndStr = hwndStr;
loadMenuBase(hmenu);
if (this.menuCount > 0)
loadMenuDetails(hmenu, position);
}
public void loadMenuBase(HMENU hmenu) {
Api api = new Api();
this.hmenu = hmenu;
this.hmenuStr = GetHandleMenuAsString(hmenu);
this.menuCount = api.user32.GetMenuItemCount(hmenu);
}
public void loadMenuDetails(HMENU hmenu, int position) {
Api api = new Api();
this.position = position;
this.unaltered = api.GetMenuItemText(hmenu, position);
this.text = unaltered;
if (this.unaltered.contains("\t"))
this.text = this.text.substring(0, this.text.indexOf("\t"));
this.text = text.replaceAll("[^a-zA-Z0-9.,\\+ ]", "");
this.id = api.user32.GetMenuItemID(hmenu, position);
/*
* HWND hWnd = Api.GetHandleFromString(hwndStr); RECT rect = new RECT();
* api.user32.GetMenuItemRect(hWnd, hmenu, position, rect); int centerX
* = ((rect.right - rect.left) / 2) + rect.left; int centerY =
* ((rect.bottom - rect.top) / 2) + rect.top; this.center = centerX +
* "," + centerY;
*/
HMENU submenu = api.user32.GetSubMenu(hmenu, position);
if (submenu != null) {
int subCount = api.user32.GetMenuItemCount(submenu);
if (subCount > 0) {
this.hasSubMenu = true;
this.submenu = submenu;
this.submenuStr = GetHandleMenuAsString(submenu);
this.submenuCount = subCount;
}
}
}
public static String GetHandleMenuAsString(HMENU hmenu) {
if (hmenu == null)
return "0";
// String longHexStr = hWnd.toString().substring("native@".length());
// String longHexStr = hmenu.getPointer()
String longHexStr = hmenu.getPointer().toString().substring("native@0x".length());
long l = new BigInteger(longHexStr, 16).longValue();
return l + "";
}
public static HMENU GetHandleMenuFromString(String hmenu) {
if (hmenu == null)
return null;
if (hmenu.isEmpty())
return null;
String cleanNumericHandle = hmenu.replaceAll("[^\\d.]", "");
try {
return (new HMENU(new Pointer(Long.parseLong(cleanNumericHandle))));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@@ -0,0 +1,24 @@
package org.synthuse.objects;
import com.sun.jna.platform.win32.WinDef.HMENU;
import com.sun.jna.platform.win32.WinDef.HWND;
public class MenuItem {
public static final boolean EXACT = false;
public HWND hWnd;
public HMENU hMenu;
public String[] path;
public boolean exact;
public MenuItem(HWND hWnd, HMENU hMenu, String... path) {
this(hWnd, hMenu, EXACT, path);
}
public MenuItem(HWND hWnd, HMENU hMenu, boolean exact, String... path) {
this.hWnd = hWnd;
this.hMenu = hMenu;
this.exact = exact;
this.path = path;
}
}

View File

@@ -0,0 +1,69 @@
/*
* Copyright 2014, Synthuse.org
* Released under the Apache Version 2.0 License.
*
* last modified by ejakubowski7@gmail.com
*/
package org.synthuse.objects;
import org.synthuse.Api;
import com.sun.jna.platform.win32.WinDef.HWND;
public class WinPtr {
public HWND hWnd = null;
public String hWndStr = "";
public String runtimeId = "";
public String hmenuStr = "";// store menu handle
public int hmenuPos = -1;// store menu position or id
public WinPtr() {
}
public WinPtr(HWND hWnd) {
this.hWnd = hWnd;
this.hWndStr = Api.GetHandleAsString(hWnd);
}
public WinPtr(String runtimeId) {
this.runtimeId = runtimeId;
}
public boolean isWin32() {
return (hWnd != null || !hWndStr.equals(""));
}
public boolean isWpf() {
return (!runtimeId.equals(""));
}
public boolean isEmpty() {
return (hWnd == null && hWndStr.equals("") && runtimeId.equals(""));
}
public static boolean isWpfRuntimeIdFormat(String runtimeIdTest) {
return (runtimeIdTest.contains("-"));
}
public void convertToNativeHwnd() {
if (isWpfRuntimeIdFormat(runtimeId)) {
hWndStr = runtimeId.split("-")[1];
hWnd = Api.GetHandleFromString(hWndStr);
}
}
public String toString() {
if (isWin32() && !hWndStr.equals(""))
return hWndStr;
else if (isWin32() && hWnd != null) {
hWndStr = Api.GetHandleAsString(hWnd);
return hWndStr;
} else if (isWpf())
return runtimeId;
else
return null;
}
}

View File

@@ -3,13 +3,13 @@ import java.util.HashMap;
import java.util.Random; import java.util.Random;
import org.synthuse.Api; import org.synthuse.Api;
import org.synthuse.objects.MenuItem;
import com.sun.jna.platform.win32.WinDef.HMENU; import com.sun.jna.platform.win32.WinDef.HMENU;
import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.WPARAM; import com.sun.jna.platform.win32.WinDef.WPARAM;
public class Test { public class Test {
protected Api api; protected Api api;
protected HWND hWndFound; protected HWND hWndFound;
protected HashMap<HWND, HMENU> windowMap; protected HashMap<HWND, HMENU> windowMap;
@@ -17,26 +17,6 @@ public class Test {
protected HashMap<Slider, HashMap<Amount, MenuItem>> sliderMap; protected HashMap<Slider, HashMap<Amount, MenuItem>> sliderMap;
protected HashMap<Slider, HWND> valueMap; protected HashMap<Slider, HWND> valueMap;
class MenuItem {
public static final boolean EXACT = false;
public HWND hWnd;
public HMENU hMenu;
public String[] path;
public boolean exact;
public MenuItem(HWND hWnd, HMENU hMenu, String... path) {
this(hWnd, hMenu, EXACT, path);
}
public MenuItem(HWND hWnd, HMENU hMenu, boolean exact, String... path) {
this.hWnd = hWnd;
this.hMenu = hMenu;
this.exact = exact;
this.path = path;
}
}
public Test() { public Test() {
api = new Api(); api = new Api();
windowMap = new HashMap<HWND, HMENU>(); windowMap = new HashMap<HWND, HMENU>();