diff --git a/java/src/pm/application/windows/WindowsApplication.java b/java/src/pm/application/windows/WindowsApplication.java index 4af787b..04487eb 100644 --- a/java/src/pm/application/windows/WindowsApplication.java +++ b/java/src/pm/application/windows/WindowsApplication.java @@ -2,25 +2,28 @@ package pm.application.windows; import java.io.IOException; -import com.eaio.nativecall.IntCall; -import com.eaio.nativecall.NativeCall; - import pm.Application; import pm.exception.application.ApplicationExitException; import pm.exception.application.ApplicationInitialiseException; import pm.exception.application.windows.SendCommandException; import pm.exception.application.windows.SendKeyException; import pm.util.Native; -import pm.util.VBScript; +import pm.util.Windows; + +import com.eaio.nativecall.IntCall; +import com.eaio.nativecall.NativeCall; abstract public class WindowsApplication extends Application { protected final static int TERMINATE_SLEEP = 500; protected final static int START_SLEEP = 500; + protected final static String REGISTRY = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths"; + protected final static int WM_COMMAND = 0x0111; protected final static int WM_APPCOMMAND = 0x0319; protected String program; + protected String title; protected String name; protected String target; @@ -39,39 +42,32 @@ abstract public class WindowsApplication extends Application { } } - public WindowsApplication(String program, String name, String target) { + public WindowsApplication(String program, String title, String name) { this.program = program; + this.title = title; this.name = name; - this.target = target; handle = -1; } public void initialise() throws ApplicationInitialiseException { - try { - if (VBScript.isRunning(program)) { - handle = Native.getHandle(name); - if (handle < 0) { - while (VBScript.isRunning(program)) { - VBScript.terminate(program); - sleep(TERMINATE_SLEEP); - } - } - } - if (handle < 0) { - process = Runtime.getRuntime().exec(target); - while (!VBScript.isRunning(program)) { - sleep(START_SLEEP); - } - IntCall findWindow = new IntCall("user32", "FindWindowA"); - handle = findWindow.executeCall(new Object[] {null, name}); - } - } catch (IOException e) {} - if (handle < 1) { - throw new ApplicationInitialiseException(); - } sendMessage = new IntCall("user32", "SendMessageA"); postMessage = new IntCall("user32", "PostMessageA"); mapVirtualKey = new IntCall("user32", "MapVirtualKeyA"); + + handle = Windows.findWindow(name, null); + if (handle < 1) { + String key = String.format("%s\\%s", REGISTRY, program); + String path = Native.getValue(key); + try { + String command = String.format("\"%s\"", path); + process = Runtime.getRuntime().exec(command); + sleep(START_SLEEP); + handle = Windows.findWindow(name, null); + } catch (IOException e) {} + } + if (handle < 1) { + throw new ApplicationInitialiseException(); + } } public void exit() throws ApplicationExitException { diff --git a/java/src/pm/application/windows/gomplayer/GomPlayerApplication.java b/java/src/pm/application/windows/gomplayer/GomPlayerApplication.java index c64a2d1..91653c8 100644 --- a/java/src/pm/application/windows/gomplayer/GomPlayerApplication.java +++ b/java/src/pm/application/windows/gomplayer/GomPlayerApplication.java @@ -9,21 +9,20 @@ import pm.exception.application.windows.SendCommandException; import pm.exception.application.windows.SendKeyException; public class GomPlayerApplication extends WindowsApplication { - protected final static String REGISTRY = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Clients\\Media\\GomPlayer\\shell\\open\\command"; protected final static String PROGRAM = "GOM.exe"; - protected final static String NAME = "GOM Player"; + protected final static String TITLE = "GOM Player"; + protected final static String NAME = "GomPlayer1.x"; public GomPlayerApplication() { - super(PROGRAM, NAME, "C:\\Program Files (x86)\\GRETECH\\GomPlayer\\GOM.exe"); + super(PROGRAM, TITLE, NAME); } public void action(Action action) { + System.out.println(handle); System.out.println("GomPlayerApplication: " + action); - //http://www.keyxl.com/aaa0602/267/GOM-Player-keyboard-shortcuts.htm try { switch (action) { case PLAY: - System.out.println("spacie " + handle); command(0x800C); break; case NEXT: diff --git a/java/src/pm/application/windows/wmp/WMPApplication.java b/java/src/pm/application/windows/wmp/WMPApplication.java index a3203ef..3d9818c 100644 --- a/java/src/pm/application/windows/wmp/WMPApplication.java +++ b/java/src/pm/application/windows/wmp/WMPApplication.java @@ -1,9 +1,5 @@ package pm.application.windows.wmp; -import java.util.prefs.Preferences; - -import com.eaio.nativecall.IntCall; - import pm.Action; import pm.application.windows.Command; import pm.application.windows.WindowsApplication; @@ -11,17 +7,12 @@ import pm.exception.application.ApplicationInitialiseException; import pm.exception.application.windows.SendCommandException; public class WMPApplication extends WindowsApplication { - protected final static String PATH = "C:\\Program Files (x86)\\Windows Media Player\\"; protected final static String PROGRAM = "wmplayer.exe"; - protected final static String NAME = "Windows Media Player"; + protected final static String TITLE = "Windows Media Player"; + protected final static String NAME = "WMPlayerApp"; public WMPApplication() { - super(PATH, PROGRAM, NAME); - } - - public void initialise() throws ApplicationInitialiseException { - super.initialise(); - //RegistryKey; + super(PROGRAM, TITLE, NAME); } public void action(Action action) { diff --git a/java/src/pm/util/Native.java b/java/src/pm/util/Native.java index 855d295..004e5ed 100644 --- a/java/src/pm/util/Native.java +++ b/java/src/pm/util/Native.java @@ -37,7 +37,8 @@ public class Native { } public static String getValue(String key, String name) throws IOException { - Process process = Runtime.getRuntime().exec("reg query " + key); + String command = String.format("reg query \"%s\"", key); + Process process = Runtime.getRuntime().exec(command); Scanner processScanner = new Scanner(process.getInputStream()); try { processScanner.nextLine(); diff --git a/java/src/pm/util/Windows.java b/java/src/pm/util/Windows.java new file mode 100644 index 0000000..5689a0c --- /dev/null +++ b/java/src/pm/util/Windows.java @@ -0,0 +1,25 @@ +package pm.util; + +import com.eaio.nativecall.IntCall; + +public class Windows { + protected static IntCall findWindow; + protected static IntCall sendMessage; + protected static IntCall postMessage; + protected static IntCall mapVirtualKey; + + static { + findWindow = new IntCall("user32", "FindWindowA"); + sendMessage = new IntCall("user32", "SendMessageA"); + postMessage = new IntCall("user32", "PostMessageA"); + mapVirtualKey = new IntCall("user32", "MapVirtualKeyA"); + } + + public static int findWindow(String className, String windowName) { + return findWindow.executeCall(new Object[] {className, windowName}); + } + + public static boolean postMessage(int handle, int message, int wParam, int lParam) { + return postMessage.executeBooleanCall(new Object[] {handle, message, wParam, lParam}); + } +}