2017-12-06 1 views
0

押し続ける:キーは私がするプログラムを作成しようとしています何度

  • ライブチャットメッセージが特定のコントロールの場合は、ライブストリーム
  • からのライブチャットメッセージを取りプレスとのために、そのキーを保持します2秒
  • ライブチャットIDを書き留めて、もう一度キーを押さないでください。

これまで私がこれまで行ってきたことは次のとおりです。プログラムを実行してチャットボックスに値を入力すると、キーを無限に押して停止せず、コンピュータをフリーズします。

import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.net.URL; 
import java.nio.channels.Channels; 
import java.nio.channels.ReadableByteChannel; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 

import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 
import org.json.simple.parser.JSONParser; 

class Game { 
    String[] rawCommands = { "up", "down", "left", "right", "start", "select", "a", "b", "x", "y", "l", "r" }; 
    int[] transCommands = { KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C, KeyEvent.VK_D, KeyEvent.VK_E, KeyEvent.VK_F, 
      KeyEvent.VK_G, KeyEvent.VK_H, KeyEvent.VK_I, KeyEvent.VK_J, KeyEvent.VK_K, KeyEvent.VK_L }; 
    ArrayList<String> seen = new ArrayList<String>(); 

    void main() { 
     while (true) { 
      HashMap<Integer, String[]> messages = listChatMessages(); 

      for (int i = 0; i < messages.size(); i++) { 
       String[] full = messages.get(i); 
       String id = full[0]; 
       String msg = full[1]; 

       Result r = oneOfManyIgnoreCase(msg, rawCommands); 
       if (r.bool) { 
        if (!oneOfManyIgnoreCase(id, seen.toArray(new String[seen.size()])).bool) { 
         int key = transCommands[Arrays.asList(rawCommands).indexOf(r.msg)]; 
         keyPress(key); 
         if (seen.size() > 90) { 
          seen.remove(0); 
         } 
         seen.add(id); 
        } 
       } 
      } 
     } 
    } 

    void deleteChatMessage(String id) { 

    } 

    HashMap<Integer, String[]> listChatMessages() { 
     HashMap<Integer, String[]> messages = new HashMap<>(); 
     try { 
      URL response = new URL("https://www.googleapis.com/youtube/v3/liveChat/m" 
        + "essages?liveChatId=EiEKGFVDaUxwMWJTNFpvc2JlaHA5bHppbGNJQRIFL2xpdmU&part=sn" 
        + "ippet&key=AIzaSyAYFLriWHDy8MJZ_zblU-GuovOoqg6L-28&maxResults=200&pageToken=GKf04s3c7tcCILjGoM7c7tcC"); 
      ReadableByteChannel rbc = Channels.newChannel(response.openStream()); 
      FileOutputStream fos = new FileOutputStream("messages.json"); 
      fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
      fos.close(); 

      JSONParser parser = new JSONParser(); 
      Object obj = parser.parse(new FileReader("messages.json")); 
      JSONObject jObj = (JSONObject) obj; 
      JSONArray jArr = (JSONArray) jObj.get("items"); 
      for (int i = 0; i < jArr.size(); i++) { 
       JSONObject msg = (JSONObject) jArr.get(i); 
       JSONObject snippet = (JSONObject) msg.get("snippet"); 
       JSONObject txtDetails = (JSONObject) snippet.get("textMessageDetails"); 
       String[] full = new String[2]; 
       full[1] = (String) txtDetails.get("messageText"); 
       full[0] = (String) msg.get("id"); 

       messages.put(i, full); 

      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return messages; 
    } 

    void keyPress(int key) { 
     new Thread(new Runnable() { 
      public void run() { 
       try { 
        Robot bot = new Robot(); 
        bot.setAutoDelay(1); 

        int duration = 3000; 
        long start = System.currentTimeMillis(); 
        while (System.currentTimeMillis() - start < duration) { 
         bot.keyPress(key); 
         bot.keyRelease(key); 
        } 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

    Result oneOfManyIgnoreCase(String one, String[] many) { 
     Boolean match = false; 
     String message = ""; 
     for (String man : many) { 
      if (one.equalsIgnoreCase(man)) { 
       match = true; 
       message = man; 
       break; 
      } 
     } 
     Result r = new Result(match, message); 
     return r; 
    } 
} 
+0

ていないロボットオブジェクトに精通しなく 'ながら(のSystem.currentTimeMillis() - 持続時間<開始){ bot.keyPress(キー)。 bot.keyRelease(key); } '' ''は '' X秒間キーを押し続けるのではなく、X秒間キーを押し続けているように見えます。 – user3298823

答えて

0

以下のコードは、キー操作を処理するのには適していません。一般的にプログラムでキーを押したままにしたい場合は、時間が経過するまでキーを押してから、時間が終了してから2ミリ秒を待ってキーを離します。私はあなたがキーボードドライバにリリースを処理するのに十分な時間を与えているとは思わない。さらに。一度だけキーを押すか、少なくとも必要な回数だけ試してみてください。私は間違っていないと通常は一度押すだけで、時間が完了したらそれをリリースする必要があると私は思う。

while (System.currentTimeMillis() - start < duration) { 
    bot.keyPress(key); 
    bot.keyRelease(key); 
} 
関連する問題