Created
May 17, 2020 13:08
-
-
Save PJZ9n/651ed3f11e526815d7157d55df411c98 to your computer and use it in GitHub Desktop.
タイピングをマスターするのは思ったよりも難しいです。Processing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.*; | |
import java.awt.Robot; | |
import net.sourceforge.tess4j.*; | |
import java.io.File; | |
import java.awt.image.BufferedImage; | |
import java.awt.event.KeyEvent; | |
final int PHASE_POS1 = 0; | |
final int PHASE_POS2 = 1; | |
final int PHASE_WAIT = 2; | |
final int PHASE_RUNNING = 3; | |
int phase = PHASE_POS1; | |
boolean selected = false; | |
int pos1X = 0; | |
int pos1Y = 0; | |
int pos2X = 0; | |
int pos2Y = 0; | |
int millis = 0; | |
void setup() { | |
size(1000, 500); | |
textFont(createFont("MS Gothic", 30)); | |
} | |
void draw() { | |
try { | |
background(0); | |
//タイトル | |
textSize(40); | |
text("タイピング自動化ツール", 50, 50); | |
textSize(30); | |
text(floor(frameRate) + "FPS", 550, 50); | |
//フェーズ処理 | |
switch (phase) { | |
case PHASE_POS1: | |
if (!selected) { | |
text("地点1を選択してください", 100, 150); | |
} else { | |
selected = false; | |
phase = PHASE_POS2; | |
} | |
text("NOW - X: " + getMouseX() + " | Y: " + getMouseY(), 100, 200); | |
text("POS1 - X: " + pos1X + " | Y: " + pos1Y, 100, 235); | |
text("POS2 - X: " + pos2X + " | Y: " + pos2Y, 100, 270); | |
break; | |
case PHASE_POS2: | |
if (!selected) { | |
text("地点2を選択してください", 100, 150); | |
} else { | |
selected = false; | |
phase = PHASE_WAIT; | |
} | |
text("NOW - X: " + getMouseX() + " | Y: " + getMouseY(), 100, 200); | |
text("POS1 - X: " + pos1X + " | Y: " + pos1Y, 100, 235); | |
text("POS2 - X: " + pos2X + " | Y: " + pos2Y, 100, 270); | |
break; | |
case PHASE_WAIT: | |
if (!selected) { | |
text("スタート待ちです...", 100, 150); | |
PImage se = getSelectedImage(); | |
image(se, 500, 100, 400, 100); | |
} else { | |
selected = false; | |
phase = PHASE_RUNNING; | |
} | |
text("POS1 - X: " + pos1X + " | Y: " + pos1Y, 100, 235); | |
text("POS2 - X: " + pos2X + " | Y: " + pos2Y, 100, 270); | |
break; | |
case PHASE_RUNNING: | |
if (!selected) { | |
delay(800); | |
text("動作中です...", 100, 150); | |
//画像取得 | |
PImage se = getSelectedImage(); | |
image(se, 500, 100, 400, 100); | |
//OCR掛ける | |
String result = ocr(se).replace("\n", ""); | |
//表示 | |
text("検出: " + result, 500, 350); | |
//打つ | |
Robot robot = new Robot(); | |
/*int[] keys = { | |
KeyEvent.VK_C, | |
}; | |
keyPress(robot, 10, keys);*/ | |
for (int i = 0; i < result.length(); i++) { | |
if (String.valueOf(result.charAt(i)) == " ") { | |
continue; | |
} | |
keyPress(robot, 10, stringToKeycode(String.valueOf(result.charAt(i)))); | |
} | |
selected = false; | |
phase = PHASE_RUNNING; | |
} | |
break; | |
} | |
} catch (Exception e) { | |
println(e.getMessage()); | |
} | |
} | |
int getMouseX() { | |
return (int)MouseInfo.getPointerInfo().getLocation().getX(); | |
} | |
int getMouseY() { | |
return (int)MouseInfo.getPointerInfo().getLocation().getY(); | |
} | |
void keyPressed() { | |
if (key == ' ') { | |
switch (phase) { | |
case PHASE_POS1: | |
selected = true; | |
pos1X = getMouseX(); | |
pos1Y = getMouseY(); | |
break; | |
case PHASE_POS2: | |
selected = true; | |
pos2X = getMouseX(); | |
pos2Y = getMouseY(); | |
break; | |
case PHASE_WAIT: | |
selected = true; | |
break; | |
} | |
} | |
} | |
void keyPress(Robot robot, int delay, int... keys) { | |
for (int key : keys) { | |
robot.keyPress(key); | |
} | |
for (int i = keys.length - 1; i >= 0; i--) { | |
robot.keyRelease(keys[i]); | |
} | |
robot.delay(delay); | |
} | |
int stringToKeycode(String s) throws Exception { | |
switch (s) { | |
case "A": | |
return KeyEvent.VK_A; | |
case "B": | |
return KeyEvent.VK_B; | |
case "C": | |
return KeyEvent.VK_C; | |
case "D": | |
return KeyEvent.VK_D; | |
case "E": | |
return KeyEvent.VK_E; | |
case "F": | |
return KeyEvent.VK_F; | |
case "G": | |
return KeyEvent.VK_G; | |
case "H": | |
return KeyEvent.VK_H; | |
case "I": | |
return KeyEvent.VK_I; | |
case "J": | |
return KeyEvent.VK_J; | |
case "K": | |
return KeyEvent.VK_K; | |
case "L": | |
return KeyEvent.VK_N; | |
case "M": | |
return KeyEvent.VK_M; | |
case "N": | |
return KeyEvent.VK_N; | |
case "O": | |
return KeyEvent.VK_O; | |
case "P": | |
return KeyEvent.VK_P; | |
case "Q": | |
return KeyEvent.VK_Q; | |
case "R": | |
return KeyEvent.VK_R; | |
case "S": | |
return KeyEvent.VK_S; | |
case "T": | |
return KeyEvent.VK_T; | |
case "U": | |
return KeyEvent.VK_U; | |
case "V": | |
return KeyEvent.VK_V; | |
case "W": | |
return KeyEvent.VK_W; | |
case "X": | |
return KeyEvent.VK_X; | |
case "Y": | |
return KeyEvent.VK_Y; | |
case "Z": | |
return KeyEvent.VK_Z; | |
case "-": | |
return KeyEvent.VK_MINUS; | |
case "0": | |
return KeyEvent.VK_0; | |
case "1": | |
return KeyEvent.VK_1; | |
case "2": | |
return KeyEvent.VK_2; | |
case "3": | |
return KeyEvent.VK_3; | |
case "4": | |
return KeyEvent.VK_4; | |
case "5": | |
return KeyEvent.VK_5; | |
case "6": | |
return KeyEvent.VK_6; | |
case "7": | |
return KeyEvent.VK_7; | |
case "8": | |
return KeyEvent.VK_8; | |
case "9": | |
return KeyEvent.VK_9; | |
default: | |
return KeyEvent.VK_MINUS;//HACK!!i | |
//throw new Exception(); | |
} | |
} | |
String ocr(PImage image) { | |
ITesseract t = new Tesseract(); | |
t.setTessVariable("tessedit_char_whitelist","1234567890ABCDEFGHIJKLMNOPQRSSTUVWXYZ-i"); | |
t.setLanguage("eng"); | |
try { | |
String result = t.doOCR((BufferedImage)image.getNative()); | |
return result; | |
} catch (TesseractException e) { | |
println(e.getMessage()); | |
return "Unknown"; | |
} | |
} | |
PImage screenshot() { | |
try { | |
return new PImage(new Robot().createScreenCapture(new java.awt.Rectangle(0, 0, displayWidth, displayHeight))); | |
} catch (AWTException e) { | |
return new PImage();//hack | |
} | |
} | |
PImage getSelectedImage() { | |
return screenshot().get(pos1X, pos1Y, pos2X - pos1X, pos2Y - pos1Y); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment