diff --git a/java/.classpath b/java/.classpath index 6017bc4..fb332f2 100644 --- a/java/.classpath +++ b/java/.classpath @@ -14,8 +14,6 @@ - - diff --git a/java/list.exe b/java/list.exe deleted file mode 100644 index 17d5b4f..0000000 Binary files a/java/list.exe and /dev/null differ diff --git a/java/mimis.dll b/java/mimis.dll index 8aeca74..969f488 100644 Binary files a/java/mimis.dll and b/java/mimis.dll differ diff --git a/java/src/mimis/application/cmd/CMDApplication.java b/java/src/mimis/application/cmd/CMDApplication.java index 456f4e8..08fdaa2 100644 --- a/java/src/mimis/application/cmd/CMDApplication.java +++ b/java/src/mimis/application/cmd/CMDApplication.java @@ -1,14 +1,17 @@ package mimis.application.cmd; import java.io.IOException; +import java.util.Map; import mimis.Application; import mimis.exception.worker.ActivateException; import mimis.exception.worker.DeactivateException; import mimis.util.Native; +import mimis.value.Registry; public abstract class CMDApplication extends Application { - protected final static String REGISTRY = "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths"; + protected final static Registry REGISTRY = Registry.LOCAL_MACHINE; + protected final static String KEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths"; protected String program; protected String title; @@ -20,11 +23,6 @@ public abstract class CMDApplication extends Application { this.title = title; } - public String getPath() { - String key = String.format("%s\\%s", REGISTRY, program); - return Native.getValue(key); - } - public void activate() throws ActivateException { super.activate(); String path = getPath(); @@ -33,7 +31,7 @@ public abstract class CMDApplication extends Application { } try { String command = path.startsWith("\"") ? path : String.format("\"%s\"", path); - command = Native.replaceVariables(command); + command = replaceVariables(command); process = Runtime.getRuntime().exec(command); } catch (IOException e) { throw new ActivateException(); @@ -50,4 +48,18 @@ public abstract class CMDApplication extends Application { process.destroy(); } } + + public String getPath() { + String key = String.format("%s\\%s", KEY, program); + System.out.println(Native.getValue(REGISTRY, key)); + return Native.getValue(REGISTRY, key); + } + + public static String replaceVariables(String string) { + Map env = System.getenv(); + for (String key : env.keySet()) { + string = string.replace(String.format("%%%s%%", key), env.get(key)); + } + return string; + } } diff --git a/java/src/mimis/application/cmd/windows/WindowsApplication.java b/java/src/mimis/application/cmd/windows/WindowsApplication.java index 58bc794..c4b61b6 100644 --- a/java/src/mimis/application/cmd/windows/WindowsApplication.java +++ b/java/src/mimis/application/cmd/windows/WindowsApplication.java @@ -7,17 +7,12 @@ import mimis.util.Native; import mimis.value.Command; import mimis.value.Key; import mimis.value.Type; +import mimis.value.Windows; public abstract class WindowsApplication extends CMDApplication { protected final static int TERMINATE_SLEEP = 500; protected final static int START_SLEEP = 500; - public static final int WM_CLOSE = 0x0010; - public static final int WM_COMMAND = 0x0111; - public static final int WM_APPCOMMAND = 0x0319; - public static final int WM_USER = 0x0400; - public static final int MAPVK_VK_TO_VSC = 0; - protected String window; protected Process process; protected int handle; @@ -49,26 +44,28 @@ public abstract class WindowsApplication extends CMDApplication { } public void deactivate() throws DeactivateException { - if (!Native.terminate(program)) { - throw new DeactivateException(); - } + close(); + } + + protected void close() { + Native.sendMessage(handle, Windows.WM_CLOSE, 0, 0); } protected void command(Command command) { - Native.sendMessage(handle, WM_APPCOMMAND, handle, command.getCode() << 16); + Native.sendMessage(handle, Windows.WM_APPCOMMAND, handle, command.getCode() << 16); } protected void command(int command) { - Native.sendMessage(handle, WM_COMMAND, command, 0); + Native.sendMessage(handle, Windows.WM_COMMAND, command, 0); } protected int user(int wParam, int lParam) { - return Native.sendMessage(handle, WM_USER, wParam, lParam); + return Native.sendMessage(handle, Windows.WM_USER, wParam, lParam); //return Windows.sendMessage(handle, Windows.WM_USER + wParam, 0, 0); } protected void key(Type type, int code) { - int scanCode = Native.mapVirtualKey(code, MAPVK_VK_TO_VSC); + int scanCode = Native.mapVirtualKey(code, Windows.MAPVK_VK_TO_VSC); Native.postMessage(handle, type.getCode(), code, 1 | (scanCode << 16)); } diff --git a/java/src/mimis/application/vlc/VLCApplication.java b/java/src/mimis/application/vlc/VLCApplication.java index 230ec27..1ccd99a 100644 --- a/java/src/mimis/application/vlc/VLCApplication.java +++ b/java/src/mimis/application/vlc/VLCApplication.java @@ -14,9 +14,11 @@ import mimis.exception.worker.DeactivateException; import mimis.util.Native; import mimis.value.Action; import mimis.value.Amount; +import mimis.value.Registry; public class VLCApplication extends CMDApplication { - protected final static String REGISTRY = "HKCR\\Applications\\vlc.exe\\shell\\Open\\command"; + protected final static Registry REGISTRY = Registry.CLASSES_ROOT; + protected final static String KEY = "Applications\\vlc.exe\\shell\\Open\\command"; protected final static String PROGRAM = "vlc.exe"; protected final static String TITLE = "VLC media player"; @@ -43,7 +45,7 @@ public class VLCApplication extends CMDApplication { public String getPath() { Pattern pattern = Pattern.compile("\"([^\"]+)\""); - Matcher matcher = pattern.matcher(Native.getValue(REGISTRY)); + Matcher matcher = pattern.matcher(Native.getValue(REGISTRY, KEY)); return matcher.find() ? matcher.group(1) : null; } diff --git a/java/src/mimis/device/lirc/LircService.java b/java/src/mimis/device/lirc/LircService.java index 394799b..f5b27d4 100644 --- a/java/src/mimis/device/lirc/LircService.java +++ b/java/src/mimis/device/lirc/LircService.java @@ -19,6 +19,7 @@ import mimis.exception.button.UnknownButtonException; import mimis.exception.worker.ActivateException; import mimis.exception.worker.DeactivateException; import mimis.util.Native; +import mimis.value.Registry; public class LircService extends Worker { public static final String IP = "localhost"; @@ -37,7 +38,7 @@ public class LircService extends Worker { public LircService(HashMap buttonMap) { this(buttonMap, IP, PORT); - send = Native.getValue("HKCU\\Software\\LIRC", "password"); + send = Native.getValue(Registry.CURRENT_USER, "Software\\LIRC", "password"); } public LircService(HashMap buttonMap, String ip, int port) { diff --git a/java/src/mimis/util/Native.java b/java/src/mimis/util/Native.java index 548110f..6f1bbfd 100644 --- a/java/src/mimis/util/Native.java +++ b/java/src/mimis/util/Native.java @@ -1,9 +1,7 @@ package mimis.util; -import java.io.IOException; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Scanner; +import mimis.value.Registry; +import mimis.value.Windows; public class Native { static { @@ -11,10 +9,10 @@ public class Native { } public void start() { - /*int handle = getHandle("Winamp v1.x"); + int handle = getHandle("Winamp v1.x"); System.out.println(handle); - sendMessage(handle, WindowsApplication.WM_CLOSE, 0, 0); - /*/ + sendMessage(handle, Windows.WM_CLOSE, 0, 0); + /* while (true) {//Winamp v1.x System.out.println(isRunning("winamp.exe")); //System.out.println(new Native().terminate("winamp.exe")); @@ -25,7 +23,7 @@ public class Native { // TODO Auto-generated catch block e.printStackTrace(); } - } + }*/ } public static void main(String[] args) { @@ -33,43 +31,37 @@ public class Native { } public native static int getHandle(String window); + + public static int sendMessage(int handle, Windows windows, int wParam, int lParam) { + return sendMessage(handle, windows.getCode(), wParam, lParam); + } + public native static int sendMessage(int handle, int message, int wParam, int lParam); + + public static int postMessage(int handle, Windows windows, int wParam, int lParam) { + return postMessage(handle, windows.getCode(), wParam, lParam); + } + public native static int postMessage(int handle, int message, int wParam, int lParam); - public static native int mapVirtualKey(int code, int type); + + public static int mapVirtualKey(int code, Windows windows) { + return mapVirtualKey(code, windows.getCode()); + } + + public native static int mapVirtualKey(int code, int type); + public native static boolean isRunning(String program); + public native static boolean terminate(String program); - public static String getValue(String key, String name) { - String command = String.format("reg query \"%s\"", key); - try { - Process process = Runtime.getRuntime().exec(command); - Scanner processScanner = new Scanner(process.getInputStream()); - processScanner.nextLine(); - processScanner.nextLine(); - while (processScanner.hasNextLine()) { - String line = processScanner.nextLine(); - int index = line.indexOf(name); - if (index > -1) { - int begin = index + name.length() + 1; - Scanner lineScanner = new Scanner(line.substring(begin)); - lineScanner.next(); - return lineScanner.nextLine().trim(); - } - } - } catch (IOException e) { - } catch (NoSuchElementException e) {} - return null; + public static String getValue(Registry registry, String key) { + return getValue(registry, key, ""); } - public static String getValue(String key) { - return getValue(key, "(Default)"); + public static String getValue(Registry registry, String key, String name) { + return getValue(registry.getCode(), key, name); } - public static String replaceVariables(String string) { - Map env = System.getenv(); - for (String key : env.keySet()) { - string = string.replace(String.format("%%%s%%", key), env.get(key)); - } - return string; - } + public native static String getValue(int registry, String key, String name); + } diff --git a/java/src/mimis/value/Registry.java b/java/src/mimis/value/Registry.java new file mode 100644 index 0000000..9ed7873 --- /dev/null +++ b/java/src/mimis/value/Registry.java @@ -0,0 +1,21 @@ +package mimis.value; + +public enum Registry { + CLASSES_ROOT (0x80000000), + CURRENT_USER (0x80000001), + LOCAL_MACHINE (0x80000002), + USERS (0x80000003), + PERFORMANCE_DATA (0x80000004), + CURRENT_CONFIG (0x80000005), + DYN_DATA (0x80000006); + + protected int code; + + private Registry(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/java/src/mimis/value/Windows.java b/java/src/mimis/value/Windows.java new file mode 100644 index 0000000..491c041 --- /dev/null +++ b/java/src/mimis/value/Windows.java @@ -0,0 +1,19 @@ +package mimis.value; + +public enum Windows { + WM_CLOSE (0x0010), + WM_COMMAND (0x0111), + WM_APPCOMMAND (0x0319), + WM_USER (0x0400), + MAPVK_VK_TO_VSC (0); + + protected int code; + + private Windows(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +}