Move objects and interfaces to designated files
This commit is contained in:
@@ -3,35 +3,37 @@
|
|||||||
* Released under the Apache Version 2.0 License.
|
* Released under the Apache Version 2.0 License.
|
||||||
*
|
*
|
||||||
* last modified by ejakubowski7@gmail.com
|
* last modified by ejakubowski7@gmail.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.synthuse;
|
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;
|
||||||
@@ -419,8 +206,8 @@ public class Api {
|
|||||||
|
|
||||||
public static Long GetHandleAsLong(HWND hWnd) {
|
public static Long GetHandleAsLong(HWND hWnd) {
|
||||||
if (hWnd == null)
|
if (hWnd == null)
|
||||||
return (long)0;
|
return (long) 0;
|
||||||
//String longHexStr = hWnd.toString().substring("native@".length());
|
// String longHexStr = hWnd.toString().substring("native@".length());
|
||||||
String longHexStr = hWnd.getPointer().toString().substring("native@".length());
|
String longHexStr = hWnd.getPointer().toString().substring("native@".length());
|
||||||
return Long.decode(longHexStr);
|
return Long.decode(longHexStr);
|
||||||
}
|
}
|
||||||
@@ -461,39 +248,44 @@ public class Api {
|
|||||||
|
|
||||||
public static Point getCursorPos() {
|
public static Point getCursorPos() {
|
||||||
|
|
||||||
long[] getPos = new long [1];
|
long[] getPos = new long[1];
|
||||||
User32Ex.instance.GetCursorPos(getPos);
|
User32Ex.instance.GetCursorPos(getPos);
|
||||||
return new Point(POINT_X(getPos[0]), POINT_Y(getPos[0]));
|
return new Point(POINT_X(getPos[0]), POINT_Y(getPos[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
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))
|
||||||
//x = POINT_X(getPos[0]);y = POINT_Y(getPos[0]);
|
return inHwnd; // if point is not correct use original hwnd.
|
||||||
//System.out.println("ScreenToClient " + GetHandleAsString(inHwnd) + ", " + x + ", " + y);
|
// x = POINT_X(getPos[0]);y = POINT_Y(getPos[0]);
|
||||||
|
// 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;
|
||||||
@@ -539,10 +331,10 @@ public class Api {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean closeWindow(HWND handle) {
|
public boolean closeWindow(HWND handle) {
|
||||||
//return user32.DestroyWindow(handle);
|
// return user32.DestroyWindow(handle);
|
||||||
//user32.SendMessage(handle, WM_CLOSE , null, null);
|
// user32.SendMessage(handle, WM_CLOSE , null, null);
|
||||||
user32.PostMessage(handle, WM_CLOSE , null, null);
|
user32.PostMessage(handle, WM_CLOSE, null, null);
|
||||||
//user32.SendMessage(handle, WM_NCDESTROY , null, null);
|
// user32.SendMessage(handle, WM_NCDESTROY , null, null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,7 +360,7 @@ public class Api {
|
|||||||
|
|
||||||
public void sendDoubleClick(HWND handle) {
|
public void sendDoubleClick(HWND handle) {
|
||||||
user32.SendMessageA(handle, WM_LBUTTONDBLCLK, 0, null);
|
user32.SendMessageA(handle, WM_LBUTTONDBLCLK, 0, null);
|
||||||
//user32.SendMessageA(handle, WM_LBUTTONUP, 0, null);
|
// user32.SendMessageA(handle, WM_LBUTTONUP, 0, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendRightClick(HWND handle) {
|
public void sendRightClick(HWND handle) {
|
||||||
@@ -578,11 +370,11 @@ public class Api {
|
|||||||
|
|
||||||
public void sendKeyDown(HWND handle, int keyCode) {
|
public void sendKeyDown(HWND handle, int keyCode) {
|
||||||
user32.SendMessageA(handle, WM_KEYDOWN, keyCode, null);
|
user32.SendMessageA(handle, WM_KEYDOWN, keyCode, null);
|
||||||
//user32.SendMessageA(handle, WM_KEYUP, keyCode, null);
|
// user32.SendMessageA(handle, WM_KEYUP, keyCode, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendKeyUp(HWND handle, int keyCode) {
|
public void sendKeyUp(HWND handle, int keyCode) {
|
||||||
//user32.SendMessageA(handle, WM_KEYDOWN, keyCode, null);
|
// user32.SendMessageA(handle, WM_KEYDOWN, keyCode, null);
|
||||||
user32.SendMessageA(handle, WM_KEYUP, keyCode, null);
|
user32.SendMessageA(handle, WM_KEYUP, keyCode, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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,41 +444,48 @@ 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) +
|
||||||
return (int)(((totalBytes-freeBytes)/totalBytes) * 100.0);
|
// "/ totalspace " + humanReadableByteCount(totalBytes));
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// creates highlight around selected window
|
// creates highlight around selected window
|
||||||
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
|
||||||
Gdi32Ex.instance.Rectangle (dc, x, y, x2, y2);
|
// found window.
|
||||||
|
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.
|
||||||
Gdi32Ex.instance.SelectObject(dc, prevPen);
|
Gdi32Ex.instance.SelectObject(dc, prevPen);
|
||||||
@@ -699,51 +505,47 @@ public class Api {
|
|||||||
public static boolean isDotNet4Installed() {
|
public static boolean isDotNet4Installed() {
|
||||||
try {
|
try {
|
||||||
int installed = Advapi32Util.registryGetIntValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4.0\\Client", "Install");
|
int installed = Advapi32Util.registryGetIntValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4.0\\Client", "Install");
|
||||||
//System.out.println("isDotNet4Installed: " + installed);
|
// System.out.println("isDotNet4Installed: " + installed);
|
||||||
return (installed == 1);
|
return (installed == 1);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
int installed = Advapi32Util.registryGetIntValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client", "Install");
|
int installed = Advapi32Util.registryGetIntValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client", "Install");
|
||||||
//System.out.println("isDotNet4Installed: " + installed);
|
// System.out.println("isDotNet4Installed: " + installed);
|
||||||
return (installed == 1);
|
return (installed == 1);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
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,23 +594,22 @@ 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
|
User32Ex.instance.SendMessage(listHwnd, LB_SETCURSEL, new WPARAM(index), new LPARAM(0));
|
||||||
Api.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();
|
||||||
//lvitem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
// lvitem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
|
||||||
//lvitem.state = LVIS_FOCUSED | LVIS_SELECTED;
|
// lvitem.state = LVIS_FOCUSED | LVIS_SELECTED;
|
||||||
//JOptionPane.showMessageDialog(null, "lvitem size: " + lvitem.size());
|
// JOptionPane.showMessageDialog(null, "lvitem size: " + lvitem.size());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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() {
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
* Released under the Apache Version 2.0 License.
|
* Released under the Apache Version 2.0 License.
|
||||||
*
|
*
|
||||||
* last modified by ejakubowski7@gmail.com
|
* last modified by ejakubowski7@gmail.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
package org.synthuse;
|
package org.synthuse;
|
||||||
|
|
||||||
@@ -21,28 +20,30 @@ import com.sun.jna.platform.win32.WinUser.*;
|
|||||||
import com.sun.jna.platform.win32.WinDef.*;
|
import com.sun.jna.platform.win32.WinDef.*;
|
||||||
import com.sun.jna.win32.W32APIOptions;
|
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;
|
||||||
this.withShift = withShift;
|
this.withShift = withShift;
|
||||||
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;
|
||||||
this.withCtrl = withCtrl;
|
this.withCtrl = withCtrl;
|
||||||
@@ -50,20 +51,29 @@ 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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// JNA constants and functions
|
// JNA constants and functions
|
||||||
public static final int WH_KEYBOARD_LL = 13;
|
public static final int WH_KEYBOARD_LL = 13;
|
||||||
//Modifier key vkCode constants
|
// Modifier key vkCode constants
|
||||||
public static final int VK_SHIFT = 0x10;
|
public static final int VK_SHIFT = 0x10;
|
||||||
public static final int VK_CONTROL = 0x11;
|
public static final int VK_CONTROL = 0x11;
|
||||||
public static final int VK_MENU = 0x12;
|
public static final int VK_MENU = 0x12;
|
||||||
@@ -84,33 +94,44 @@ 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 {
|
||||||
// LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam);
|
// LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam);
|
||||||
//}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface Kernel32 extends W32APIOptions {
|
public interface Kernel32 extends W32APIOptions {
|
||||||
@@ -123,17 +144,24 @@ public class KeyboardHook implements Runnable{
|
|||||||
public void createGlobalKeyboardHook() {
|
public void createGlobalKeyboardHook() {
|
||||||
|
|
||||||
if (hHook != null)
|
if (hHook != null)
|
||||||
return; //hook already running don't add anymore
|
return; // hook already running don't add anymore
|
||||||
System.out.println("starting global keyboard hook");
|
System.out.println("starting global keyboard hook");
|
||||||
HMODULE hMod = Kernel32.instance.GetModuleHandle(null);
|
HMODULE hMod = Kernel32.instance.GetModuleHandle(null);
|
||||||
HOOKPROC lpfn = new HOOKPROC() {
|
HOOKPROC lpfn = new HOOKPROC() {
|
||||||
@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
|
||||||
// quit = true;
|
// quit = true;
|
||||||
return User32.INSTANCE.CallNextHookEx(hHook, nCode, wParam, lParam.getPointer());
|
return User32.INSTANCE.CallNextHookEx(hHook, nCode, wParam, lParam.getPointer());
|
||||||
}
|
}
|
||||||
@@ -143,41 +171,46 @@ public class KeyboardHook implements Runnable{
|
|||||||
if (hHook == null)
|
if (hHook == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//System.out.println("starting message loop");
|
// System.out.println("starting message loop");
|
||||||
MSG msg = new MSG();
|
MSG msg = new MSG();
|
||||||
try {
|
try {
|
||||||
|
|
||||||
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) { // &&
|
||||||
//System.out.println("Hot key pressed!");
|
// msg.wParam.intValue()
|
||||||
msg = new MSG(); //must clear msg so it doesn't repeat
|
// == 1
|
||||||
|
// System.out.println("Hot key pressed!");
|
||||||
|
msg = new MSG(); // must clear msg so it doesn't repeat
|
||||||
}
|
}
|
||||||
Thread.sleep(10);
|
Thread.sleep(10);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
//System.out.println("message loop stopped");
|
// System.out.println("message loop stopped");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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();
|
||||||
try {
|
try {
|
||||||
|
|
||||||
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) { // &&
|
||||||
//System.out.println("Hot key pressed " + msg.wParam);
|
// msg.wParam.intValue()
|
||||||
|
// == 1
|
||||||
|
// 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)
|
||||||
events.keyPressed(target);
|
events.keyPressed(target);
|
||||||
msg = new MSG(); //must clear msg so it doesn't repeat
|
msg = new MSG(); // must clear msg so it doesn't repeat
|
||||||
}
|
}
|
||||||
Thread.sleep(10);
|
Thread.sleep(10);
|
||||||
}
|
}
|
||||||
@@ -185,24 +218,23 @@ public class KeyboardHook implements Runnable{
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
unregisterAllHotKeys();
|
unregisterAllHotKeys();
|
||||||
//System.out.println("message loop stopped");
|
// System.out.println("message loop stopped");
|
||||||
}
|
}
|
||||||
|
|
||||||
//unhook the Global Windows Keyboard hook
|
// unhook the Global Windows Keyboard hook
|
||||||
public void unhook() {
|
public void unhook() {
|
||||||
if (hHook == null)
|
if (hHook == null)
|
||||||
return;
|
return;
|
||||||
if (!User32.INSTANCE.UnhookWindowsHookEx(hHook))
|
if (!User32.INSTANCE.UnhookWindowsHookEx(hHook))
|
||||||
System.out.println("Failed to unhook");
|
System.out.println("Failed to unhook");
|
||||||
//System.out.println("Unhooked");
|
// System.out.println("Unhooked");
|
||||||
hHook = null;
|
hHook = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
//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,10 +276,9 @@ 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
// add more target keys to watch for
|
// add more target keys to watch for
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -290,10 +324,10 @@ public class KeyboardHook implements Runnable{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
//createGlobalKeyboardHook();
|
// createGlobalKeyboardHook();
|
||||||
createHotKeysHook();
|
createHotKeysHook();
|
||||||
//System.out.println("Unhooking Global Keyboard Hook");
|
// System.out.println("Unhooking Global Keyboard Hook");
|
||||||
unhook();//wait for quit == true then unhook
|
unhook();// wait for quit == true then unhook
|
||||||
}
|
}
|
||||||
|
|
||||||
public KeyboardHook() {
|
public KeyboardHook() {
|
||||||
@@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* Released under the Apache Version 2.0 License.
|
* Released under the Apache Version 2.0 License.
|
||||||
*
|
*
|
||||||
* last modified by ejakubowski
|
* last modified by ejakubowski
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.synthuse;
|
package org.synthuse;
|
||||||
|
|
||||||
@@ -68,13 +68,13 @@ public class RobotMacro {
|
|||||||
|
|
||||||
public static void rightClickMouse() {
|
public static void rightClickMouse() {
|
||||||
try {
|
try {
|
||||||
//System.out.println("rightClickMouse");
|
// System.out.println("rightClickMouse");
|
||||||
Robot robot = new Robot();
|
Robot robot = new Robot();
|
||||||
//robot.mouseMove(200, 200);
|
// robot.mouseMove(200, 200);
|
||||||
//robot.delay(1000);
|
// robot.delay(1000);
|
||||||
robot.mousePress(InputEvent.BUTTON3_MASK);
|
robot.mousePress(InputEvent.BUTTON3_MASK);
|
||||||
robot.mouseRelease(InputEvent.BUTTON3_MASK);
|
robot.mouseRelease(InputEvent.BUTTON3_MASK);
|
||||||
//System.out.println("rightClickMouse good");
|
// System.out.println("rightClickMouse good");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
lastException = e;
|
lastException = e;
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -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);
|
||||||
@@ -190,58 +214,19 @@ public class RobotMacro {
|
|||||||
public static void tildeKey() {
|
public static void tildeKey() {
|
||||||
try {
|
try {
|
||||||
Robot robot = new Robot();
|
Robot robot = new Robot();
|
||||||
pressKeyCodes(robot, new int[]{KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_QUOTE});
|
pressKeyCodes(robot, new int[] { KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_QUOTE });
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
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,197 +245,158 @@ 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 == '^')
|
||||||
robot.keyPress(KeyEvent.VK_CONTROL);
|
robot.keyPress(KeyEvent.VK_CONTROL);
|
||||||
if (key == '%')
|
if (key == '%')
|
||||||
robot.keyPress(KeyEvent.VK_ALT);
|
robot.keyPress(KeyEvent.VK_ALT);
|
||||||
continue; //skip to next key
|
continue; // skip to next key
|
||||||
}
|
}
|
||||||
pressKeyCodes(robot, getKeyCode(key));
|
pressKeyCodes(robot, getKeyCode(key));
|
||||||
}
|
}
|
||||||
if (specialKeyFlag) {
|
if (specialKeyFlag) {
|
||||||
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 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modifierKeyFlag) { //time to release all the modifier keys
|
if (modifierKeyFlag) { // time to release all the modifier keys
|
||||||
modifierKeyFlag = false;
|
modifierKeyFlag = false;
|
||||||
for (int m = 0; m < modifierKeys.length(); m++) {
|
for (int m = 0; m < modifierKeys.length(); m++) {
|
||||||
char mkey = modifierKeys.charAt(m);
|
char mkey = modifierKeys.charAt(m);
|
||||||
@@ -489,7 +435,7 @@ ALT %
|
|||||||
int[] keyCodes = getKeyCode(key);
|
int[] keyCodes = getKeyCode(key);
|
||||||
for (int i = 0; i < keyCodes.length; i++) {
|
for (int i = 0; i < keyCodes.length; i++) {
|
||||||
robot.keyPress(keyCodes[i]);
|
robot.keyPress(keyCodes[i]);
|
||||||
//System.out.println("pressed: " + keyCodes[i]);
|
// System.out.println("pressed: " + keyCodes[i]);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
lastException = e;
|
lastException = e;
|
||||||
@@ -504,7 +450,7 @@ ALT %
|
|||||||
int[] keyCodes = getKeyCode(key);
|
int[] keyCodes = getKeyCode(key);
|
||||||
for (int i = keyCodes.length - 1; i >= 0; i--) {
|
for (int i = keyCodes.length - 1; i >= 0; i--) {
|
||||||
robot.keyRelease(keyCodes[i]);
|
robot.keyRelease(keyCodes[i]);
|
||||||
//System.out.println("released: " + keyCodes[i]);
|
// System.out.println("released: " + keyCodes[i]);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
lastException = e;
|
lastException = e;
|
||||||
@@ -516,114 +462,214 @@ ALT %
|
|||||||
public static void pressKeyCodes(Robot robot, int[] keyCodes) {
|
public static void pressKeyCodes(Robot robot, int[] keyCodes) {
|
||||||
for (int i = 0; i < keyCodes.length; i++) {
|
for (int i = 0; i < keyCodes.length; i++) {
|
||||||
robot.keyPress(keyCodes[i]);
|
robot.keyPress(keyCodes[i]);
|
||||||
//System.out.println("pressed: " + keyCodes[i]);
|
// System.out.println("pressed: " + keyCodes[i]);
|
||||||
}
|
}
|
||||||
//robot.delay(50);
|
// robot.delay(50);
|
||||||
for (int i = keyCodes.length - 1; i >= 0; i--) {
|
for (int i = keyCodes.length - 1; i >= 0; i--) {
|
||||||
robot.keyRelease(keyCodes[i]);
|
robot.keyRelease(keyCodes[i]);
|
||||||
//System.out.println("released: " + keyCodes[i]);
|
// System.out.println("released: " + keyCodes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
54
src/main/java/org/synthuse/interfaces/Kernel32Ex.java
Normal file
54
src/main/java/org/synthuse/interfaces/Kernel32Ex.java
Normal 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);
|
||||||
|
}
|
||||||
11
src/main/java/org/synthuse/interfaces/PsapiEx.java
Normal file
11
src/main/java/org/synthuse/interfaces/PsapiEx.java
Normal 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);
|
||||||
|
}
|
||||||
138
src/main/java/org/synthuse/interfaces/User32Ex.java
Normal file
138
src/main/java/org/synthuse/interfaces/User32Ex.java
Normal 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);
|
||||||
|
}
|
||||||
80
src/main/java/org/synthuse/interfaces/WinDefEx.java
Normal file
80
src/main/java/org/synthuse/interfaces/WinDefEx.java
Normal 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.
|
||||||
|
}
|
||||||
|
}
|
||||||
42
src/main/java/org/synthuse/objects/COPYDATASTRUCT.java
Normal file
42
src/main/java/org/synthuse/objects/COPYDATASTRUCT.java
Normal 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" });
|
||||||
|
}
|
||||||
|
}
|
||||||
34
src/main/java/org/synthuse/objects/LVITEM_VISTA.java
Normal file
34
src/main/java/org/synthuse/objects/LVITEM_VISTA.java
Normal 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" });
|
||||||
|
}
|
||||||
|
}
|
||||||
104
src/main/java/org/synthuse/objects/MenuInfo.java
Normal file
104
src/main/java/org/synthuse/objects/MenuInfo.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
24
src/main/java/org/synthuse/objects/MenuItem.java
Normal file
24
src/main/java/org/synthuse/objects/MenuItem.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
69
src/main/java/org/synthuse/objects/WinPtr.java
Normal file
69
src/main/java/org/synthuse/objects/WinPtr.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>();
|
||||||
|
|||||||
Reference in New Issue
Block a user