1

C#コンソールアプリケーションからJavaアプリケーションを正しくシャットダウンするコードを作成しましInputSimulatorたが、試してみると、期待した結果が得られませんでした。

キーボード CTRL-C を使用して Java アプリケーションを閉じると、

...
[INFO] 2012-07-03 19:29:36 - Packet: [C] 0x02
[INFO] 2012-07-03 19:29:40 - Shutdown hook raised, shutting down...
[INFO] 2012-07-03 19:29:45 - All data saved. Good luck!

InputSimulator を使用して Java アプリケーションを閉じると、

フル スレッド ダンプ Java HotSpot(TM) クライアント VM (20.6-b01 混合モード):

"DestroyJavaVM" prio=6 tid=0x4b524000 nid=0x6f4 条件 [0x00000000] java.lang.Thread.State: RUNNABLE で待機中

"Thread-1" prio=6 tid=0x4b523800 nid=0x65c 条件 [0x4cd0f000] で待機.run(DeadlockDetector.java:76) で java.lang.Thread.run(不明なソース)

"server-rdc-acceptor" prio=6 tid=0x4b523000 nid=0x102c 実行可能 [0x4cc7f000] java.lang.Thread.State: sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0 (ネイティブ メソッド) で実行可能です。 ch.WindowsSelectorImpl$SubSelector.poll(不明なソース) at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(不明なソース)

    at sun.nio.ch.WindowsSelectorImpl.doSelect(Unknown Source)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
    - locked <0x3e057ef0> (a sun.nio.ch.Util$2)
    - locked <0x3e057ee0> (a java.util.Collections$UnmodifiableSet)
    - locked <0x3e057cc0> (a sun.nio.ch.WindowsSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(Unknown Source)
    at sun.nio.ch.SelectorImpl.select(Unknown Source)
    at commons.ngen.network.Acceptor.run(Acceptor.java:259)

私のInputSimulatorを使用:

private void StartServer()
{

                ProcessStartInfo info = new ProcessStartInfo();
                info.UseShellExecute = false;
                info.FileName = "java"
                info.Arguments = "-Xms512m -Xmx1024m server.jar gameserver.Server"
                ServerProcess = new Process();
                ServerProcess.StartInfo = info;
                ServerProcess.Start();

                Thread.Sleep(60000);
                CloseCorrectly(ServerProcess);
}

private void CloseCorrectly(Process pr)
{
  IntPtr hWnd = pr.MainWindowHandle;
  if (hWnd != null)
            {
                    SetForegroundWindow(hWnd);
                    Thread.Sleep(1000);
                    InputSimulator f = new InputSimulator();

                    f.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.CANCEL);

                Thread.Sleep(1000);
            }
}

私が間違っているのは何ですか?

4

2 に答える 2

2

ホームページ ( http://inputsimulator.codeplex.com/ ) では、次の方法で ctrl-C を実行できることが示唆されています。

InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C);

ドキュメントはキャンセルが何であるかを示唆していませんが、幸いなことに、JamesB はソースを勇敢に検索して、ブレークを参照していることを発見しました。

上記のコードを試してみてください。うまくいけば、実際の ctrl-c をシミュレートするはずです。

于 2012-07-03T15:56:31.863 に答える
0

既に InputSimulator を使用されていることは承知しており、質問は SimulateModifiedKeyStroke に関するものです。

しかし、あなたは呼び出すことによってこれを達成することができます

Sendkeys.SendWait("^c")
于 2012-07-03T15:59:50.987 に答える