- 追加された行はこの色です。
- 削除された行はこの色です。
*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)
&color(White,#5F2F2F){ ''◆CONTENTS◆'' };&br;
#contents
*Summary [#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 8の新機能:http://news.mynavi.jp/special/2014/java8/]]
-[[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 Advent Calendar 2013:http://www.adventar.org/calendars/145]]
**Java™ Platform, Standard Edition (JRE & JDK) [#o8881b8e]
-[[Java SE Downloads:http://www.oracle.com/technetwork/java/javase/downloads/]]
-https://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.1.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.1.0.jar
└─jna-platform-4.1.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.1.0.jar Fwdsumatrapdf.java
* >java -cp .;pretty-tools-JDDE-2.0.3.jar;jregistry-1.8.1.jar;jna-4.1.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.1.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);
}
}
}
----