*Java [#m5391c84]

#ref(http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Java_logo_and_wordmark.svg/200px-Java_logo_and_wordmark.svg.png,right,around,nolink,Java)

#contents

*Java 8 [#e1088309]

-http://java.com/
-[[JDKのインストール(Windows)と Java 関連用語の説明:http://yohshiy.blog.fc2.com/blog-entry-226.html]]
-http://stackoverflow.com/questions/5826070/java-runtime-process-check-if-waiting-for-input
-http://stackoverflow.com/questions/10765928/java-how-to-know-if-a-process-is-waiting-for-input
-http://stackoverflow.com/questions/54686/how-to-get-a-list-of-current-open-windows-process-with-java
-http://stackoverflow.com/questions/15050391/how-to-make-structure-in-jna
-[[Java/「現在ディレクトリ」(Current Working Directory)の変更:http://www.glamenv-septzen.net/view/1213]]
-[[Java からコマンドを実行 - Runtime クラスの利用 -:http://www.whitemark.co.jp/tec/java/javaExamples9.html]]
-[[Javaでシェルコマンドを実行して標準出力を取得する:http://blog.app-works.org/archives/194]]

**Java™ Platform, Standard Edition (JRE & JDK) [#o8881b8e]

-[[Java SE Downloads:http://www.oracle.com/technetwork/java/javase/downloads/]]
-http://jdk8.java.net/download.html

Java で書かれたアプリケーションを使用する場合は JRE をインストールします.~
Java でプログラミングをしたい人は JDK をインストールします.~

-[[Java Portable:http://sourceforge.net/projects/portableapps/files/Java%20Portable/Additional%20Versions/]]

もあります.

**ライブラリ [#t5f9c39b]
-[[Java Native Access (JNA):https://github.com/twall/jna]]
-[[JDDE (Dynamic Data Exchange For Java):http://jdde.pretty-tools.com/]]
--http://sourceforge.net/projects/jdde/
-[[JRegistry:http://sourceforge.net/projects/jregistry/]]

**IDE [#efcb0c41]

-[[Eclipse]]

*[[fwdsumatrapdf>SumatraPDF/fwdsumatrapdf]] &aname(fwdsumatrapdf); [#d64fe02a]

**Java 版 [#h4cb0cda]

ビルド・実行には

-JDK
-[[JDDE (Dynamic Data Exchange For Java):http://jdde.pretty-tools.com/]]
-[[JRegistry:http://sourceforge.net/projects/jregistry/]]
-[[Java Native Access (JNA):https://github.com/twall/jna]]

が必要です.~
JDK 8, JDDE 2.0.3, JRegistry 1.8.1, JNA 4.0.0 で動作確認しています.~

 >javac -cp .;pretty-tools-JDDE-2.0.3.jar;jregistry-1.8.1.jar;jna-4.0.0.jar Fwdsumatrapdf.java

 C:.
 └─w32tex
     └─bin
         ├─Fwdsumatrapdf.java
         ├─Fwdsumatrapdf.class
         ├─pretty-tools-JDDE-2.0.3.jar
         ├─JavaDDE.dll
         ├─JavaDDEx64.dll
         ├─jregistry-1.8.1.jar
         ├─reg.dll
         ├─reg_x64.dll
         └─jna-4.0.0.jar

----
-Fwdsumatrapdf.java
----
 /* vim: ts=4 sw=4 expandtab:
  * >javac -cp .;pretty-tools-JDDE-2.0.3.jar;jregistry-1.8.1.jar;jna-4.0.0.jar Fwdsumatrapdf.java
  * >java -cp .;pretty-tools-JDDE-2.0.3.jar;jregistry-1.8.1.jar;jna-4.0.0.jar Fwdsumatrapdf
  */
 
 import java.util.List;
 import java.util.Arrays;
 import com.registry.RegistryKey;
 import com.registry.RegistryValue;
 import com.registry.RegStringValue;
 import com.pretty_tools.dde.ClipboardFormat;
 import com.pretty_tools.dde.DDEException;
 import com.pretty_tools.dde.client.DDEClientConversation;
 import com.pretty_tools.dde.DDEMLException;
 import com.sun.jna.Library;
 import com.sun.jna.win32.StdCallLibrary;
 import com.sun.jna.Native;
 import com.sun.jna.WString;
 import com.sun.jna.Structure;
 import com.sun.jna.Pointer;
 
 public class Fwdsumatrapdf
 {
     public static class STARTUPINFOW extends Structure {
         public int cb;
         public WString lpReserved;
         public WString lpDesktop;
         public WString lpTitle;
         public int dwX;
         public int dwY;
         public int dwXSize;
         public int dwYSize;
         public int dwXCountChars;
         public int dwYCountChars;
         public int dwFillAttribute;
         public int dwFlags;
         public short wShowWindow;
         public short cbReserved2;
         public Pointer lpReserved2;
         public Pointer hStdInput;
         public Pointer hStdOutput;
         public Pointer hStdError;
         @Override
         protected List getFieldOrder() {
             return Arrays.asList(
                     "cb",
                     "lpReserved",
                     "lpDesktop",
                     "lpTitle",
                     "dwX",
                     "dwY",
                     "dwXSize",
                     "dwYSize",
                     "dwXCountChars",
                     "dwYCountChars",
                     "dwFillAttribute",
                     "dwFlags",
                     "wShowWindow",
                     "cbReserved2",
                     "lpReserved2",
                     "hStdInput",
                     "hStdOutput",
                     "hStdError");
         }
     }
 
     public static class PROCESS_INFORMATION extends Structure {
         public Pointer hProcess;
         public Pointer hThread;
         public int dwProcessId;
         public int dwThreadId;
         @Override
         protected List getFieldOrder() {
             return Arrays.asList(
                     "hProcess",
                     "hThread",
                     "dwProcessId",
                     "dwThreadId");
         }
     }
 
     public interface Kernel32 extends StdCallLibrary {
         public boolean CreateProcessW(
                 Pointer lpApplicationName,
                 WString lpCommandLine,
                 Pointer lpProcessAttributes,
                 Pointer lpThreadAttributes,
                 boolean bInheritHandles,
                 int dwCreationFlags,
                 Pointer lpEnvironment,
                 Pointer lpCurrentDirectory,
                 STARTUPINFOW lpStartupInfo,
                 PROCESS_INFORMATION lpProcessInformation);
     }
 
     public interface User32 extends StdCallLibrary {
         public int WaitForInputIdle(
                 Pointer hProcess,
                 int dwMilliseconds);
     }
 
     public static void usage(String[] args)
     {
         if (args.length != 3) {
             String s = "usage: java -cp .;pretty-tools-JDDE-2.0.3.jar;jregistry-1.8.1.jar;jna-4.0.0.jar Fwdsumatrapdf pdf tex line";
             System.err.println(s);
             System.exit(2);
         }
     }
 
     public static void ddeExecute(String[] args)
     {
         try
         {
             final RegistryKey root = RegistryKey.getRootKeyForIndex(RegistryKey.HKEY_LOCAL_MACHINE_INDEX);
             final String subKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\SumatraPDF.exe";
             final RegistryKey regKey = new RegistryKey(root, subKey);
             final RegStringValue keyVal = (RegStringValue)regKey.getValue(null);
             final WString cmd = new WString("\"" + keyVal.getValue() + "\" -reuse-instance");
             final DDEClientConversation conversation = new DDEClientConversation();
             final int TIMEOUT = 10000;
             conversation.setTextFormat(ClipboardFormat.CF_UNICODETEXT);
             STARTUPINFOW si = new STARTUPINFOW();
             PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
             Kernel32 kernel32 = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class);
             User32 user32 = (User32)Native.loadLibrary("user32", User32.class);
             kernel32.CreateProcessW(Pointer.NULL, cmd, Pointer.NULL, Pointer.NULL, false, 0, Pointer.NULL, Pointer.NULL, si, pi);
             user32.WaitForInputIdle(pi.hProcess, TIMEOUT);
 
             try
             {
                 final String SERVER = "SUMATRA";
                 final String TOPIC = "control";
                 conversation.connect(SERVER, TOPIC);
                 final String pdf = args[0];
                 final String tex = args[1];
                 final String line = args[2];
                 final String active = "0";
                 final String forwadSearch = "[ForwardSearch(\"" + pdf + "\",\"" + tex + "\"," + line + ",0,0," + active + ")]";
                 conversation.execute(forwadSearch);
             }
             finally
             {
                 conversation.disconnect();
             }
         }
         catch (DDEMLException e)
         {
             System.err.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode()) + " " + e.getMessage());
             System.exit(1);
         }
         catch (DDEException e)
         {
             System.err.println("DDEClientException: " + e.getMessage());
             System.exit(1);
         }
         catch (Exception e)
         {
             System.err.println("Exception: " + e);
             System.exit(1);
         }
     }
 
     public static void main(String[] args)
     {
         try
         {
             usage(args);
             ddeExecute(args);
 
         }
         catch (Exception e)
         {
             System.err.println("Exception: " + e);
             System.exit(1);
         }
     }
 }
----