From 18bec2cad68ea7e39a8009ef9b3bfa908d56e352 Mon Sep 17 00:00:00 2001 From: dydtjr1128 Date: Thu, 6 Dec 2018 20:26:08 +0900 Subject: [PATCH] Change structures --- .gitignore | 28 +- .idea/vcs.xml | 6 + KeyboardHookTest/KeyboardHookTest.iml | 15 + KeyboardHookTest/pom.xml | 37 + .../src/main/java/KeyBoardHook.java | 66 ++ RemoteControl-Client/RemoteControl-Client.iml | 17 + RemoteControl-Client/pom.xml | 44 + .../bin => RemoteControl-Client/res}/exit.png | Bin .../res}/minimize.png | Bin .../src/main/java}/DebugMessage.java | 22 +- .../src/main/java}/NetworkScreenClient.java | 422 ++++--- .../src/main/java}/ScreenPanel.java | 814 ++++++------- RemoteControl-Server/RemoteControl-Server.iml | 16 + RemoteControl-Server/pom.xml | 44 + .../src/main/java}/DebugMessage.java | 22 +- .../src/main/java}/JNAScreenShot.java | 309 +++-- .../src/main/java}/NetworkScreenServer.java | 1002 ++++++++--------- RemoteControlClient/.classpath | 25 - RemoteControlClient/.gitignore | 1 - RemoteControlClient/.project | 23 - .../.settings/org.eclipse.jdt.core.prefs | 13 - .../.settings/org.eclipse.m2e.core.prefs | 4 - RemoteControlClient/bin/DebugMessage.class | Bin 778 -> 0 bytes .../bin/NetworkScreenClient$1.class | Bin 755 -> 0 bytes .../bin/NetworkScreenClient$2.class | Bin 786 -> 0 bytes .../bin/NetworkScreenClient$3.class | Bin 866 -> 0 bytes .../NetworkScreenClient$ControlPanel$1.class | Bin 1376 -> 0 bytes .../NetworkScreenClient$ControlPanel$2.class | Bin 1658 -> 0 bytes .../NetworkScreenClient$ControlPanel$3.class | Bin 3243 -> 0 bytes .../NetworkScreenClient$ControlPanel$4.class | Bin 847 -> 0 bytes .../NetworkScreenClient$ControlPanel.class | Bin 2284 -> 0 bytes .../bin/NetworkScreenClient.class | Bin 3878 -> 0 bytes RemoteControlClient/bin/ScreenPanel$1.class | Bin 1169 -> 0 bytes RemoteControlClient/bin/ScreenPanel$2.class | Bin 1652 -> 0 bytes RemoteControlClient/bin/ScreenPanel$3.class | Bin 1341 -> 0 bytes .../bin/ScreenPanel$FPSCheckThread.class | Bin 1088 -> 0 bytes .../bin/ScreenPanel$KeyboardThread$1.class | Bin 3138 -> 0 bytes .../bin/ScreenPanel$KeyboardThread.class | Bin 2476 -> 0 bytes .../bin/ScreenPanel$User32jna.class | Bin 532 -> 0 bytes .../bin/ScreenPanel$showThread.class | Bin 1958 -> 0 bytes RemoteControlClient/bin/ScreenPanel.class | Bin 8666 -> 0 bytes RemoteControlClient/pom.xml | 50 - RemoteControlClient/res/exit.png | Bin 1194 -> 0 bytes RemoteControlClient/res/minimize.png | Bin 346 -> 0 bytes RemoteControlServer/.classpath | 25 - RemoteControlServer/.gitignore | 1 - RemoteControlServer/.project | 23 - .../.settings/org.eclipse.jdt.core.prefs | 13 - .../.settings/org.eclipse.m2e.core.prefs | 4 - RemoteControlServer/bin/DebugMessage.class | Bin 778 -> 0 bytes RemoteControlServer/bin/GDI32.class | Bin 1460 -> 0 bytes RemoteControlServer/bin/JNAScreenShot.class | Bin 5901 -> 0 bytes .../bin/NetworkScreenServer$1.class | Bin 2009 -> 0 bytes .../NetworkScreenServer$CursorThread.class | Bin 2302 -> 0 bytes ...etworkScreenServer$ImgDoubleBufferTh.class | Bin 2016 -> 0 bytes .../NetworkScreenServer$KeyBoardThread.class | Bin 1614 -> 0 bytes .../bin/NetworkScreenServer$MainPanel$1.class | Bin 2776 -> 0 bytes .../bin/NetworkScreenServer$MainPanel$2.class | Bin 1891 -> 0 bytes .../bin/NetworkScreenServer$MainPanel.class | Bin 6733 -> 0 bytes ...ScreenServer$ServerSocketCloseThread.class | Bin 1022 -> 0 bytes .../bin/NetworkScreenServer$User32jna.class | Bin 564 -> 0 bytes .../bin/NetworkScreenServer.class | Bin 10356 -> 0 bytes RemoteControlServer/bin/User32.class | Bin 700 -> 0 bytes RemoteControlServer/bin/cursor.gif | Bin 11759 -> 0 bytes RemoteControlServer/pom.xml | 50 - RemoteControlServer/res/cursor.gif | Bin 11759 -> 0 bytes ScreenCaptureSample/ScreenCaptureSample.iml | 16 + ScreenCaptureSample/pom.xml | 44 + .../main/java/dydtjr1128/JNAScreenShot.java | 177 +++ .../main/java/dydtjr1128/JNAScreenShot2.java | 120 ++ .../main/java/dydtjr1128/ScreenCapture.java | 270 +++++ 71 files changed, 2173 insertions(+), 1550 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 KeyboardHookTest/KeyboardHookTest.iml create mode 100644 KeyboardHookTest/pom.xml create mode 100644 KeyboardHookTest/src/main/java/KeyBoardHook.java create mode 100644 RemoteControl-Client/RemoteControl-Client.iml create mode 100644 RemoteControl-Client/pom.xml rename {RemoteControlClient/bin => RemoteControl-Client/res}/exit.png (100%) rename {RemoteControlClient/bin => RemoteControl-Client/res}/minimize.png (100%) rename {RemoteControlClient/src => RemoteControl-Client/src/main/java}/DebugMessage.java (95%) rename {RemoteControlClient/src => RemoteControl-Client/src/main/java}/NetworkScreenClient.java (84%) rename {RemoteControlClient/src => RemoteControl-Client/src/main/java}/ScreenPanel.java (89%) create mode 100644 RemoteControl-Server/RemoteControl-Server.iml create mode 100644 RemoteControl-Server/pom.xml rename {RemoteControlServer/src => RemoteControl-Server/src/main/java}/DebugMessage.java (95%) rename {RemoteControlServer/src => RemoteControl-Server/src/main/java}/JNAScreenShot.java (92%) rename {RemoteControlServer/src => RemoteControl-Server/src/main/java}/NetworkScreenServer.java (89%) delete mode 100644 RemoteControlClient/.classpath delete mode 100644 RemoteControlClient/.gitignore delete mode 100644 RemoteControlClient/.project delete mode 100644 RemoteControlClient/.settings/org.eclipse.jdt.core.prefs delete mode 100644 RemoteControlClient/.settings/org.eclipse.m2e.core.prefs delete mode 100644 RemoteControlClient/bin/DebugMessage.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$1.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$2.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$3.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$ControlPanel$1.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$ControlPanel$2.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$ControlPanel$3.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$ControlPanel$4.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient$ControlPanel.class delete mode 100644 RemoteControlClient/bin/NetworkScreenClient.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$1.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$2.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$3.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$FPSCheckThread.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$KeyboardThread$1.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$KeyboardThread.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$User32jna.class delete mode 100644 RemoteControlClient/bin/ScreenPanel$showThread.class delete mode 100644 RemoteControlClient/bin/ScreenPanel.class delete mode 100644 RemoteControlClient/pom.xml delete mode 100644 RemoteControlClient/res/exit.png delete mode 100644 RemoteControlClient/res/minimize.png delete mode 100644 RemoteControlServer/.classpath delete mode 100644 RemoteControlServer/.gitignore delete mode 100644 RemoteControlServer/.project delete mode 100644 RemoteControlServer/.settings/org.eclipse.jdt.core.prefs delete mode 100644 RemoteControlServer/.settings/org.eclipse.m2e.core.prefs delete mode 100644 RemoteControlServer/bin/DebugMessage.class delete mode 100644 RemoteControlServer/bin/GDI32.class delete mode 100644 RemoteControlServer/bin/JNAScreenShot.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$1.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$CursorThread.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$ImgDoubleBufferTh.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$KeyBoardThread.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$MainPanel$1.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$MainPanel$2.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$MainPanel.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$ServerSocketCloseThread.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer$User32jna.class delete mode 100644 RemoteControlServer/bin/NetworkScreenServer.class delete mode 100644 RemoteControlServer/bin/User32.class delete mode 100644 RemoteControlServer/bin/cursor.gif delete mode 100644 RemoteControlServer/pom.xml delete mode 100644 RemoteControlServer/res/cursor.gif create mode 100644 ScreenCaptureSample/ScreenCaptureSample.iml create mode 100644 ScreenCaptureSample/pom.xml create mode 100644 ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot.java create mode 100644 ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot2.java create mode 100644 ScreenCaptureSample/src/main/java/dydtjr1128/ScreenCapture.java diff --git a/.gitignore b/.gitignore index f36c267..9a016ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,26 @@ -/.metadata/ -/.recommenders/ +# Created by .ignore support plugin (hsz.mobi) +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/KeyboardHookTest/KeyboardHookTest.iml b/KeyboardHookTest/KeyboardHookTest.iml new file mode 100644 index 0000000..afcdbd9 --- /dev/null +++ b/KeyboardHookTest/KeyboardHookTest.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/KeyboardHookTest/pom.xml b/KeyboardHookTest/pom.xml new file mode 100644 index 0000000..08145f7 --- /dev/null +++ b/KeyboardHookTest/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + groupId + KeyboardHookTest + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + net.java.dev.jna + jna + 4.1.0 + + + + net.java.dev.jna + jna-platform + 4.1.0 + + + + \ No newline at end of file diff --git a/KeyboardHookTest/src/main/java/KeyBoardHook.java b/KeyboardHookTest/src/main/java/KeyBoardHook.java new file mode 100644 index 0000000..9e74c43 --- /dev/null +++ b/KeyboardHookTest/src/main/java/KeyBoardHook.java @@ -0,0 +1,66 @@ +import com.sun.jna.Pointer; +import com.sun.jna.platform.win32.Kernel32; +import com.sun.jna.platform.win32.User32; +import com.sun.jna.platform.win32.WinDef.HMODULE; +import com.sun.jna.platform.win32.WinDef.LPARAM; +import com.sun.jna.platform.win32.WinDef.LRESULT; +import com.sun.jna.platform.win32.WinDef.WPARAM; +import com.sun.jna.platform.win32.WinUser; +import com.sun.jna.platform.win32.WinUser.HHOOK; +import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; +import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc; +import com.sun.jna.platform.win32.WinUser.MSG; + +public class KeyBoardHook { + static HHOOK hhk = null; + public static void main(String[] args) { + HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); + User32 lib = User32.INSTANCE; + int result = 0; + LowLevelKeyboardProc rr = new LowLevelKeyboardProc() { + @Override + public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { + System.out.println(info.flags + " " + info.scanCode + " " + info.vkCode + " " + nCode + " " + wParam.intValue() + " " + wParam.doubleValue() ); + try { + if (nCode >= 0) { + switch (wParam.intValue()) { + case WinUser.WM_KEYUP: + System.out.println(info.vkCode +"����" ); + break; + case WinUser.WM_KEYDOWN: + System.out.println(info.vkCode +"����"); + break; + case WinUser.WM_SYSKEYUP: + System.out.println(info.vkCode +"����----"); + break; + case WinUser.WM_SYSKEYDOWN: + System.out.println(info.vkCode +"����----"); + break; + } + + } + } catch (Exception e) { + + } + + Pointer ptr = info.getPointer(); + + long peer = Pointer.nativeValue(ptr); + + return lib.CallNextHookEx(hhk, nCode, wParam, new LPARAM(peer)); + } + }; + hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, rr, hMod, 0); + MSG msg = new MSG(); + while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { + if (result == -1) { + System.err.println("error in get message"); + break; + } else { + System.err.println("got message"); + lib.TranslateMessage(msg); + lib.DispatchMessage(msg); + } + } + } +} diff --git a/RemoteControl-Client/RemoteControl-Client.iml b/RemoteControl-Client/RemoteControl-Client.iml new file mode 100644 index 0000000..726407b --- /dev/null +++ b/RemoteControl-Client/RemoteControl-Client.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RemoteControl-Client/pom.xml b/RemoteControl-Client/pom.xml new file mode 100644 index 0000000..c7e5a83 --- /dev/null +++ b/RemoteControl-Client/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + groupId + RemoteControl-Client + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + net.java.dev.jna + jna + 4.1.0 + + + + net.java.dev.jna + jna-platform + 4.1.0 + + + + org.xerial.snappy + snappy-java + 1.1.4 + + + + + \ No newline at end of file diff --git a/RemoteControlClient/bin/exit.png b/RemoteControl-Client/res/exit.png similarity index 100% rename from RemoteControlClient/bin/exit.png rename to RemoteControl-Client/res/exit.png diff --git a/RemoteControlClient/bin/minimize.png b/RemoteControl-Client/res/minimize.png similarity index 100% rename from RemoteControlClient/bin/minimize.png rename to RemoteControl-Client/res/minimize.png diff --git a/RemoteControlClient/src/DebugMessage.java b/RemoteControl-Client/src/main/java/DebugMessage.java similarity index 95% rename from RemoteControlClient/src/DebugMessage.java rename to RemoteControl-Client/src/main/java/DebugMessage.java index 8f013ce..e7a7cde 100644 --- a/RemoteControlClient/src/DebugMessage.java +++ b/RemoteControl-Client/src/main/java/DebugMessage.java @@ -1,11 +1,11 @@ - -public class DebugMessage { - public static void printDebugMessage(String message) { - System.out.println(message); - } - - public static void printDebugMessage(Exception e) { - e.getStackTrace(); - System.out.println(e.getMessage()); - } -} + +public class DebugMessage { + public static void printDebugMessage(String message) { + System.out.println(message); + } + + public static void printDebugMessage(Exception e) { + e.getStackTrace(); + System.out.println(e.getMessage()); + } +} diff --git a/RemoteControlClient/src/NetworkScreenClient.java b/RemoteControl-Client/src/main/java/NetworkScreenClient.java similarity index 84% rename from RemoteControlClient/src/NetworkScreenClient.java rename to RemoteControl-Client/src/main/java/NetworkScreenClient.java index 71ab59c..40d6d9f 100644 --- a/RemoteControlClient/src/NetworkScreenClient.java +++ b/RemoteControl-Client/src/main/java/NetworkScreenClient.java @@ -1,220 +1,202 @@ -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.URL; - -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuBar; -import javax.swing.JPanel; -import javax.swing.JTextField; - -public class NetworkScreenClient extends JFrame { - private static final long serialVersionUID = 1L; - private ControlPanel controlPanel = new ControlPanel(); - private String myFont = ""; - private URL exitURL = getClass().getClassLoader().getResource("exit.png"); - private ImageIcon exitIcon = new ImageIcon(exitURL); - private URL minimizeURL = getClass().getClassLoader().getResource("minimize.png"); - private ImageIcon minimizeIcon = new ImageIcon(minimizeURL); - private JMenuBar jbar; - private final int FRAME_WIDTH = 500; - private final int FRAME_HEIGHT = 110; - private Socket socket = new Socket(); - private Socket cursorsocket = new Socket(); - private Socket keyboardsocket = new Socket(); - private JFrame jFrame = this; - private final static int SERVER_PORT = 9999; - private final static int SERVER_CURSOR_PORT = SERVER_PORT-1; - private final static int SERVER_KEYBOARD_PORT = SERVER_PORT-2; - ScreenPanel screenPanel; - public NetworkScreenClient() { - setTitle("-"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setLayout(null); - // createJMenu(); - setContentPane(controlPanel); - setSize(FRAME_WIDTH, FRAME_HEIGHT); - //setUndecorated(true); - setVisible(true); - addMouseMotionListener(new MouseAdapter() { - @Override - public void mouseDragged(MouseEvent e) { - setLocation(e.getXOnScreen(), e.getYOnScreen()); - } - }); - setLocation(400, 400); - - } - public void createJMenu(){ - jbar = new JMenuBar(); - jbar.setPreferredSize(new Dimension(FRAME_WIDTH, 40)); - //jbar.setBackground(Color.yellow); - jbar.setBorderPainted(false); - jbar.setLayout(null); - - JLabel exitlabel = new JLabel(exitIcon); - - JLabel minilabel = new JLabel(minimizeIcon); - jbar.add(exitlabel); - jbar.add(minilabel); - exitlabel.setBounds(FRAME_WIDTH-50, 10, 35, 35); - minilabel.setBounds(FRAME_WIDTH-95, 10, 35, 35); - - exitlabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if(e.getButton()==1){ - System.exit(1); - } - } - }); - minilabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if(e.getButton()==1){ - jFrame.setState(JFrame.ICONIFIED); - } - } - }); - setJMenuBar(jbar); - } - class ControlPanel extends JPanel{ - - private static final long serialVersionUID = 1L; - private JTextField addressField = new JTextField(10); - private JButton connectBtn = new JButton("Connect"); - private JButton exitBtn = new JButton("Exit"); - public ControlPanel() { - setLayout(null); - - addressField.setBounds(0, 0, 200, FRAME_HEIGHT-50); - connectBtn.setBounds(200, 0, 150, FRAME_HEIGHT-50); - exitBtn.setBounds(350, 0, 150, FRAME_HEIGHT-50); - - addressField.setFont(new Font(myFont, Font.PLAIN, 20)); - connectBtn.setFont(new Font(myFont, Font.PLAIN, 20)); - exitBtn.setFont(new Font(myFont, Font.PLAIN, 20)); - addressField.setForeground(Color.LIGHT_GRAY); - - addressField.setText("123.123.123.123"); - addressField.setCaretPosition(0); - addressField.setMargin(new Insets(1, 15, 1, 15)); - addressField.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent arg0) { - if(addressField.getText().equals("123.123.123.123") && addressField.getForeground() == Color.LIGHT_GRAY){ - addressField.setText(""); - addressField.setForeground(Color.BLACK); - } - else if(addressField.getText().equals("Connect Fail")){ - addressField.setText(""); - addressField.setForeground(Color.BLACK); - } - } - }); - addressField.addKeyListener(new KeyAdapter() { - @Override - public void keyReleased(KeyEvent e) { - if(addressField.getText().equals("")){ - addressField.setForeground(Color.LIGHT_GRAY); - addressField.setText("123.123.123.123"); - addressField.setCaretPosition(0); - } - } - - @Override - public void keyPressed(KeyEvent e) { - if(e.getKeyCode() == KeyEvent.VK_ENTER){ - connectBtn.doClick(); - } - if(addressField.getText().equals("123.123.123.123") && addressField.getForeground() == Color.LIGHT_GRAY){ - addressField.setText(""); - addressField.setForeground(Color.BLACK); - } - - } - }); - - add(addressField); - add(connectBtn); - add(exitBtn); - exitBtn.setEnabled(false); - connectBtn.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - /*GraphicsDevice device = GraphicsEnvironment - .getLocalGraphicsEnvironment().getScreenDevices()[0]; - device.setFullScreenWindow(jFrame);*/ - - InetSocketAddress inetAddress; - InetSocketAddress inetCursorAddress; - InetSocketAddress inetKeyboardAddress; - if(addressField.getText().equals("123.123.123.123") && addressField.getForeground() == Color.LIGHT_GRAY){ - inetAddress = new InetSocketAddress("localhost", SERVER_PORT); - inetCursorAddress = new InetSocketAddress("localhost", SERVER_CURSOR_PORT); - inetKeyboardAddress = new InetSocketAddress("localhost", SERVER_KEYBOARD_PORT); - } - else{ - inetAddress = new InetSocketAddress(addressField.getText(), SERVER_PORT); - inetCursorAddress = new InetSocketAddress(addressField.getText(), SERVER_CURSOR_PORT); - inetKeyboardAddress = new InetSocketAddress(addressField.getText(), SERVER_KEYBOARD_PORT); - } - try { - socket.connect(inetAddress, 1000); - cursorsocket.connect(inetCursorAddress, 1000); - keyboardsocket.connect(inetKeyboardAddress,1000); - } catch (IOException e1) { - DebugMessage.printDebugMessage(e1); - addressField.setText("Connect Fail"); - socket = new Socket(); - cursorsocket = new Socket(); - keyboardsocket = new Socket(); - } - if(socket.isConnected()){ - addressField.setText("Connect Sucess!"); - System.out.println(""); - try { - Thread.sleep(500); - screenPanel = new ScreenPanel(jFrame, socket,cursorsocket,keyboardsocket); - setJMenuBar(null); - - jFrame.setContentPane(screenPanel); - screenPanel.requestFocus(); - //setExtendedState(JFrame.MAXIMIZED_BOTH); - jFrame.revalidate(); - screenPanel.requestFocus(); - - - } catch (InterruptedException e1) { - DebugMessage.printDebugMessage(e1); - } - } - - } - }); - exitBtn.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - System.exit(1); - } - }); - } - } - public static void main(String[] args) { - new NetworkScreenClient(); - } -} +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.URL; + +public class NetworkScreenClient extends JFrame { + private ControlPanel controlPanel = new ControlPanel(); + private String myFont = "맑은고딕"; + private URL exitURL = getClass().getClassLoader().getResource("exit.png"); + private ImageIcon exitIcon = new ImageIcon(exitURL); + private URL minimizeURL = getClass().getClassLoader().getResource("minimize.png"); + private ImageIcon minimizeIcon = new ImageIcon(minimizeURL); + private JMenuBar jbar; + private final int FRAME_WIDTH = 500; + private final int FRAME_HEIGHT = 110; + private Socket socket = new Socket(); + private Socket cursorsocket = new Socket(); + private Socket keyboardsocket = new Socket(); + private JFrame jFrame = this; + private final static int SERVER_PORT = 9999; + private final static int SERVER_CURSOR_PORT = SERVER_PORT-1; + private final static int SERVER_KEYBOARD_PORT = SERVER_PORT-2; + ScreenPanel screenPanel; + public NetworkScreenClient() { + setTitle("원격지원-지원지"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setLayout(null); + // createJMenu(); + setContentPane(controlPanel); + setSize(FRAME_WIDTH, FRAME_HEIGHT); + //setUndecorated(true); + setVisible(true); + addMouseMotionListener(new MouseAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + setLocation(e.getXOnScreen(), e.getYOnScreen()); + } + }); + setLocation(400, 400); + + } + public void createJMenu(){ + jbar = new JMenuBar(); + jbar.setPreferredSize(new Dimension(FRAME_WIDTH, 40)); + //jbar.setBackground(Color.yellow); + jbar.setBorderPainted(false); + jbar.setLayout(null); + + JLabel exitlabel = new JLabel(exitIcon); + + JLabel minilabel = new JLabel(minimizeIcon); + jbar.add(exitlabel); + jbar.add(minilabel); + exitlabel.setBounds(FRAME_WIDTH-50, 10, 35, 35); + minilabel.setBounds(FRAME_WIDTH-95, 10, 35, 35); + + exitlabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if(e.getButton()==1){ + System.exit(1); + } + } + }); + minilabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if(e.getButton()==1){ + jFrame.setState(JFrame.ICONIFIED); + } + } + }); + setJMenuBar(jbar); + } + class ControlPanel extends JPanel{ + JTextField addressField = new JTextField(10); + JButton connectBtn = new JButton("Connect"); + JButton exitBtn = new JButton("Exit"); + public ControlPanel() { + setLayout(null); + + addressField.setBounds(0, 0, 200, FRAME_HEIGHT-50); + connectBtn.setBounds(200, 0, 150, FRAME_HEIGHT-50); + exitBtn.setBounds(350, 0, 150, FRAME_HEIGHT-50); + + addressField.setFont(new Font(myFont, Font.PLAIN, 20)); + connectBtn.setFont(new Font(myFont, Font.PLAIN, 20)); + exitBtn.setFont(new Font(myFont, Font.PLAIN, 20)); + addressField.setForeground(Color.LIGHT_GRAY); + + addressField.setText("123.123.123.123"); + addressField.setCaretPosition(0); + addressField.setMargin(new Insets(1, 15, 1, 15)); + addressField.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent arg0) { + if(addressField.getText().equals("123.123.123.123") && addressField.getForeground() == Color.LIGHT_GRAY){ + addressField.setText(""); + addressField.setForeground(Color.BLACK); + } + else if(addressField.getText().equals("Connect Fail")){ + addressField.setText(""); + addressField.setForeground(Color.BLACK); + } + } + }); + addressField.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + if(addressField.getText().equals("")){ + addressField.setForeground(Color.LIGHT_GRAY); + addressField.setText("123.123.123.123"); + addressField.setCaretPosition(0); + } + } + + @Override + public void keyPressed(KeyEvent e) { + if(e.getKeyCode() == KeyEvent.VK_ENTER){ + connectBtn.doClick(); + } + if(addressField.getText().equals("123.123.123.123") && addressField.getForeground() == Color.LIGHT_GRAY){ + addressField.setText(""); + addressField.setForeground(Color.BLACK); + } + + } + }); + + add(addressField); + add(connectBtn); + add(exitBtn); + exitBtn.setEnabled(false); + connectBtn.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + /*GraphicsDevice device = GraphicsEnvironment + .getLocalGraphicsEnvironment().getScreenDevices()[0]; + device.setFullScreenWindow(jFrame);*/ + + InetSocketAddress inetAddress; + InetSocketAddress inetCursorAddress; + InetSocketAddress inetKeyboardAddress; + if(addressField.getText().equals("123.123.123.123") && addressField.getForeground() == Color.LIGHT_GRAY){ + inetAddress = new InetSocketAddress("localhost", SERVER_PORT); + inetCursorAddress = new InetSocketAddress("localhost", SERVER_CURSOR_PORT); + inetKeyboardAddress = new InetSocketAddress("localhost", SERVER_KEYBOARD_PORT); + } + else{ + inetAddress = new InetSocketAddress(addressField.getText(), SERVER_PORT); + inetCursorAddress = new InetSocketAddress(addressField.getText(), SERVER_CURSOR_PORT); + inetKeyboardAddress = new InetSocketAddress(addressField.getText(), SERVER_KEYBOARD_PORT); + } + try { + socket.connect(inetAddress, 1000); + cursorsocket.connect(inetCursorAddress, 1000); + keyboardsocket.connect(inetKeyboardAddress,1000); + } catch (IOException e1) { + DebugMessage.printDebugMessage(e1); + addressField.setText("Connect Fail"); + socket = new Socket(); + cursorsocket = new Socket(); + keyboardsocket = new Socket(); + } + if(socket.isConnected()){ + addressField.setText("Connect Sucess!"); + System.out.println("연결됨"); + try { + Thread.sleep(500); + screenPanel = new ScreenPanel(jFrame, socket,cursorsocket,keyboardsocket); + setJMenuBar(null); + + jFrame.setContentPane(screenPanel); + screenPanel.requestFocus(); + //setExtendedState(JFrame.MAXIMIZED_BOTH); + jFrame.revalidate(); + screenPanel.requestFocus(); + + + } catch (InterruptedException e1) { + DebugMessage.printDebugMessage(e1); + } + } + + } + }); + exitBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + System.exit(1); + } + }); + } + } + public static void main(String[] args) { + new NetworkScreenClient(); + } +} diff --git a/RemoteControlClient/src/ScreenPanel.java b/RemoteControl-Client/src/main/java/ScreenPanel.java similarity index 89% rename from RemoteControlClient/src/ScreenPanel.java rename to RemoteControl-Client/src/main/java/ScreenPanel.java index 23c0ed3..7a976fb 100644 --- a/RemoteControlClient/src/ScreenPanel.java +++ b/RemoteControl-Client/src/main/java/ScreenPanel.java @@ -1,407 +1,407 @@ - -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Point; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionListener; -import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferByte; -import java.awt.image.Raster; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; -import java.util.Vector; - -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import org.xerial.snappy.Snappy; - -import com.sun.jna.Library; -import com.sun.jna.Native; -import com.sun.jna.Pointer; -import com.sun.jna.platform.win32.Kernel32; -import com.sun.jna.platform.win32.User32; -import com.sun.jna.platform.win32.WinDef.HMODULE; -import com.sun.jna.platform.win32.WinDef.LPARAM; -import com.sun.jna.platform.win32.WinDef.LRESULT; -import com.sun.jna.platform.win32.WinDef.WPARAM; -import com.sun.jna.platform.win32.WinUser; -import com.sun.jna.platform.win32.WinUser.HHOOK; -import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; -import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc; -import com.sun.jna.platform.win32.WinUser.MSG; - -class ScreenPanel extends JPanel implements Runnable { - private static final long serialVersionUID = 1L; - - private BufferedImage screenImage; - private JLabel FPSlabel; - private int FPScount = 0; - private BufferedImage image; - private DataOutputStream mouseOutputStream; - private DataOutputStream keyboardOutputStream; - private DataInputStream dataInputStream; - private int image_Width = 1280; - private int image_Height = 720; - private byte imageByte2[] = new byte[6220800]; - private int mouseX = 0, mouseY = 0; - private int mouseButton = 0; - private int screen_Width = 1920; - private int screen_Height = 1080; - private Boolean isCompress = true; - private final int MOUSE_MOVE = 1; - private final int MOUSE_PRESSD = 2; - private final int MOUSE_RELEASED = 3; - private final int MOUSE_DOWN_WHEEL = 4; - private final int MOUSE_UP_WHEEL = 5; - private final int KEY_PRESSED = 6; - private final int KEY_RELEASED = 7; - private Vector imgVec = new Vector<>(); - ScreenPanel ppp = this; - User32 lib = User32.INSTANCE; - User32jna u32 = User32jna.INSTANCE; - HHOOK hhk = null; - HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); - Thread thread; - Object lock = new Object(); - public interface User32jna extends Library { - User32jna INSTANCE = (User32jna) Native.loadLibrary("user32.dll", User32jna.class); - - // User32jna INSTANCE = (User32jna) - // Native.loadLibrary("user32.dll",User32jna.class); - public void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); - } - - public ScreenPanel(JFrame frame, Socket socket, Socket cursorSocket, Socket keyboardSocket) { - setLayout(null); - FPSlabel = new JLabel("FPS : " + Integer.toString(FPScount)); - FPSlabel.setFont(new Font("", Font.BOLD, 20)); - FPSlabel.setBounds(10, 10, 100, 50); - add(FPSlabel); - System.out.println(socket.getInetAddress()); - try { - setLayout(null); - socket.setTcpNoDelay(true); - /* - * socket.setSendBufferSize(1024 * 1024 * 10); - * socket.setReceiveBufferSize(1024 * 1024 * 10); - */ - mouseOutputStream = new DataOutputStream(cursorSocket.getOutputStream()); - keyboardOutputStream = new DataOutputStream(keyboardSocket.getOutputStream()); - dataInputStream = new DataInputStream(socket.getInputStream()); - } catch (IOException e) { - DebugMessage.printDebugMessage(e); - } - thread = new Thread(this); - thread.start(); - KeyboardThread keyboardThread = new KeyboardThread(); - keyboardThread.start(); - FPSCheckThread fpsCheckThread = new FPSCheckThread(); - fpsCheckThread.start(); - showThread ss = new showThread(); - //showThread ss2 = new showThread(); - ss.start(); - //ss2.start(); - // lib.UnhookWindowsHookEx(hhk); - addMouseWheelListener(new MouseWheelListener() { - - @Override - public void mouseWheelMoved(MouseWheelEvent e) { - try { - int n = e.getWheelRotation(); - if (n < 0) { - mouseOutputStream.writeInt(MOUSE_DOWN_WHEEL); - } else { - mouseOutputStream.writeInt(MOUSE_UP_WHEEL); - } - - } catch (IOException e1) { - DebugMessage.printDebugMessage(e1); - } - } - }); - addMouseMotionListener(new MouseMotionListener() { - - @Override - public void mouseMoved(MouseEvent e) { - // 800 300 1920 1080 - // x y x y - mouseX = e.getX() * screen_Width / getWidth(); - mouseY = e.getY() * screen_Height / getHeight(); - - try { - mouseOutputStream.writeInt(MOUSE_MOVE); - mouseOutputStream.writeInt(mouseX); - mouseOutputStream.writeInt(mouseY); - } catch (IOException e1) { - DebugMessage.printDebugMessage(e1); - } - } - - @Override - public void mouseDragged(MouseEvent e) { - mouseX = e.getX() * screen_Width / getWidth(); - mouseY = e.getY() * screen_Height / getHeight(); - try { - mouseOutputStream.writeInt(MOUSE_MOVE); - mouseOutputStream.writeInt(mouseX); - mouseOutputStream.writeInt(mouseY); - } catch (IOException e1) { - DebugMessage.printDebugMessage(e1); - } - - } - }); - addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - mouseButton = e.getButton(); - try { - mouseOutputStream.writeInt(MOUSE_PRESSD); - mouseOutputStream.writeInt(mouseButton); - } catch (IOException e1) { - DebugMessage.printDebugMessage(e1); - } - } - - @Override - public void mouseReleased(MouseEvent e) { - mouseButton = e.getButton(); - try { - mouseOutputStream.writeInt(MOUSE_RELEASED); - mouseOutputStream.writeInt(mouseButton); - } catch (IOException e1) { - DebugMessage.printDebugMessage(e1); - } - } - }); - - /* - * addKeyListener(new KeyAdapter() { - * - * @Override public void keyTyped(KeyEvent e) { - * //System.out.println("type" + e.getKeyCode() + " " + e.getKeyChar() - * + " " + e.getID() + " " + e.getModifiers()+ " "+ - * e.getKeyLocation() + " " + e.getExtendedKeyCode()); - * - * } - * - * @Override public void keyPressed(KeyEvent e) { try { - * //System.out.println("press" + e.getKeyCode() + " " + e.getKeyChar() - * + " " + e.getID() + " " + e.getModifiers()+ " "+ - * e.getKeyLocation() + " " + e.getExtendedKeyCode()); - * if(e.getKeyCode() !=0){ dataOutputStream.writeInt(KEY_PRESSED); - * dataOutputStream.writeInt(e.getKeyCode()); } } catch (IOException e1) - * { DebugMessage.printDebugMessage(e1); } } - * - * @Override public void keyReleased(KeyEvent e) { try { - * //System.out.println("released" + e.getKeyCode() + " " + - * e.getKeyChar() + " " + e.getID() + " " + e.getModifiers()+ " "+ - * e.getKeyLocation() + " " + e.getExtendedKeyCode()); - * if(e.getKeyCode() ==0){ if(count >= 1){ count = 0; return; } - * //System.out.println(t.getLocale().toString() + " " + - * t.getLocale().getCountry() + " " + - * t.getLocale().getDisplayCountry()); - * //System.out.println("ѱŰ -"); count = 1; u32.keybd_event((byte) - * 0x15, (byte)0, 0, 0);//ffDDDddSS u32.keybd_event((byte) 0x15, - * (byte)00, (byte)0x0002, 0);// - * dataOutputStream.writeInt(KEY_CHANGE_LANGUAGE); - * - * } else{ dataOutputStream.writeInt(KEY_RELEASED); - * dataOutputStream.writeInt(e.getKeyCode()); } - * - * } catch (Exception e1) { DebugMessage.printDebugMessage(e1); } } }); - */ - - requestFocus(); - } - - public void run() { - try { - screen_Width = dataInputStream.readInt(); - screen_Height = dataInputStream.readInt(); - image_Width = dataInputStream.readInt(); - image_Height = dataInputStream.readInt(); - isCompress = dataInputStream.readBoolean(); - } catch (IOException e1) { - DebugMessage.printDebugMessage(e1); - } - - while (true) { - - try {// 172.30.1.54 - if (dataInputStream.available() > 0) { - int length = 0; - if (isCompress) { - - length = dataInputStream.readInt(); - - byte imageByte[] = new byte[length]; - - dataInputStream.readFully(imageByte, 0, length); - - imgVec.addElement(imageByte); - //System.out.println(imgVec.size()); - - if (imgVec.size() > 1) { - synchronized (lock) { - - lock.wait(); - } - } - - } else { - length = dataInputStream.readInt(); - dataInputStream.readFully(imageByte2, 0, length); - screenImage = new BufferedImage(image_Width, image_Height, BufferedImage.TYPE_3BYTE_BGR); - screenImage.setData(Raster.createRaster(screenImage.getSampleModel(), - new DataBufferByte(imageByte2, imageByte2.length), new Point())); - } - //thread.sleep(20); - } - - } catch (Exception e) { - //DebugMessage.printDebugMessage(e); - } - - } - } - - class showThread extends Thread { - byte imageByte[]; - byte uncompressImageByte[]; - public void run() { - - while (true) { - try { - - imageByte = imgVec.get(0); - //System.out.println(imgVec.size()); - uncompressImageByte = Snappy.uncompress(imageByte); - if (imgVec.size() > 0){ - imgVec.remove(0); - //System.out.println(imgVec.size()); - } - screenImage = new BufferedImage(image_Width, image_Height, BufferedImage.TYPE_3BYTE_BGR); - screenImage.setData(Raster.createRaster(screenImage.getSampleModel(), - new DataBufferByte(uncompressImageByte, uncompressImageByte.length), new Point())); - // System.out.println(imgVec.size() + " " + thread.getState()); - if (imgVec.size() == 1) { - synchronized (lock) { - //System.out.println(thread.getState()); - //System.out.println("notify~~~~~~~~"); - lock.notify(); - } - } - if(screenImage != null){ - image = screenImage; - FPScount++; - repaint(); - } - - } catch (Exception e) { - - } - // decompress(imageByte); - } - } - } - - class FPSCheckThread extends Thread { - public void run() { - while (true) { - try { - sleep(1000); - FPSlabel.setText("FPS : " + Integer.toString(FPScount)); - // repaint(); - // System.out.println("FPS : " + FPScount); - FPScount = 0; - } catch (InterruptedException e) { - } - } - } - } - - class KeyboardThread extends Thread { - int result; - int keypress = 0; - - public void run() { - LowLevelKeyboardProc rr = new LowLevelKeyboardProc() { - - @Override - public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { - try { - System.out.println(info.vkCode); - if (info.vkCode == 21) { - System.out.println("ѿ"); - if (keypress == 0) { - u32.keybd_event((byte) 0x15, (byte) 0, 0, 0);// ffDDDddSS - u32.keybd_event((byte) 0x15, (byte) 00, (byte) 0x0002, 0);// - keypress++; - } else { - keypress = 0; - } - - } - if (nCode >= 0) { - - switch (wParam.intValue()) { - case WinUser.WM_KEYUP: - keyboardOutputStream.writeInt(KEY_RELEASED); - keyboardOutputStream.writeInt(info.vkCode); - break; - case WinUser.WM_KEYDOWN: - keyboardOutputStream.writeInt(KEY_PRESSED); - keyboardOutputStream.writeInt(info.vkCode); - break; - case WinUser.WM_SYSKEYUP: - keyboardOutputStream.writeInt(KEY_RELEASED); - keyboardOutputStream.writeInt(info.vkCode); - break; - case WinUser.WM_SYSKEYDOWN: - keyboardOutputStream.writeInt(KEY_PRESSED); - keyboardOutputStream.writeInt(info.vkCode); - break; - } - - } - } catch (Exception e) { - DebugMessage.printDebugMessage(e); - } - - Pointer ptr = info.getPointer(); - - long peer = Pointer.nativeValue(ptr); - - return lib.CallNextHookEx(hhk, nCode, wParam, new LPARAM(peer)); - } - }; - hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, rr, hMod, 0); - MSG msg = new MSG(); - while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { - if (result == -1) { - System.err.println("error in get message"); - break; - } else { - System.err.println("got message"); - lib.TranslateMessage(msg); - lib.DispatchMessage(msg); - } - } - } - } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, getWidth(), getHeight(), this); - } -} +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.sun.jna.platform.win32.Kernel32; +import com.sun.jna.platform.win32.User32; +import com.sun.jna.platform.win32.WinDef.HMODULE; +import com.sun.jna.platform.win32.WinDef.LPARAM; +import com.sun.jna.platform.win32.WinDef.LRESULT; +import com.sun.jna.platform.win32.WinDef.WPARAM; +import com.sun.jna.platform.win32.WinUser; +import com.sun.jna.platform.win32.WinUser.HHOOK; +import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; +import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc; +import com.sun.jna.platform.win32.WinUser.MSG; +import org.xerial.snappy.Snappy; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.awt.image.Raster; +import java.io.*; +import java.net.Socket; +import java.util.Vector; + +class ScreenPanel extends JPanel implements Runnable { + private Socket socket; + private Socket cursorSocket; + private Socket keyboardSocket; + private BufferedImage screenImage; + private JFrame frame; + private JLabel FPSlabel; + private int FPScount = 0; + private BufferedImage image; + private DataOutputStream mouseOutputStream; + private DataOutputStream keyboardOutputStream; + private DataInputStream dataInputStream; + private ObjectInputStream objectInputStream; + private BufferedWriter bufferedWriter; + private int image_Width = 1280; + private int image_Height = 720; + private byte imageByte2[] = new byte[6220800]; + private int mouseX = 0, mouseY = 0; + private int mouseClickCount = 0; + private int mouseButton = 0; + private int mousePosition = 0; // 1 == move 2 == click + private int screen_Width = 1920; + private int screen_Height = 1080; + private Boolean isCompress = true; + private final int MOUSE_MOVE = 1; + private final int MOUSE_PRESSD = 2; + private final int MOUSE_RELEASED = 3; + private final int MOUSE_DOWN_WHEEL = 4; + private final int MOUSE_UP_WHEEL = 5; + private final int KEY_PRESSED = 6; + private final int KEY_RELEASED = 7; + private final int KEY_CHANGE_LANGUAGE = 8; + private int count = 0; + private Vector imgVec = new Vector<>(); + ScreenPanel ppp = this; + User32 lib = User32.INSTANCE; + User32jna u32 = User32jna.INSTANCE; + HHOOK hhk = null; + HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); + Thread thread; + Object lock = new Object(); + public interface User32jna extends Library { + User32jna INSTANCE = (User32jna) Native.loadLibrary("user32.dll", User32jna.class); + + // User32jna INSTANCE = (User32jna) + // Native.loadLibrary("user32.dll",User32jna.class); + public void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); + } + + public ScreenPanel(JFrame frame, Socket socket, Socket cursorSocket, Socket keyboardSocket) { + setLayout(null); + this.socket = socket; + this.cursorSocket = cursorSocket; + this.keyboardSocket = keyboardSocket; + this.frame = frame; + FPSlabel = new JLabel("FPS : " + Integer.toString(FPScount)); + FPSlabel.setFont(new Font("맑은고딕", Font.BOLD, 20)); + FPSlabel.setBounds(10, 10, 100, 50); + add(FPSlabel); + System.out.println(socket.getInetAddress()); + try { + setLayout(null); + socket.setTcpNoDelay(true); + /* + * socket.setSendBufferSize(1024 * 1024 * 10); + * socket.setReceiveBufferSize(1024 * 1024 * 10); + */ + mouseOutputStream = new DataOutputStream(cursorSocket.getOutputStream()); + keyboardOutputStream = new DataOutputStream(keyboardSocket.getOutputStream()); + dataInputStream = new DataInputStream(socket.getInputStream()); + objectInputStream = new ObjectInputStream(socket.getInputStream()); + } catch (IOException e) { + DebugMessage.printDebugMessage(e); + } + thread = new Thread(this); + thread.start(); + KeyboardThread keyboardThread = new KeyboardThread(); + keyboardThread.start(); + FPSCheckThread fpsCheckThread = new FPSCheckThread(); + fpsCheckThread.start(); + showThread ss = new showThread(); + //showThread ss2 = new showThread(); + ss.start(); + //ss2.start(); + // lib.UnhookWindowsHookEx(hhk); + addMouseWheelListener(new MouseWheelListener() { + + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + try { + int n = e.getWheelRotation(); + if (n < 0) { + mouseOutputStream.writeInt(MOUSE_DOWN_WHEEL); + } else { + mouseOutputStream.writeInt(MOUSE_UP_WHEEL); + } + + } catch (IOException e1) { + DebugMessage.printDebugMessage(e1); + } + } + }); + addMouseMotionListener(new MouseMotionListener() { + + @Override + public void mouseMoved(MouseEvent e) { + // 800 300 1920 1080 + // x y x y + mouseX = e.getX() * screen_Width / getWidth(); + mouseY = e.getY() * screen_Height / getHeight(); + + try { + mouseOutputStream.writeInt(MOUSE_MOVE); + mouseOutputStream.writeInt(mouseX); + mouseOutputStream.writeInt(mouseY); + } catch (IOException e1) { + DebugMessage.printDebugMessage(e1); + } + } + + @Override + public void mouseDragged(MouseEvent e) { + mouseX = e.getX() * screen_Width / getWidth(); + mouseY = e.getY() * screen_Height / getHeight(); + try { + mouseOutputStream.writeInt(MOUSE_MOVE); + mouseOutputStream.writeInt(mouseX); + mouseOutputStream.writeInt(mouseY); + } catch (IOException e1) { + DebugMessage.printDebugMessage(e1); + } + + } + }); + addMouseListener(new MouseAdapter() { + + @Override + public void mousePressed(MouseEvent e) { + mouseButton = e.getButton(); + try { + mouseOutputStream.writeInt(MOUSE_PRESSD); + mouseOutputStream.writeInt(mouseButton); + } catch (IOException e1) { + DebugMessage.printDebugMessage(e1); + } + } + + @Override + public void mouseReleased(MouseEvent e) { + mouseButton = e.getButton(); + try { + mouseOutputStream.writeInt(MOUSE_RELEASED); + mouseOutputStream.writeInt(mouseButton); + } catch (IOException e1) { + DebugMessage.printDebugMessage(e1); + } + } + }); + + /* + * addKeyListener(new KeyAdapter() { + * + * @Override public void keyTyped(KeyEvent e) { + * //System.out.println("type" + e.getKeyCode() + " " + e.getKeyChar() + * + " " + e.getID() + " " + e.getModifiers()+ " "+ + * e.getKeyLocation() + " " + e.getExtendedKeyCode()); + * + * } + * + * @Override public void keyPressed(KeyEvent e) { try { + * //System.out.println("press" + e.getKeyCode() + " " + e.getKeyChar() + * + " " + e.getID() + " " + e.getModifiers()+ " "+ + * e.getKeyLocation() + " " + e.getExtendedKeyCode()); + * if(e.getKeyCode() !=0){ dataOutputStream.writeInt(KEY_PRESSED); + * dataOutputStream.writeInt(e.getKeyCode()); } } catch (IOException e1) + * { DebugMessage.printDebugMessage(e1); } } + * + * @Override public void keyReleased(KeyEvent e) { try { + * //System.out.println("released" + e.getKeyCode() + " " + + * e.getKeyChar() + " " + e.getID() + " " + e.getModifiers()+ " "+ + * e.getKeyLocation() + " " + e.getExtendedKeyCode()); + * if(e.getKeyCode() ==0){ if(count >= 1){ count = 0; return; } + * //System.out.println(t.getLocale().toString() + " " + + * t.getLocale().getCountry() + " " + + * t.getLocale().getDisplayCountry()); + * //System.out.println("한글키 눌림-보냄"); count = 1; u32.keybd_event((byte) + * 0x15, (byte)0, 0, 0);//누름ffDDDddSS u32.keybd_event((byte) 0x15, + * (byte)00, (byte)0x0002, 0);// 누름 해제 + * dataOutputStream.writeInt(KEY_CHANGE_LANGUAGE); + * + * } else{ dataOutputStream.writeInt(KEY_RELEASED); + * dataOutputStream.writeInt(e.getKeyCode()); } + * + * } catch (Exception e1) { DebugMessage.printDebugMessage(e1); } } }); + */ + + requestFocus(); + } + + public void run() { + try { + screen_Width = dataInputStream.readInt(); + screen_Height = dataInputStream.readInt(); + image_Width = dataInputStream.readInt(); + image_Height = dataInputStream.readInt(); + isCompress = dataInputStream.readBoolean(); + } catch (IOException e1) { + DebugMessage.printDebugMessage(e1); + } + + while (true) { + + try {// 172.30.1.54 + if (dataInputStream.available() > 0) { + int length = 0; + if (isCompress) { + + length = dataInputStream.readInt(); + + byte imageByte[] = new byte[length]; + + dataInputStream.readFully(imageByte, 0, length); + + imgVec.addElement(imageByte); + //System.out.println(imgVec.size()); + + if (imgVec.size() > 1) { + synchronized (lock) { + + lock.wait(); + } + } + + } else { + length = dataInputStream.readInt(); + dataInputStream.readFully(imageByte2, 0, length); + screenImage = new BufferedImage(image_Width, image_Height, BufferedImage.TYPE_3BYTE_BGR); + screenImage.setData(Raster.createRaster(screenImage.getSampleModel(), + new DataBufferByte(imageByte2, imageByte2.length), new Point())); + } + //thread.sleep(20); + } + + } catch (Exception e) { + //DebugMessage.printDebugMessage(e); + } + + } + } + + class showThread extends Thread { + byte imageByte[]; + byte uncompressImageByte[]; + public void run() { + + while (true) { + try { + + imageByte = imgVec.get(0); + //System.out.println(imgVec.size()); + uncompressImageByte = Snappy.uncompress(imageByte); + if (imgVec.size() > 0){ + imgVec.remove(0); + //System.out.println(imgVec.size()); + } + screenImage = new BufferedImage(image_Width, image_Height, BufferedImage.TYPE_3BYTE_BGR); + screenImage.setData(Raster.createRaster(screenImage.getSampleModel(), + new DataBufferByte(uncompressImageByte, uncompressImageByte.length), new Point())); + // System.out.println(imgVec.size() + " " + thread.getState()); + if (imgVec.size() == 1) { + synchronized (lock) { + //System.out.println(thread.getState()); + //System.out.println("notify~~~~~~~~"); + lock.notify(); + } + } + if(screenImage != null){ + image = screenImage; + FPScount++; + repaint(); + } + + } catch (Exception e) { + + } + // decompress(imageByte); + } + } + } + + class FPSCheckThread extends Thread { + public void run() { + while (true) { + try { + sleep(1000); + FPSlabel.setText("FPS : " + Integer.toString(FPScount)); + // repaint(); + // System.out.println("FPS : " + FPScount); + FPScount = 0; + } catch (InterruptedException e) { + } + } + } + } + + class KeyboardThread extends Thread { + int result; + int keypress = 0; + + public void run() { + LowLevelKeyboardProc rr = new LowLevelKeyboardProc() { + + @Override + public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { + try { + System.out.println(info.vkCode); + if (info.vkCode == 21) { + System.out.println("한영"); + if (keypress == 0) { + u32.keybd_event((byte) 0x15, (byte) 0, 0, 0);// 누름ffDDDddSS + u32.keybd_event((byte) 0x15, (byte) 00, (byte) 0x0002, 0);// 땜 + keypress++; + } else { + keypress = 0; + } + + } + if (nCode >= 0) { + + switch (wParam.intValue()) { + case WinUser.WM_KEYUP: + keyboardOutputStream.writeInt(KEY_RELEASED); + keyboardOutputStream.writeInt(info.vkCode); + break; + case WinUser.WM_KEYDOWN: + keyboardOutputStream.writeInt(KEY_PRESSED); + keyboardOutputStream.writeInt(info.vkCode); + break; + case WinUser.WM_SYSKEYUP: + keyboardOutputStream.writeInt(KEY_RELEASED); + keyboardOutputStream.writeInt(info.vkCode); + break; + case WinUser.WM_SYSKEYDOWN: + keyboardOutputStream.writeInt(KEY_PRESSED); + keyboardOutputStream.writeInt(info.vkCode); + break; + } + + } + } catch (Exception e) { + DebugMessage.printDebugMessage(e); + } + + Pointer ptr = info.getPointer(); + + long peer = Pointer.nativeValue(ptr); + + return lib.CallNextHookEx(hhk, nCode, wParam, new LPARAM(peer)); + } + }; + hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, rr, hMod, 0); + MSG msg = new MSG(); + while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { + if (result == -1) { + System.err.println("error in get message"); + break; + } else { + System.err.println("got message"); + lib.TranslateMessage(msg); + lib.DispatchMessage(msg); + } + } + } + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, getWidth(), getHeight(), this); + } +} diff --git a/RemoteControl-Server/RemoteControl-Server.iml b/RemoteControl-Server/RemoteControl-Server.iml new file mode 100644 index 0000000..787555e --- /dev/null +++ b/RemoteControl-Server/RemoteControl-Server.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RemoteControl-Server/pom.xml b/RemoteControl-Server/pom.xml new file mode 100644 index 0000000..11b581f --- /dev/null +++ b/RemoteControl-Server/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + groupId + RemoteControl-Server + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + net.java.dev.jna + jna + 4.1.0 + + + + net.java.dev.jna + jna-platform + 4.1.0 + + + + org.xerial.snappy + snappy-java + 1.1.4 + + + + + \ No newline at end of file diff --git a/RemoteControlServer/src/DebugMessage.java b/RemoteControl-Server/src/main/java/DebugMessage.java similarity index 95% rename from RemoteControlServer/src/DebugMessage.java rename to RemoteControl-Server/src/main/java/DebugMessage.java index 8f013ce..e7a7cde 100644 --- a/RemoteControlServer/src/DebugMessage.java +++ b/RemoteControl-Server/src/main/java/DebugMessage.java @@ -1,11 +1,11 @@ - -public class DebugMessage { - public static void printDebugMessage(String message) { - System.out.println(message); - } - - public static void printDebugMessage(Exception e) { - e.getStackTrace(); - System.out.println(e.getMessage()); - } -} + +public class DebugMessage { + public static void printDebugMessage(String message) { + System.out.println(message); + } + + public static void printDebugMessage(Exception e) { + e.getStackTrace(); + System.out.println(e.getMessage()); + } +} diff --git a/RemoteControlServer/src/JNAScreenShot.java b/RemoteControl-Server/src/main/java/JNAScreenShot.java similarity index 92% rename from RemoteControlServer/src/JNAScreenShot.java rename to RemoteControl-Server/src/main/java/JNAScreenShot.java index 5c0ae58..aa48c16 100644 --- a/RemoteControlServer/src/JNAScreenShot.java +++ b/RemoteControl-Server/src/main/java/JNAScreenShot.java @@ -1,159 +1,152 @@ -import java.awt.Rectangle; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferInt; -import java.awt.image.DataBufferUShort; -import java.awt.image.DirectColorModel; -import java.awt.image.Raster; -import java.awt.image.WritableRaster; - -import com.sun.jna.Native; -import com.sun.jna.platform.win32.WinDef.HBITMAP; -import com.sun.jna.platform.win32.WinDef.HDC; -import com.sun.jna.platform.win32.WinDef.HWND; -import com.sun.jna.platform.win32.WinGDI.BITMAPINFO; -import com.sun.jna.platform.win32.WinGDI.BITMAPINFOHEADER; -import com.sun.jna.platform.win32.WinNT.HANDLE; -import com.sun.jna.win32.W32APIOptions; - -public class JNAScreenShot { - - public static BufferedImage getScreenshot(Rectangle bounds) { - - HDC windowDC = GDI.GetDC(USER.GetDesktopWindow()); - HBITMAP outputBitmap = - GDI.CreateCompatibleBitmap(windowDC, - bounds.width, bounds.height); - try { - HDC blitDC = GDI.CreateCompatibleDC(windowDC); - try { - HANDLE oldBitmap = - GDI.SelectObject(blitDC, outputBitmap); - try { - GDI.BitBlt(blitDC, - 0, 0, bounds.width, bounds.height, - windowDC, - bounds.x, bounds.y, - GDI32.SRCCOPY); - } finally { - GDI.SelectObject(blitDC, oldBitmap); - } - BITMAPINFO bi = new BITMAPINFO(40); - bi.bmiHeader.biSize = 40; - boolean ok = - GDI.GetDIBits(blitDC, outputBitmap, 0, bounds.height, - (byte[]) null, bi, 0); - if (ok) { - BITMAPINFOHEADER bih = bi.bmiHeader; - bih.biHeight = - Math.abs(bih.biHeight); - bi.bmiHeader.biCompression = 0; - return bufferedImageFromBitmap(blitDC, outputBitmap, bi); - } else { - return null; - } - } finally { - GDI.DeleteObject(blitDC); - } - } finally { - GDI.DeleteObject(outputBitmap); - } - } - - private static BufferedImage bufferedImageFromBitmap(HDC blitDC, HBITMAP outputBitmap, BITMAPINFO bi) { - BITMAPINFOHEADER bih = bi.bmiHeader; - int height = Math.abs(bih.biHeight); - final ColorModel cm; - final DataBuffer buffer; - final WritableRaster raster; - int strideBits = - (bih.biWidth * bih.biBitCount); - int strideBytesAligned = - (((strideBits - 1) | 0x1F) + 1) >> 3; - final int strideElementsAligned; - switch (bih.biBitCount) { - case 16: - strideElementsAligned = strideBytesAligned / 2; - cm = new DirectColorModel(16, 0x7C00, 0x3E0, 0x1F); - buffer = - new DataBufferUShort(strideElementsAligned * height); - raster = - Raster.createPackedRaster(buffer, - bih.biWidth, height, - strideElementsAligned, - ((DirectColorModel) cm).getMasks(), - null); - break; - case 32: - strideElementsAligned = strideBytesAligned / 4; - cm = new DirectColorModel(32, 0xFF0000, 0xFF00, 0xFF); - buffer = - new DataBufferInt(strideElementsAligned * height); - raster = - Raster.createPackedRaster(buffer, - bih.biWidth, height, - strideElementsAligned, - ((DirectColorModel) cm).getMasks(), - null); - break; - default: - throw new IllegalArgumentException("Unsupported bit count: " + bih.biBitCount); - } - final boolean ok; - switch (buffer.getDataType()) { - case DataBuffer.TYPE_INT: - { - int[] pixels = ((DataBufferInt) buffer).getData(); - ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); - } - break; - case DataBuffer.TYPE_USHORT: - { - short[] pixels = ((DataBufferUShort) buffer).getData(); - ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); - } - break; - default: - throw new AssertionError("Unexpected buffer element type: " + buffer.getDataType()); - } - if (ok) { - return new BufferedImage(cm, raster, false, null); - } else { - return null; - } - } - - private static final User32 USER = User32.INSTANCE; - - private static final GDI32 GDI = GDI32.INSTANCE; - -} - -interface GDI32 extends com.sun.jna.platform.win32.GDI32 { - GDI32 INSTANCE = - (GDI32) Native.loadLibrary(GDI32.class); - boolean BitBlt(HDC hdcDest, - int nXDest, - int nYDest, - int nWidth, - int nHeight, - HDC hdcSrc, - int nXSrc, - int nYSrc, - int dwRop); - HDC GetDC(HWND hWnd); - boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, - byte[] pixels, BITMAPINFO bi, int usage); - boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, - short[] pixels, BITMAPINFO bi, int usage); - boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, - int[] pixels, BITMAPINFO bi, int usage); - int SRCCOPY = 0xCC0020; -} - -interface User32 extends com.sun.jna.platform.win32.User32 { - User32 INSTANCE = - (User32) Native.loadLibrary(User32.class, - W32APIOptions.UNICODE_OPTIONS); - HWND GetDesktopWindow(); +import com.sun.jna.Native; +import com.sun.jna.platform.win32.WinDef.HBITMAP; +import com.sun.jna.platform.win32.WinDef.HDC; +import com.sun.jna.platform.win32.WinDef.HWND; +import com.sun.jna.platform.win32.WinGDI.BITMAPINFO; +import com.sun.jna.platform.win32.WinGDI.BITMAPINFOHEADER; +import com.sun.jna.platform.win32.WinNT.HANDLE; +import com.sun.jna.win32.W32APIOptions; + +import java.awt.*; +import java.awt.image.*; + +public class JNAScreenShot { + + public static BufferedImage getScreenshot(Rectangle bounds) { + + HDC windowDC = GDI.GetDC(USER.GetDesktopWindow()); + HBITMAP outputBitmap = + GDI.CreateCompatibleBitmap(windowDC, + bounds.width, bounds.height); + try { + HDC blitDC = GDI.CreateCompatibleDC(windowDC); + try { + HANDLE oldBitmap = + GDI.SelectObject(blitDC, outputBitmap); + try { + GDI.BitBlt(blitDC, + 0, 0, bounds.width, bounds.height, + windowDC, + bounds.x, bounds.y, + GDI32.SRCCOPY); + } finally { + GDI.SelectObject(blitDC, oldBitmap); + } + BITMAPINFO bi = new BITMAPINFO(40); + bi.bmiHeader.biSize = 40; + boolean ok = + GDI.GetDIBits(blitDC, outputBitmap, 0, bounds.height, + (byte[]) null, bi, 0); + if (ok) { + BITMAPINFOHEADER bih = bi.bmiHeader; + bih.biHeight = - Math.abs(bih.biHeight); + bi.bmiHeader.biCompression = 0; + return bufferedImageFromBitmap(blitDC, outputBitmap, bi); + } else { + return null; + } + } finally { + GDI.DeleteObject(blitDC); + } + } finally { + GDI.DeleteObject(outputBitmap); + } + } + + private static BufferedImage bufferedImageFromBitmap(HDC blitDC, HBITMAP outputBitmap, BITMAPINFO bi) { + BITMAPINFOHEADER bih = bi.bmiHeader; + int height = Math.abs(bih.biHeight); + final ColorModel cm; + final DataBuffer buffer; + final WritableRaster raster; + int strideBits = + (bih.biWidth * bih.biBitCount); + int strideBytesAligned = + (((strideBits - 1) | 0x1F) + 1) >> 3; + final int strideElementsAligned; + switch (bih.biBitCount) { + case 16: + strideElementsAligned = strideBytesAligned / 2; + cm = new DirectColorModel(16, 0x7C00, 0x3E0, 0x1F); + buffer = + new DataBufferUShort(strideElementsAligned * height); + raster = + Raster.createPackedRaster(buffer, + bih.biWidth, height, + strideElementsAligned, + ((DirectColorModel) cm).getMasks(), + null); + break; + case 32: + strideElementsAligned = strideBytesAligned / 4; + cm = new DirectColorModel(32, 0xFF0000, 0xFF00, 0xFF); + buffer = + new DataBufferInt(strideElementsAligned * height); + raster = + Raster.createPackedRaster(buffer, + bih.biWidth, height, + strideElementsAligned, + ((DirectColorModel) cm).getMasks(), + null); + break; + default: + throw new IllegalArgumentException("Unsupported bit count: " + bih.biBitCount); + } + final boolean ok; + switch (buffer.getDataType()) { + case DataBuffer.TYPE_INT: + { + int[] pixels = ((DataBufferInt) buffer).getData(); + ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); + } + break; + case DataBuffer.TYPE_USHORT: + { + short[] pixels = ((DataBufferUShort) buffer).getData(); + ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); + } + break; + default: + throw new AssertionError("Unexpected buffer element type: " + buffer.getDataType()); + } + if (ok) { + return new BufferedImage(cm, raster, false, null); + } else { + return null; + } + } + + private static final User32 USER = User32.INSTANCE; + + private static final GDI32 GDI = GDI32.INSTANCE; + +} + +interface GDI32 extends com.sun.jna.platform.win32.GDI32 { + GDI32 INSTANCE = + (GDI32) Native.loadLibrary(GDI32.class); + boolean BitBlt(HDC hdcDest, + int nXDest, + int nYDest, + int nWidth, + int nHeight, + HDC hdcSrc, + int nXSrc, + int nYSrc, + int dwRop); + HDC GetDC(HWND hWnd); + boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, + byte[] pixels, BITMAPINFO bi, int usage); + boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, + short[] pixels, BITMAPINFO bi, int usage); + boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, + int[] pixels, BITMAPINFO bi, int usage); + int SRCCOPY = 0xCC0020; +} + +interface User32 extends com.sun.jna.platform.win32.User32 { + User32 INSTANCE = + (User32) Native.loadLibrary(User32.class, + W32APIOptions.UNICODE_OPTIONS); + HWND GetDesktopWindow(); } \ No newline at end of file diff --git a/RemoteControlServer/src/NetworkScreenServer.java b/RemoteControl-Server/src/main/java/NetworkScreenServer.java similarity index 89% rename from RemoteControlServer/src/NetworkScreenServer.java rename to RemoteControl-Server/src/main/java/NetworkScreenServer.java index e933afb..3cd6c34 100644 --- a/RemoteControlServer/src/NetworkScreenServer.java +++ b/RemoteControl-Server/src/main/java/NetworkScreenServer.java @@ -1,509 +1,493 @@ -import java.awt.AWTException; -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferByte; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.URL; -import java.util.Vector; - -import javax.imageio.ImageIO; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JTextField; - -import org.xerial.snappy.Snappy; - -import com.sun.jna.Library; -import com.sun.jna.Native; - - - -public class NetworkScreenServer extends JFrame { - private static final long serialVersionUID = 1L; - private final static int SERVER_PORT = 9999; - private final static int SERVER_CURSOR_PORT = SERVER_PORT - 1; - private final static int SERVER_KEBOARD_PORT = SERVER_PORT - 2; - private DataOutputStream dataOutputStream; - private Image cursor; - private String myFont = ""; - private Rectangle rect; - private MainPanel mainPanel = new MainPanel(); - private ServerSocket imageSeverSocket = null; - private ServerSocket cursorServerSocket = null; - private ServerSocket keyboardServerSocket = null; - private Socket imageSocket = null; - private Socket cursorSocket = null; - private Socket keyboardSocket = null; - private Robot robot; - private int screenWidth, screenHeight; - private Boolean isRunning = false; - private Thread imgThread; - private static int new_Width = 1920; - private static int new_Height = 1080; - private JButton startBtn; - private JButton stopBtn; - private JTextField widthTextfield; - private JTextField heightTextfield; - private JRadioButton compressTrueRBtn; - private JRadioButton compressFalseRBtn; - private JLabel widthLabel; - private JLabel heightLabel; - private JLabel compressLabel; - private URL cursorURL = getClass().getClassLoader().getResource("cursor.gif"); - private Boolean isCompress = true; - private final int MOUSE_MOVE = 1; - private final int MOUSE_PRESSD = 2; - private final int MOUSE_RELEASED = 3; - private final int MOUSE_DOWN_WHEEL = 4; - private final int MOUSE_UP_WHEEL = 5; - private final int KEY_PRESSED = 6; - private final int KEY_RELEASED = 7; - int count = 0, count2 = 0; - private User32jna u32 = User32jna.INSTANCE; - private Vector imgvec = new Vector<>(); - - public NetworkScreenServer() { - setTitle("-"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setLayout(null); - setContentPane(mainPanel); - setSize(490, 160); - setVisible(true); - setResizable(false); - - addKeyListener(new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - System.out.println("type" + e.getKeyCode() + " " + e.getKeyChar() + " " + e.getID() + " " - + e.getModifiers() + " " + e.getKeyLocation() + " " + e.getExtendedKeyCode()); - } - - @Override - public void keyPressed(KeyEvent e) { - System.out.println("pressed" + e.getKeyCode() + " " + e.getKeyChar() + " " + e.getID() + " " - + e.getModifiers() + " " + e.getKeyLocation() + " " + e.getExtendedKeyCode()); - super.keyPressed(e); - } - - @Override - public void keyReleased(KeyEvent e) { - System.out.println("released" + e.getKeyCode() + " " + e.getKeyChar() + " " + e.getID() + " " - + e.getModifiers() + " " + e.getKeyLocation() + " " + e.getExtendedKeyCode()); - if (e.getKeyCode() == 0) { - if (count >= 1) { - count = 0; - return; - } - // System.out.println(t.getLocale().toString() + " " + - // t.getLocale().getCountry() + " " + - // t.getLocale().getDisplayCountry()); - System.out.println("ee"); - count = 1; - u32.keybd_event((byte) 0x15, (byte) 0, 0, 0);// ffDDDddSS - u32.keybd_event((byte) 0x15, (byte) 00, (byte) 0x0002, 0);// - // - } - } - }); - widthTextfield.requestFocus(); - } - - public interface User32jna extends Library { - User32jna INSTANCE = (User32jna) Native.loadLibrary("user32.dll", User32jna.class); - - // User32jna INSTANCE = (User32jna) - // Native.loadLibrary("user32.dll",User32jna.class); - public void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); - } - - /* - * User32jna u32 = User32jna.INSTANCE; - */ - - class MainPanel extends JPanel implements Runnable { - - private static final long serialVersionUID = 1L; - - public MainPanel() { - setLayout(null); - - startBtn = new JButton("Start"); - stopBtn = new JButton("Stop"); - widthTextfield = new JTextField(Integer.toString(new_Width), 5); - heightTextfield = new JTextField(Integer.toString(new_Height), 5); - widthLabel = new JLabel("width"); - heightLabel = new JLabel("height"); - compressLabel = new JLabel("   Image
Compress
"); - compressTrueRBtn = new JRadioButton("True"); - compressFalseRBtn = new JRadioButton("False"); - - startBtn.setBounds(0, 0, 150, 130); - stopBtn.setBounds(150, 0, 150, 130); - widthLabel.setBounds(327, 8, 50, 15); - widthTextfield.setBounds(300, 30, 90, 35); - heightLabel.setBounds(325, 70, 50, 15); - heightTextfield.setBounds(300, 90, 90, 35); - compressLabel.setBounds(405, -10, 100, 50); - compressTrueRBtn.setBounds(390, 30, 80, 30); - compressFalseRBtn.setBounds(390, 90, 80, 30); - - ButtonGroup group = new ButtonGroup(); - group.add(compressTrueRBtn); - group.add(compressFalseRBtn); - - widthLabel.setFont(new Font(myFont, Font.PLAIN, 15)); - heightLabel.setFont(new Font(myFont, Font.PLAIN, 15)); - - compressLabel.setFont(new Font(myFont, Font.PLAIN, 10)); - startBtn.setFont(new Font(myFont, Font.PLAIN, 20)); - stopBtn.setFont(new Font(myFont, Font.PLAIN, 20)); - compressTrueRBtn.setFont(new Font(myFont, Font.PLAIN, 20)); - compressFalseRBtn.setFont(new Font(myFont, Font.PLAIN, 20)); - - compressTrueRBtn.setSelected(true); - - add(startBtn); - add(stopBtn); - add(widthLabel); - add(widthTextfield); - add(heightLabel); - add(heightTextfield); - add(compressLabel); - add(compressTrueRBtn); - add(compressFalseRBtn); - stopBtn.setEnabled(false); - startBtn.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - if (isRunning) - return; - try { - new_Height = Integer.parseInt(heightTextfield.getText()); - new_Width = Integer.parseInt(widthTextfield.getText()); - } catch (Exception e1) { - return; - } - heightTextfield.setEditable(false); - widthTextfield.setEditable(false); - isRunning = true; - startBtn.setEnabled(false); - stopBtn.setEnabled(true); - if (compressTrueRBtn.isSelected()) { - isCompress = true; - } else if (compressFalseRBtn.isSelected()) { - isCompress = false; - } - compressTrueRBtn.setEnabled(false); - compressFalseRBtn.setEnabled(false); - - imgThread = new Thread(mainPanel); - CursorThread cursorThread = new CursorThread(); - KeyBoardThread keyBoardThread = new KeyBoardThread(); - imgThread.start(); - cursorThread.start(); - keyBoardThread.start(); - - } - }); - stopBtn.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - if (!isRunning) - return; - heightTextfield.setEditable(true); - widthTextfield.setEditable(true); - isRunning = false; - ServerSocketCloseThread closeThread = new ServerSocketCloseThread(); - closeThread.start(); - // imgThread.interrupt(); - stopBtn.setEnabled(false); - startBtn.setEnabled(true); - compressTrueRBtn.setEnabled(true); - compressFalseRBtn.setEnabled(true); - - } - }); - widthTextfield.transferFocus(); - } - - public void run() { - - try { - robot = new Robot(); - screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width; - screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height; - rect = new Rectangle(0, 0, screenWidth, screenHeight); - System.out.println(""); - imageSeverSocket = new ServerSocket(SERVER_PORT);// ImageSERVER - - imageSocket = imageSeverSocket.accept(); - imageSocket.setTcpNoDelay(true); - dataOutputStream = new DataOutputStream(imageSocket.getOutputStream()); - dataOutputStream.writeInt(screenWidth); - dataOutputStream.writeInt(screenHeight); - dataOutputStream.writeInt(new_Width); - dataOutputStream.writeInt(new_Height); - dataOutputStream.writeBoolean(isCompress); - cursor = ImageIO.read(cursorURL); - } catch (Exception e) { - - } - ImgDoubleBufferTh th = new ImgDoubleBufferTh(); - th.start(); - - //new ImgDoubleBufferTh().start(); - - // ImageIO.setUseCache(false);// little more spped - - // imgvec.add(getScaledImage(robot.createScreenCapture(rectangle),screenWidth,screenHeight,BufferedImage.TYPE_3BYTE_BGR)); - // Image cursor = ImageIO.read(new - // File("c:\\Test\\cursor.gif")); - - // long starttime,estimatedTime; - int index = 0; - Runtime runtime = Runtime.getRuntime(); - while (isRunning) { - try { - - // screenImage = - // JNAScreenShot.getScreenshot(rectangle);//robot.createScreenCapture(rectangle); - // if (img[index] != null) { - // screenImage = img[index];// - // robot.createScreenCapture(rectangle); - - //screenImage =imgvec.get(0); //robot.createScreenCapture(rect);// - byte[] imageByte = imgvec.get(0); - if(imgvec.size() == 3){ - synchronized (th) { - th.notify(); - } - } - - - - /* - * int mouseX = MouseInfo.getPointerInfo().getLocation().x; - * int mouseY = MouseInfo.getPointerInfo().getLocation().y; - * - * screenImage.getGraphics().drawImage(cursor, mouseX, - * mouseY, 30, 30, null); - */ - - - - - if (isCompress) { - - //byte[] compressImageByte = compress(imageByte);// 6MB->480KB - // System.out.println("compress : " + - // (double)compressImageByte.length/1024 + "kb"); - dataOutputStream.writeInt(imageByte.length); - dataOutputStream.write(imageByte); - - // System.out.println(imageByte.length); - dataOutputStream.flush(); - } else { - dataOutputStream.writeInt(imageByte.length); - dataOutputStream.write(imageByte); - // System.out.println(imageByte.length); - - dataOutputStream.flush(); - } - //} - } catch (Exception e) { - - } - if (runtime.totalMemory() / 1024 / 1024 > 500) - System.gc(); - if (imgvec.size() > 1) { - /* new Thread(){ - public void run(){ */ - //System.out.println(imgvec.size()); - imgvec.remove(0); - index++; - if(index == 30){ - System.out.println(""); - index=0; - System.gc(); - } - /* } - }.start();*/ - } - - - // Thread.sleep(1000); - } - - } - - } - - class ImgDoubleBufferTh extends Thread { - BufferedImage bufferimage; - Robot robot = null; - - synchronized public void run() { - try { - robot = new Robot(); - } catch (AWTException e) { - } - while (true) { - - bufferimage = robot.createScreenCapture(rect); - bufferimage = getScaledImage(bufferimage, new_Width, new_Height, BufferedImage.TYPE_3BYTE_BGR); - byte[] imageByte = ((DataBufferByte) bufferimage.getRaster().getDataBuffer()).getData(); - try { - imgvec.addElement(compress(imageByte)); - } catch (IOException e) { - e.printStackTrace(); - } - //System.out.println(imgvec.size()); - if(imgvec.size()>5) - try { - System.out.println("wait"); - wait(); - } catch (InterruptedException e) { - - } - } - - } - } - - public static byte[] compress(byte[] data) throws IOException { - byte[] output = Snappy.compress(data); - - return output; - } - - public BufferedImage getScaledImage(BufferedImage myImage, int width, int height, int type) { - BufferedImage background = new BufferedImage(width, height, type); - Graphics2D g = background.createGraphics(); - g.setColor(Color.WHITE); - g.drawImage(myImage, 0, 0, width, height, null); - g.dispose(); - return background; - } - - class ServerSocketCloseThread extends Thread { - public void run() { - if (!imageSeverSocket.isClosed() || !cursorServerSocket.isClosed() || keyboardServerSocket.isClosed()) { - try { - imageSeverSocket.close(); - cursorServerSocket.close(); - keyboardServerSocket.close(); - } catch (IOException e) { - DebugMessage.printDebugMessage(e); - } - } - } - } - - class KeyBoardThread extends Thread { - public void run() { - try { - keyboardServerSocket = new ServerSocket(SERVER_KEBOARD_PORT); - keyboardSocket = keyboardServerSocket.accept(); - DataInputStream dataInputStream = new DataInputStream(keyboardSocket.getInputStream()); - while (true) { - int keyboardState = dataInputStream.readInt(); - if (keyboardState == KEY_PRESSED) {// KEYBOARD PRESSED - int keyCode = dataInputStream.readInt(); - // System.out.println(keyCode + ""); - u32.keybd_event((byte) keyCode, (byte) 0, 0, 0);// ffDDDddSS - // robot.keyPress(keyCode); - } else if (keyboardState == KEY_RELEASED) { - int keyCode = dataInputStream.readInt(); - // System.out.println(keyCode + ""); - u32.keybd_event((byte) keyCode, (byte) 00, (byte) 0x0002, 0);// - // robot.keyRelease(keyCode); - } - yield(); - } - } catch (Exception e) { - - } - } - } - - class CursorThread extends Thread { - public void run() { - try { - System.out.println("ѱ"); - cursorServerSocket = new ServerSocket(SERVER_CURSOR_PORT);// cursorSERVER - cursorSocket = cursorServerSocket.accept(); - System.out.println("Ŀ Դ"); - DataInputStream dataInputStream = new DataInputStream(cursorSocket.getInputStream()); - int mouseX = 0; - int mouseY = 0; - while (isRunning) { - int mouseState = dataInputStream.readInt();// mouse,Keyboard - // state - if (mouseState == MOUSE_MOVE) {// move - mouseX = dataInputStream.readInt(); - mouseY = dataInputStream.readInt(); - - robot.mouseMove(mouseX, mouseY); - } else if (mouseState == MOUSE_PRESSD) { // pressed - int mouseButton = dataInputStream.readInt(); - robot.mouseMove(mouseX, mouseY); - if (mouseButton == 1) { - robot.mousePress(MouseEvent.BUTTON1_MASK); - } else if (mouseButton == 2) { - robot.mousePress(MouseEvent.BUTTON2_MASK); - } else if (mouseButton == 3) { - robot.mousePress(MouseEvent.BUTTON3_MASK); - } - } else if (mouseState == MOUSE_RELEASED) {// released - int mouseButton = dataInputStream.readInt(); - robot.mouseMove(mouseX, mouseY); - if (mouseButton == 1) { - robot.mouseRelease(MouseEvent.BUTTON1_MASK); - } else if (mouseButton == 2) { - robot.mouseRelease(MouseEvent.BUTTON2_MASK); - } else if (mouseButton == 3) { - robot.mouseRelease(MouseEvent.BUTTON3_MASK); - } - } else if (mouseState == MOUSE_DOWN_WHEEL) {// MOUSE DOWN - // WHEEL - robot.mouseWheel(-3); - } else if (mouseState == MOUSE_UP_WHEEL) {// MOUSE UP WHEEL - robot.mouseWheel(3); - } - yield(); - } - - } catch (Exception e) { - - } - - } - } - - public static void main(String[] args) { - new NetworkScreenServer(); - } - -} +import com.sun.jna.Library; +import com.sun.jna.Native; +import org.xerial.snappy.Snappy; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URL; +import java.util.Vector; + + +public class NetworkScreenServer extends JFrame { + private final static int SERVER_PORT = 9999; + private final static int SERVER_CURSOR_PORT = SERVER_PORT - 1; + private final static int SERVER_KEBOARD_PORT = SERVER_PORT - 2; + private DataOutputStream dataOutputStream; + private ObjectOutputStream objectOutputStream; + private Image cursor; + private String myFont = "�������"; + private BufferedImage screenImage; + private Rectangle rect; + private MainPanel mainPanel = new MainPanel(); + private ServerSocket imageSeverSocket = null; + private ServerSocket cursorServerSocket = null; + private ServerSocket keyboardServerSocket = null; + private Socket imageSocket = null; + private Socket cursorSocket = null; + private Socket keyboardSocket = null; + private Robot robot; + private int screenWidth, screenHeight; + private Boolean isRunning = false; + private Thread imgThread; + private static int new_Width = 1920; + private static int new_Height = 1080; + private JButton startBtn; + private JButton stopBtn; + private JTextField widthTextfield; + private JTextField heightTextfield; + private JRadioButton compressTrueRBtn; + private JRadioButton compressFalseRBtn; + private JLabel widthLabel; + private JLabel heightLabel; + private JLabel compressLabel; + private URL cursorURL = getClass().getClassLoader().getResource("cursor.gif"); + private Boolean isCompress = true; + private JFrame fff = this; + private final int MOUSE_MOVE = 1; + private final int MOUSE_PRESSD = 2; + private final int MOUSE_RELEASED = 3; + private final int MOUSE_DOWN_WHEEL = 4; + private final int MOUSE_UP_WHEEL = 5; + private final int KEY_PRESSED = 6; + private final int KEY_RELEASED = 7; + private final int KEY_CHANGE_LANGUAGE = 8; + int count = 0, count2 = 0; + private User32jna u32 = User32jna.INSTANCE; + private int buffersize = 1; + private BufferedImage[] img = new BufferedImage[buffersize]; + private Vector imgvec = new Vector<>(); + + public NetworkScreenServer() { + setTitle("원격지원 대상 컴퓨터용"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setLayout(null); + setContentPane(mainPanel); + setSize(490, 160); + setVisible(true); + setResizable(false); + + addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + System.out.println("type" + e.getKeyCode() + " " + e.getKeyChar() + " " + e.getID() + " " + + e.getModifiers() + " " + e.getKeyLocation() + " " + e.getExtendedKeyCode()); + } + + @Override + public void keyPressed(KeyEvent e) { + System.out.println("pressed" + e.getKeyCode() + " " + e.getKeyChar() + " " + e.getID() + " " + + e.getModifiers() + " " + e.getKeyLocation() + " " + e.getExtendedKeyCode()); + super.keyPressed(e); + } + + @Override + public void keyReleased(KeyEvent e) { + System.out.println("released" + e.getKeyCode() + " " + e.getKeyChar() + " " + e.getID() + " " + + e.getModifiers() + " " + e.getKeyLocation() + " " + e.getExtendedKeyCode()); + if (e.getKeyCode() == 0) { + if (count >= 1) { + count = 0; + return; + } + // System.out.println(t.getLocale().toString() + " " + + // t.getLocale().getCountry() + " " + + // t.getLocale().getDisplayCountry()); + System.out.println("ee"); + count = 1; + u32.keybd_event((byte) 0x15, (byte) 0, 0, 0);// ����ffDDDddSS + u32.keybd_event((byte) 0x15, (byte) 00, (byte) 0x0002, 0);// ���� + // ���� + } + } + }); + widthTextfield.requestFocus(); + } + + public interface User32jna extends Library { + User32jna INSTANCE = (User32jna) Native.loadLibrary("user32.dll", User32jna.class); + + // User32jna INSTANCE = (User32jna) + // Native.loadLibrary("user32.dll",User32jna.class); + public void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); + } + + /* + * User32jna u32 = User32jna.INSTANCE; + */ + + class MainPanel extends JPanel implements Runnable { + + public MainPanel() { + setLayout(null); + + startBtn = new JButton("Start"); + stopBtn = new JButton("Stop"); + widthTextfield = new JTextField(Integer.toString(new_Width), 5); + heightTextfield = new JTextField(Integer.toString(new_Height), 5); + widthLabel = new JLabel("width"); + heightLabel = new JLabel("height"); + compressLabel = new JLabel("   Image
Compress
"); + compressTrueRBtn = new JRadioButton("True"); + compressFalseRBtn = new JRadioButton("False"); + + startBtn.setBounds(0, 0, 150, 130); + stopBtn.setBounds(150, 0, 150, 130); + widthLabel.setBounds(327, 8, 50, 15); + widthTextfield.setBounds(300, 30, 90, 35); + heightLabel.setBounds(325, 70, 50, 15); + heightTextfield.setBounds(300, 90, 90, 35); + compressLabel.setBounds(405, -10, 100, 50); + compressTrueRBtn.setBounds(390, 30, 80, 30); + compressFalseRBtn.setBounds(390, 90, 80, 30); + + ButtonGroup group = new ButtonGroup(); + group.add(compressTrueRBtn); + group.add(compressFalseRBtn); + + widthLabel.setFont(new Font(myFont, Font.PLAIN, 15)); + heightLabel.setFont(new Font(myFont, Font.PLAIN, 15)); + + compressLabel.setFont(new Font(myFont, Font.PLAIN, 10)); + startBtn.setFont(new Font(myFont, Font.PLAIN, 20)); + stopBtn.setFont(new Font(myFont, Font.PLAIN, 20)); + compressTrueRBtn.setFont(new Font(myFont, Font.PLAIN, 20)); + compressFalseRBtn.setFont(new Font(myFont, Font.PLAIN, 20)); + + compressTrueRBtn.setSelected(true); + + add(startBtn); + add(stopBtn); + add(widthLabel); + add(widthTextfield); + add(heightLabel); + add(heightTextfield); + add(compressLabel); + add(compressTrueRBtn); + add(compressFalseRBtn); + stopBtn.setEnabled(false); + startBtn.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (isRunning) + return; + try { + new_Height = Integer.parseInt(heightTextfield.getText()); + new_Width = Integer.parseInt(widthTextfield.getText()); + } catch (Exception e1) { + return; + } + heightTextfield.setEditable(false); + widthTextfield.setEditable(false); + isRunning = true; + startBtn.setEnabled(false); + stopBtn.setEnabled(true); + if (compressTrueRBtn.isSelected()) { + isCompress = true; + } else if (compressFalseRBtn.isSelected()) { + isCompress = false; + } + compressTrueRBtn.setEnabled(false); + compressFalseRBtn.setEnabled(false); + + imgThread = new Thread(mainPanel); + CursorThread cursorThread = new CursorThread(); + KeyBoardThread keyBoardThread = new KeyBoardThread(); + imgThread.start(); + cursorThread.start(); + keyBoardThread.start(); + + } + }); + stopBtn.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (!isRunning) + return; + heightTextfield.setEditable(true); + widthTextfield.setEditable(true); + isRunning = false; + ServerSocketCloseThread closeThread = new ServerSocketCloseThread(); + closeThread.start(); + // imgThread.interrupt(); + stopBtn.setEnabled(false); + startBtn.setEnabled(true); + compressTrueRBtn.setEnabled(true); + compressFalseRBtn.setEnabled(true); + + } + }); + widthTextfield.transferFocus(); + } + + public void run() { + + try { + robot = new Robot(); + screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width; + screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height; + rect = new Rectangle(0, 0, screenWidth, screenHeight); + System.out.println("��������"); + imageSeverSocket = new ServerSocket(SERVER_PORT);// ImageSERVER + + imageSocket = imageSeverSocket.accept(); + imageSocket.setTcpNoDelay(true); + dataOutputStream = new DataOutputStream(imageSocket.getOutputStream()); + objectOutputStream = new ObjectOutputStream(imageSocket.getOutputStream()); + dataOutputStream.writeInt(screenWidth); + dataOutputStream.writeInt(screenHeight); + dataOutputStream.writeInt(new_Width); + dataOutputStream.writeInt(new_Height); + dataOutputStream.writeBoolean(isCompress); + cursor = ImageIO.read(cursorURL); + } catch (Exception e) { + + } + ImgDoubleBufferTh th = new ImgDoubleBufferTh(); + th.start(); + + //new ImgDoubleBufferTh().start(); + + // ImageIO.setUseCache(false);// little more spped + + // imgvec.add(getScaledImage(robot.createScreenCapture(rectangle),screenWidth,screenHeight,BufferedImage.TYPE_3BYTE_BGR)); + // Image cursor = ImageIO.read(new + // File("c:\\Test\\cursor.gif")); + + // long starttime,estimatedTime; + int index = 0; + Runtime runtime = Runtime.getRuntime(); + while (isRunning) { + try { + + // screenImage = + // JNAScreenShot.getScreenshot(rectangle);//robot.createScreenCapture(rectangle); + // if (img[index] != null) { + // screenImage = img[index];// + // robot.createScreenCapture(rectangle); + + //screenImage =imgvec.get(0); //robot.createScreenCapture(rect);// + byte[] imageByte = imgvec.get(0); + if(imgvec.size() == 3){ + synchronized (th) { + th.notify(); + } + } + + + + /* + * int mouseX = MouseInfo.getPointerInfo().getLocation().x; + * int mouseY = MouseInfo.getPointerInfo().getLocation().y; + * + * screenImage.getGraphics().drawImage(cursor, mouseX, + * mouseY, 30, 30, null); + */ + + + + + if (isCompress) { + + //byte[] compressImageByte = compress(imageByte);// 6MB->480KB���� + // System.out.println("compress : " + + // (double)compressImageByte.length/1024 + "kb"); + dataOutputStream.writeInt(imageByte.length); + dataOutputStream.write(imageByte); + + // System.out.println(imageByte.length); + dataOutputStream.flush(); + } else { + dataOutputStream.writeInt(imageByte.length); + dataOutputStream.write(imageByte); + // System.out.println(imageByte.length); + + dataOutputStream.flush(); + } + //} + } catch (Exception e) { + + } + if (runtime.totalMemory() / 1024 / 1024 > 500) + System.gc(); + if (imgvec.size() > 1) { + /* new Thread(){ + public void run(){ */ + //System.out.println(imgvec.size()); + imgvec.remove(0); + index++; + if(index == 30){ + System.out.println("������"); + index=0; + System.gc(); + } + /* } + }.start();*/ + } + + + // Thread.sleep(1000); + } + + } + + } + + class ImgDoubleBufferTh extends Thread { + BufferedImage bufferimage; + Robot robot = null; + + synchronized public void run() { + try { + robot = new Robot(); + } catch (AWTException e) { + } + while (true) { + + bufferimage = robot.createScreenCapture(rect); + bufferimage = getScaledImage(bufferimage, new_Width, new_Height, BufferedImage.TYPE_3BYTE_BGR); + byte[] imageByte = ((DataBufferByte) bufferimage.getRaster().getDataBuffer()).getData(); + try { + imgvec.addElement(compress(imageByte)); + } catch (IOException e) { + e.printStackTrace(); + } + //System.out.println(imgvec.size()); + if(imgvec.size()>5) + try { + System.out.println("wait"); + wait(); + } catch (InterruptedException e) { + + } + } + + } + } + + public static byte[] compress(byte[] data) throws IOException { + byte[] output = Snappy.compress(data); + + return output; + } + + public BufferedImage getScaledImage(BufferedImage myImage, int width, int height, int type) { + BufferedImage background = new BufferedImage(width, height, type); + Graphics2D g = background.createGraphics(); + g.setColor(Color.WHITE); + g.drawImage(myImage, 0, 0, width, height, null); + g.dispose(); + return background; + } + + class ServerSocketCloseThread extends Thread { + public void run() { + if (!imageSeverSocket.isClosed() || !cursorServerSocket.isClosed() || keyboardServerSocket.isClosed()) { + try { + imageSeverSocket.close(); + cursorServerSocket.close(); + keyboardServerSocket.close(); + } catch (IOException e) { + DebugMessage.printDebugMessage(e); + } + } + } + } + + class KeyBoardThread extends Thread { + public void run() { + try { + keyboardServerSocket = new ServerSocket(SERVER_KEBOARD_PORT); + keyboardSocket = keyboardServerSocket.accept(); + DataInputStream dataInputStream = new DataInputStream(keyboardSocket.getInputStream()); + while (true) { + int keyboardState = dataInputStream.readInt(); + if (keyboardState == KEY_PRESSED) {// KEYBOARD PRESSED + int keyCode = dataInputStream.readInt(); + // System.out.println(keyCode + "����"); + u32.keybd_event((byte) keyCode, (byte) 0, 0, 0);// ����ffDDDddSS + // robot.keyPress(keyCode); + } else if (keyboardState == KEY_RELEASED) { + int keyCode = dataInputStream.readInt(); + // System.out.println(keyCode + "����"); + u32.keybd_event((byte) keyCode, (byte) 00, (byte) 0x0002, 0);// �� + // robot.keyRelease(keyCode); + } + yield(); + } + } catch (Exception e) { + + } + } + } + + class CursorThread extends Thread { + public void run() { + try { + System.out.println("�ѱ�"); + cursorServerSocket = new ServerSocket(SERVER_CURSOR_PORT);// cursorSERVER + cursorSocket = cursorServerSocket.accept(); + System.out.println("Ŀ�� ���� ���Դ�"); + DataInputStream dataInputStream = new DataInputStream(cursorSocket.getInputStream()); + int mouseX = 0; + int mouseY = 0; + while (isRunning) { + int mouseState = dataInputStream.readInt();// mouse,Keyboard + // state + if (mouseState == MOUSE_MOVE) {// move + mouseX = dataInputStream.readInt(); + mouseY = dataInputStream.readInt(); + + robot.mouseMove(mouseX, mouseY); + } else if (mouseState == MOUSE_PRESSD) { // pressed + int mouseButton = dataInputStream.readInt(); + robot.mouseMove(mouseX, mouseY); + if (mouseButton == 1) { + robot.mousePress(MouseEvent.BUTTON1_MASK); + } else if (mouseButton == 2) { + robot.mousePress(MouseEvent.BUTTON2_MASK); + } else if (mouseButton == 3) { + robot.mousePress(MouseEvent.BUTTON3_MASK); + } + } else if (mouseState == MOUSE_RELEASED) {// released + int mouseButton = dataInputStream.readInt(); + robot.mouseMove(mouseX, mouseY); + if (mouseButton == 1) { + robot.mouseRelease(MouseEvent.BUTTON1_MASK); + } else if (mouseButton == 2) { + robot.mouseRelease(MouseEvent.BUTTON2_MASK); + } else if (mouseButton == 3) { + robot.mouseRelease(MouseEvent.BUTTON3_MASK); + } + } else if (mouseState == MOUSE_DOWN_WHEEL) {// MOUSE DOWN + // WHEEL + robot.mouseWheel(-3); + } else if (mouseState == MOUSE_UP_WHEEL) {// MOUSE UP WHEEL + robot.mouseWheel(3); + } + yield(); + } + + } catch (Exception e) { + + } + + } + } + + public static void main(String[] args) { + new NetworkScreenServer(); + } + +} diff --git a/RemoteControlClient/.classpath b/RemoteControlClient/.classpath deleted file mode 100644 index 4a683fb..0000000 --- a/RemoteControlClient/.classpath +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RemoteControlClient/.gitignore b/RemoteControlClient/.gitignore deleted file mode 100644 index b83d222..0000000 --- a/RemoteControlClient/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/RemoteControlClient/.project b/RemoteControlClient/.project deleted file mode 100644 index ede27a1..0000000 --- a/RemoteControlClient/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - RemoteControlClient - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - - diff --git a/RemoteControlClient/.settings/org.eclipse.jdt.core.prefs b/RemoteControlClient/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index e24b722..0000000 --- a/RemoteControlClient/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/RemoteControlClient/.settings/org.eclipse.m2e.core.prefs b/RemoteControlClient/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/RemoteControlClient/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/RemoteControlClient/bin/DebugMessage.class b/RemoteControlClient/bin/DebugMessage.class deleted file mode 100644 index 463ba44d380c2347df6fddd686c1b3627ad30a1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 778 zcmZXS%TC)+5QhH=2~Ld31xQPwEqAcfifk%2saO=~Dzue?!lJ7a_sAUZ1vyUDK32OZ z5(^%n4^=V8F~t^}IhUFF=J$X6_uuUufOmLnphU2a*B7DJ z{XDvqZbF!SuR@g^5@u{?NGKmg-=v8d)GSmmOK9{}C_hbtk&Ms8$d`nLe&h;&C}O40 z*=0GoP-8;9pP$(yw60?nCizQ3+wMQ=7$jWa^_*c1Ei4*XD5xC#949icu!J@%j3z9& zJ#AJ|_lrhzzZ5~w#B;nbuuND?*~PSl6*LG&D#j0a7ffBzU-Lu@VL7kxS*wdZa&}&U03~$X6Fx{J@%WN0m@ue$uX)}#mkKG lDr0=e7#i^UdaaG;9dXp&JdUA)z<1HY?M z3lax@06(f?9Kr={yOP)AnKy4{o_+uK_71=&R6S$_X4_=1qWH&AHzqQTP?NFcEe|oGo6$_GD9ncqRxQN+Gx8YPz+KLm5xBJ5%p*i z0xu-SFzzFZDG3iR1+swyZ-7#V(rc&XU;VvFrQYayv5DP z3)lSDSoQnV6IcpbX~XTgIqQ{^ zPhlVLu;O7^;8lub602BaB@(i3M5`ksFcvhMP6xr0m;TeUfPWMX;x2vDPNZTA{|7e; zE4pX8VU%doKOlP+u^6&x48@I5B?%>1=G(~f0}+LSyArlCygW>>f0C_jK0A+J-TcG9 z8^~WnOy2p15$+mw6!d`zbIeue?*XXMrz!vd diff --git a/RemoteControlClient/bin/NetworkScreenClient$2.class b/RemoteControlClient/bin/NetworkScreenClient$2.class deleted file mode 100644 index fdd9a4a416a7c80d56b5c3e892e7aa5111193834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmaJfgc5Ph4Nnz(iw3T;yYr9dc7g9xfPAQd4&RHUG!2VAA%xOGOU8)seF>lXeE ze}MxZ;=m8!M~f4p9kHEgAKH7Yzl1s6Xs$Iw*?wA(r67_%h!Bsp;LARL%n%Dn;oamRUv_cKC?ud}~Cr zY0inG8oxHKbH2gR3*MWIv)B8|pYL$L6qr?$EB*+s3((}f%QYr@18cmpB-|=l-j^(1 z?;F;w&#fl&_YVmFOh%<%Jwp}XD)Z;Zm;p@ z_!k7N;s<|#KT4cE?u&5sU~gwpGs6xg~p%*GaO36#!Ay-t)0gOqaL!fkAu zxFfKZBa4k4>8;y#O@Y5jX^;{hHr zbWCcbq++FvW?xGv*sTAjU4dmzaHm6gk*R5o!X$F($kTe)a@yF_<#{-Vf$N7cGaQmS z4<|PE^yHTKDKUZLAq5F5-wy(cdcKTfim}VHF7opem5LrXTLoSw7TI57>p7pb$7*-J z@$WnAFKNt*_N6z1^WLGtXPa}h_a;_(XTed;P~K)J)y@^xjn62zzry-~x^acO8m|bA zS5BF{=h`1QSEiU7X^m=z2}XQ`CZo2}EV0HZZ8i(&;4$w8Px}cRwk!_Pbol!V4^hRS diff --git a/RemoteControlClient/bin/NetworkScreenClient$ControlPanel$1.class b/RemoteControlClient/bin/NetworkScreenClient$ControlPanel$1.class deleted file mode 100644 index 550eda9540568433645e9b02fef6ee5d7cfeede0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 zcmah}TTc@~6#j-5w$$Zffr^4sv1kk0Qb0wEC{)U=AQ93;V`7GOQnoC+xVr@s@9|go z2lQEjnE2q6PyQ(5ne75K*3e|TGiT2E=KIcNfBpXc1Hc%T6*MsPFAHbav^G}@mJmip z*M#9jGp6BKroO@rp+{2+{0u#1zQdDz*GY;Ua!D?k6)Gy0F&xx-J+( zIkUj^JhwEt_l$l?lOcNQt3+0>cWD46Vn>bWc>IFv1Yb z&CkxQJ)eC%^@J#$B)l3Oz!(GMmA6#f#yDxVk2L>9&yy^xlE7URX^Gu9otw%m%IJG4 zCUKt#Q*MGElI5CC{m8A-FwMjXznY<_HUxpMI=ryC#J9cX z3$B_Kt01zPY|rjGJ(7?ap%Tp)1>Ll%WJ|)?FpIL$=P9D@tWe_-yLlpKWpr-a!d8%D z=%@oP(D1=!A9mH0J@!Bu o)5sA2hZOBc!{i|0&Ct35SP;^jzh8&WhzqCp~2#CNO;0dSK(XDd)*UI3EPHj!sad|Q_n|SSVG5-8%$lAe%mbV9(W-Q$)szi^kxcnb0_HRm z`E0EpDGV7nDlocN{U(NSOu)1n4PQ2!^R{#teJBY2FxT9&-HqI}HTh5lC;2!=@Q#7E z1yVZwn;s@kU{t`^kV@YYIFiYBkUADaRh7?(`97Q!KpbhjZ{U8^%MIUaxg_9l54|1lY^@LH*xJddvlBf(O~|x~8C+n|4ALoj2i&mc zY)$)KG?B+8qM>im@}*kwnzph%m$J%~w0H#NGQ5qotL{#73AL)M`sR{#FH}*Sx>(V@ zlZ`lL@u`8Lz|k%rJMWvA!#s&$dpIy!$AM-`S}|8mlyHrQb>d=GSAzC-}a}zb)zl%XwSR($FrNp3pGZojJGekWhDHNvb*bys_(Gb5JP!5^ME~jz#{O z25z#VUBc6^_Z5Uu4u6y{Es;p*Hvm_9XP}Svey%Pc!Y>s*HvT97{(|`jcM%-Yw%~-d z;d>;wH+e@}-$Ig4=EspR%6DOunXy-hzrtV}$CK~2@!m6>4lOT{Z6gyK}$GA)Yp9HtXG?!Pph+c$IEK@tc-p6Oavi1T-hgnM1XYn(5!#sapH9t+6)g(Ut;B7VbpJV60Z vv5aRuXe(W`l^(P)L=InM#a|G41YhDhpE2tC2EOJhNm~lv;1<`KaDM&=v9pRv diff --git a/RemoteControlClient/bin/NetworkScreenClient$ControlPanel$3.class b/RemoteControlClient/bin/NetworkScreenClient$ControlPanel$3.class deleted file mode 100644 index f23fd5480c5e13ae979054f4a9993c3a9f27a01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3243 zcma)8`EwLS6#hEbB1hqWz z7Viu18}UFu*hEoFETz1v^arc_7c8~>$tugT%JS=($?PV?id&gU_v?PIzxUqP@69*= zeDo=RmB?x+5LntNy%F2l)|GOkw3^Jcw7lvj+wvUS++bMJtghEkBrs>IF>EAE!|G40 z@7*d>o`w>E#lF-S@e*>FiiyUQm$t2B+V!L*9f1;WAnjJ4&0~@?ozuYGYtmNQTPtvC z&CJ_tdjyJ_>^@lrfmu2~>=Rg0lbkjX%_=AjwLN91#6k@V1gd5VgN_ri zNI*CG`W)%HEoo`;fJ)!~Xu=&yGXd@0a@6xz8e%vJRT`EE%vT7G-J#=TEEUlDrKhw6 z=GD{&VEtTnc@8Z$l%kq`oxP&IF7JuqG}LG~eNyrR1s%0m#)QcmGKR^>9UlfDj~@-S zn-sV+bexGgW{3bu~HzGY-_!w zdvojMjT;Fm7x6$_!#M&AeML)pi8j8v?9?{tH3pF^#d!i{rpo?+?Rqh+!fM48CUky2 z`YazsS|3BoMj!8^bBbqc^Brtax8tAwf&AF2phMH+l zY6$bEybL^~;a0S1xP&>30uU_eXvd{Yf6BHjURr@gp|3gZFg^{w$BpRF(V359g+jeS z$7T7#`WU)!g@$f2^F;20jDD%32UiMI43Sk{{sJkSALQoIlpIo}f|sKdOsCG0 zqX1U57->`S=4u_+;94SgCx|Z>x@NFa?fFyCG~<1Xyu4mBL~UCVc72D9)T*h9Ni_ZkT+JwzEbK z>TtoN6xtcSj}L&Q?ZgHZKDsE4L0-*a^7gl<_x*BU->;9n6~icQ)Ucf#@>4x|w~m|q zp!xAPtzs5>{=^?K+=|;Z+%^e9_W%!|*LUDffnwK`a)>3hroFaD!(H?)XbFB3P@%X- z$Gx~O7vOURmQNqxfS^$=YH^G~NsjKo1M0#(D9|2oVakqU@-nkPmDWZ)q~l>cLd34$ z#C*i8ILSN*{JZyqwY+9$pC4rygBGT5UQOaT)v_^fye&uDm>)k?*BGF%$H@$NvM<^rAP8kq5WuPJIp|7?zPtnB?TS(74RuTjMC#cI*)TDi7i`x2>P-y%--+ssZcV1 zMQOi`IOjTblyolU@jv5(`GJ*!-)Xyqq9e-=LO+NTvRE8HC5uycVQnN?egKI#QFj=t zHpb7bIK6xf=XXp@W^>XxF`325>Z09fQi4c*ah^)PFjCDI1}2nb9BamL;TaW$KWEVr z36f_{5v*TO6i9ZXZFTX2;&EIa+KXS6#img4Fj_Z`;kt2bo+?O96>JFwJUol^F6>cr zMkYQ;a|d9@Gg*wx!_DKkB~sntd+Q^)h|ln&PrfZA9tjqbPmSKdo1|ZYxOU?$;_elj!_gWd z-a}a-Mnro!YUk{2%8Ia)X9lCA{91X3{uJ}1VvgS9doR6Qf|9?{@ekH%SQY#YYk1{v mH2;ac8eS`*srR|90Q=}XXtI(4ILJ|)vPu^7LmaES!r#B%ID$|B diff --git a/RemoteControlClient/bin/NetworkScreenClient$ControlPanel$4.class b/RemoteControlClient/bin/NetworkScreenClient$ControlPanel$4.class deleted file mode 100644 index 349a4c931b2fe6d4d4d5445488883236fb8f123e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 847 zcmah{U279T6g`t{yJlTYOtn^RZH-&qL@)?>5UPTN3Wc>6B6*)|uI<##4D3!@{aHSU z;)6fHA0X(D5$~*du(Fti;odoW?zvy{?bnyD00!v!s0noT$)1_~?I_KO^e|JTZ8S96 z<|aFknzCr%!xLy7%Tw9Uq(1DwnjBMVeJl%Xl&CzjeLCg9{`1r-qZ3tF(v%A<+apy( zk2p=TD9;YFpD3;DGlA`RF}*t$@P=ke4G3Hc;p0MpI+`IGXbIF~M`$KW)Bee9LiuYs z$w;7`m{ewCnJagngPto>AX=C;8gQ9SS$26q`5TkZXezK7CzXTPbwk~+P-YLr_-g9LOE_D5Wk^;fVoa8CJP_C)9is3$V6>+h^x;dg zM`r5duE16W|J>5u5Vu*kau3{)K)9!Q!^2D#1r=F>aE;5o!`4Fw5$>_qW~_tz=(6up^YbhEfmsfbft>3Eo?AX+Il3H2vqHzRwPLMh{Z-pp%AN}O3Z_*m zdD{0UZCx%Ybmi-W=JZ++?u;oIMb~k3F&GaVg&p;B zGpVWcyqI~|#1^!~@rc6qI<+W(1Ri4uOq|4Npa;ETppP-6!g#Y~i>aFpJZ5k#vbe`Y z9Ek)5>1BekipR-BSgOsOe;vfqP!aU4+CD)6&nW0G|?*a}a^afo3xNVbWm@U%k0Di&F3sY&`j zQhtAw21f9VWPugi)gTKIs!kj=aSYEADI*m`Y`2;?g%gI?gQKk&$MbRI6t>-sA?KD| z&%^{K*=PBw6DQ{`o;Z8Fz`93>B+gJ~Ofq!R#1u|32ca)dFL{zC#$Mwwl1|SjkXL9M zIWW4v<}XHOOuQha6~NNw!h6xgS?QM~c{$6|!5P=L1KV}tn4^`uaHkv!_y%S%FR96j z?#m_$I3Ja5+VYlco|4WQK#>lU5XUPD{SC@gcVY)d3|zp1n7^nn*sxx83b(t*GO>sv zL*Tidb}PQl+kT)O?J4xtpwTP5BC>S?AvFCU&<+?VVL^hvY{JGeD@kvs^^JSJcHif# zW;=wcP&RQD%uoO|_}>k#2sy0-pzm~slPnYa!HWv~(xj8TwT=O zoWSNm$-70XJa2in(6^b*a(&WnqpPvL?h1z=q&pfJ;+ZyP-HKP#leQq~YS5MYrR(`l zOz~3ma%Ic+HF24>uM2v4)y4Q8HS^E=l_TU<3}@biKr$)UH|Zuyn%K&58=y8Q)x>!u zvv(bBnGLjOHqlu~8XMTTj&2e?g^ouzuzMZ-5it-FLm5>?D)Sw>W3hJpoIFy+6QugN zCjGI{!=#7W)j}=Zy@`>+-tRFQOLlJHa1}>H>EF!fM6(gI`&%5Z;sm$5J5EQY@s>X#@_~Bs^VP4yHH?EuU7F|M3#iSRK-$8=qj$9lSTiX#Zb7Qa~gGJV-vn; zRH|4ZNlZ6|e1qgSVJhF`xQH%}HXocz*oh_V!DS3%8HZ3tj^}F@4vM(O4!@3%;NeSl z{a2`99V_?|tN4{Wf8ZAW#3%R*pDKmVl!4Dx2fk2!_)QJtcf3UpCQHUb;cdLbawhnq zyc-n}gPggCEyURNH5W|~U@ak2hsvxmx$lMJ`}lx!hJB*=Xx-xa0{`-rqKN>b?`Aap E12v0FB>(^b diff --git a/RemoteControlClient/bin/NetworkScreenClient.class b/RemoteControlClient/bin/NetworkScreenClient.class deleted file mode 100644 index 2d5dcc97579032af65593a9de24a8cc8bb063447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3878 zcmai1YkU;d75`5NnPhT-Bm$zg76QudBq2gTZDMW7OBOaHCSfsPODDURxM6pO&hGNC zR>8Jv?JJ7Zw$@hqqPCU#U^msYwzc+U-;eL@XXT@x`|JPCBRhn}Ci%@h_nya`bMF6~ zGkNR3ue}anJN~7kPQx{OW%0P<9+^nHQrZK#th9?d>NT{@TF0yt-G$>>d!~E$uxsU| z29b8`qU+?wEL-L@v?pt5ZyJcm^l50wpB&~1Ehd%8?wmz~6GfMH$<^hFY;oUsQo~B0 zZOdXe_hdCHR)TNTaIMD+y-DP)8L1c)YR+fvY(9Ix^lXT5=d0DvPFt>qwU=q{9+7sb z-*T1m@c7P=p+oxnEtM_eQ z#pDG?1N+7&Mys5a8de9KJwsFdqdUh37qwQhd=R}v#EdKs)J@Vf54&+X4=b5>FH!l!vWSj<@a<><$3Sb#FQ8sCv zbV{Ue2rOI2i{1X&h-I^7xP+pze@x&wP7n^%QO$}iPn87QOhi#JtgOALbicqS@cmvZN`0*~NPrq9Y` zMx0VXjyNjFWVS%h6iPQo+>*!WZFdc^Ahyp5Jg(eqR{3z!LAq8Y8Oh#Kep_M)A`HwC_>60g+y z9hWsd#ycy@jI!zK`1aB{mb9j2&cHc*SH1dsizp0(@TQ7F$sEoL`~c6hIr3UGn2|de zaPmhToA=Ncl(Pz~dZ^6*NZ`kK!G~qPQ?fHmt4_Qq#OV0RRWPy5zy*bgb9hD)1T>e4KylLsinMl4;W{Lz-vrxoGU83x!N`Y5O(KSah{NLNRt_DUU!8auU3e5d_#!{%pQPl|xQ*TLc6O~^ zynsHuikRdos(etEL3eQyV(`tHp`Q-v8q8Y=u5xeMo0$cc5)Qb_G?8PX5@4*-( z?uLsAJji4{jx^Jf@xov4hZuz4iz)mJKW7?-ssB2uI(~xv0>9)5A;whlp8>A=0_Kl4W8Y0Pno8u@>~3_hRUI( zDrQ9G_cc|lr79f}l|R%}NiS9DjHtYYKL(E7Oy^bH4Q2;Rp_&apn5bues;y%!)rq?H z=h`~yr8-gH{(`^ONSa(4PFENX-T#|+2Y<&uxVE#*PIFa17yN}|(f=`N_@BW40F@4_ AZvX%Q diff --git a/RemoteControlClient/bin/ScreenPanel$1.class b/RemoteControlClient/bin/ScreenPanel$1.class deleted file mode 100644 index aed5ac2bb08a3f27eda99556535475e4730f56fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1169 zcma)6TTc@~6#k}N*mhZ@fKpUIE(Lo*)_O$?zHmuOS~1q(^K_Y%g?6{uodS=(cuO?? z0pEQlK_ou-1N==!J+o9&jkhM-opYJZ*EhKDD7)>{6u8RnfKKHJysvRewe0PRO@^s->5tv4sO}1x4FkitpyNEl*xz$a zT*L@fR)%lx9u2}8%Tmbv8X zE!k|ziu46<6bz&=qhp$3IAr#l921w3W{BM4s^9XSSbSyWrKGJ*4& zFmVNQ4E;^tab;(K5ZX$G)3CB{i>7Lg%j816$UjkDaDa48l5s_y& zciL`8DLT8}isbfAnK#>qY*f6KZ;Mq&jX|PA(K$th&U(eQ>t5iv)SKM$Hq{_4Fsz-l zv2O)?6tdPP4vsD6a0cNl70vCxW@XOEFN2#ZZ(8WwF;aFZdurv&$m2tFr}7f9kI`CnlM zuW3Bqgfz0y6jYmrTIF$#s&!!$*Xi34p==E|af?>BDKm-a7bMv?^dh2z>2!DK&(a8X Xp288_!CiW5bQua*q?OV}bxObQ?kN#~ diff --git a/RemoteControlClient/bin/ScreenPanel$2.class b/RemoteControlClient/bin/ScreenPanel$2.class deleted file mode 100644 index 47f6793dc1bf8cd57d7ee649cd87f1a6354644fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1652 zcmd5++j0{}5IrLa)>;M-7!n9zj1eH&ju#u-5JUju3&=NHJt?i6vpxgy&dOv$v$J46JA9icqnvEV(2-WtIJUD9gTbeXrz( zN_sM2Sg)#Xm_1BkOHFYLWH{k^t~yDfGM3^pKeN>9iZgqLdg)aX%;WB8>hIbCVKHF-WRqw8B^LW!xmTCA&z3Zz&lm?+>^11A`EL^b@( z8IF@UMT(aLSIMHMsG7M*P6tLf&a|)}(u~G9##_)~6K7F0aE^hG$=SM7rWy-Ja!lep zm1;3?J=JU=HjS%~T6=uOmW#T3>Cz398QR}-Elz!~F)-@3U0>-KhJ>Vh-Tt8(P2SXc z8!JlK^JTHv=usZE;#eRYM>nHc@#}#tCtTgsnWon1(`2ZZ$345|hptEJRMnr;V?ix9 z84Fpl!eug9lM{hhkcF6nCzVz4?RlyG2cV~m7d@KY(V7TD8KRTsFiFokuuMjeBYi89 z^rT@Dx`B4bkf1+ccK7@T-u)b#p3z$ZTQn9~wD)anrFTv~8g0imTB%IrN9v6vzM578aJR6cptqq84cjvLGO65#*Ybv_h=m`>>sqg?6{uPJuV^5&TRd zP>C_dOH6zyCje7e)(~I_XDv?%XOlak5S`QzV(8oD z``qLQ(iHo`k!HrNl*M9>m!$9*n&pmNj*gRO+UJ@i#hmTfa-Ja)yP%10F@%=goM;6@ zn}H@Y>j)xjK*J4&U`!dbr)@{PsuZ_{_l9p51Vd-qwRmBRd$u|^gdr7NS^GjqCn>m5 zRFIpVD3?W!VIY>iEQwW>Pcpux<2JfA++pbXrXA&>EuG`VvdD(+OWyoIbw+jfyN^ diff --git a/RemoteControlClient/bin/ScreenPanel$FPSCheckThread.class b/RemoteControlClient/bin/ScreenPanel$FPSCheckThread.class deleted file mode 100644 index 0598a7fb6d6eec9c965778435a7a6ec5139d3c05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1088 zcmZux;Z74l5dNkuy>cE<5K$4aO4SyGiUL-Os8p&YMbTmte=gSzoSfI@?y9_jkHT*g zg+>z}K!5leK7}~jHfc+_x3wWU+Ko~EYu9VJ}aHJj2Z56Y7 z(%j$PbEPP22oa+1#Yd5{g|nM#S_xr)&+_7T2?K===L~PGSdQhdvQwgKCs`tdvX!#z z2jQH7K7@4yF_~T8?AVepQmB~1E(zCC>y|O3zzGwb0H=5} zlb~C3`Z!B|f`4^Jy=dSPE))7ZTgocaNo*ubIc*C1I%2q~GQUN*kZ6Qz z%G>nFG-)LaBr)A)vD7PSUdJ8GX_zGpw{i21FL$MDAO)^a#IH2NDy)367frFbXW%{- zn4qXurBf!%o<*z2x0PE)g;-K}4+x`)Gcg{5^;zbM_6lcUMJb_q(%+T`zADM8fya2# z&Yj~9cUK^vENNIHOm^q(y0xk=%j*ZGtol~P;SMeO!rb2!)mHcD#Y)XJWzJIl740bc zoQgy+@{S|jtSvlGa+eKuUkFZ=TZ?;&qEXevJPYuvA;R{4o-OcNS@h|dZ~Qri@uhKQ zh`(Vz1KLEC=Z2a?$1p~CB%H@!E5c`l8WGZ?7_DP$`YZH0#(yC8Zsf)>;?4E#I%bYA ze}u&&q?IXH$D_lOKZV1S-;K!g%;YIERk&l!6!aQldV?gr#XOa;NUu70q+2|)e476W X@HBP~;2AFiSVxXWb%lsa^BnjO1KaoF diff --git a/RemoteControlClient/bin/ScreenPanel$KeyboardThread$1.class b/RemoteControlClient/bin/ScreenPanel$KeyboardThread$1.class deleted file mode 100644 index ebbf9516f49da9cdec90503cac381c0bd8070948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3138 zcmb_e>vI!T6#tzj={D&K;Za`Y8Glij%4^Z_U@ zAE1b+p!oRUj31bB{Gd)Lpfk?+#Si`i&iEfVqyK=8j^}Ptn$$MsgPGafyJyci_uTXQ z-E;2G|9tlYfF^t_p^UIOmM~RSk1D#F^mnP#aYHeO`bJGv8S?Ly;3Rm*lnEu2RP>Qh zPkc;GSQ5$!`w~Vfl*#I$FRU>WGn0k^_pViTAwFDMBM`EwP?|FNaparpdUH7$;l}bVN$0qE#LC zAB!IDJ=`5$M$=AOS95D5(%#e473=HmZ|MsMmoXCVBfV|0{zzZgjSbi&VPg?!vFVJZ zresuOGpEDIT7;^Ijj3jYqNb)>F^l0&vGrDLm#~e{Pbc>DJ=p>>WpEaBREij8uszW&ChTAE2R8bn|f))yN1MZy{z_@sm@aR|>yc$&9VU^=fL<1m`pFGm|6I?0DeXSk$5 zb8`o0$AeZJk9tChDM!<9LDK8BwjM!P`?!&U&EuwB$d8Jvf1r5?*2| z7A7wLS;i?SoO4~VvD(< zRZJzdJPh+kiR->o(}xX0)5Acwu#R&{WX9wxZ*f@c*^#!Gzg0z!=h(~Zrd2_2>f{a= zv$*ecE9rd8^2Cg+nNW{tqN#ZcYD&F0nB4i=^hDCgaKY?Wtx;o0#+!CqG_y<(xkJ}g zvn8oyGAj4I6?2U`*Z&Fb2Zc+*)zb7~3UI2pc;`qc;a#pLCFqvZpX*#)J>;6D zgb$V_z1@iHGa}(8!B=`cq0J1i^*J#M03xhi?7o8Se64Ws;{tiT;&#E8r!s!r@UXO! zXZ!hGNIW%r?m(`&ixuD4I;(`t{=(LzU^TzXY$K#=u$D(g9P4sk%G%ho#G=7(vA%8w zTV}CS4Bo2G(a)mQ!CCC7nSnfm`cDuRvwLWq!9H)5!{NA(r(7tKx#neqY~nn12lcm6 zDRdk>t^O20*3P2kOO68gT7<%ni~l)=q!GvSMeL2!=H2>f73;h=@PGVnS6AGcGFd=qifVe*KGo{=RnRAfZ@g@ ze0F4mn8LK63(HR93>@TR(w)UCd4!u=OcNcBFSZ(Fm3 zY&q}j63ff*8eZqo$(NlsaG7VFOxO@p^$O1g*5Y@F-`^^CbH8{S@9_6)JYMIqmB;sZ Vd>=RPA&*;m{D?;vkGIO*{{q4fL3IEC diff --git a/RemoteControlClient/bin/ScreenPanel$KeyboardThread.class b/RemoteControlClient/bin/ScreenPanel$KeyboardThread.class deleted file mode 100644 index c8e718fb284b72f1f31a9c634aeecd63e11e361f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2476 zcmbVOZBr9h6n<_3Y!ViXRBN%eMu|27>uS(iiPj24lCl9x0u;2iOL9pTHoNKWBIRTI zsoz^|$9ATE^Q-MZ9qUYgK>t%;&fQHkP={m+lbri)Jg{F*LKH_^S*(Hg`4+mx1LNLK}R$P74mL zyH(wZUts7{TR_vaaZNXM_X7e;?Ab{!GIUK?WgZ4Yzl;#V5d;yH5y4@GU?RCFc3zVq zp@-p+s+)Xfv$o3ZqPA*qh5^+oX~v>v>tfzm>=JG;oM<(*?`Gsv(B3p994EaNU-zlS zFGetk6T+Rh7*6hSexGVuxOx(&B*YkcTOehe#t@k^^i_r-wPe*4XVX;HO--pAn!9G% zHDyaTM^nmz!|l;jTELufJ38M^W4+sO@+Ow4}Ohu4FR8-r0GP=Z|CtYW=D6-m#^$l)XMw`gmoL#4&@ zzDcT|L?tCcqL zTHPZl3Cj#uIw;InnJ3QGN+rszpjt|83)%dKlv+2*?MT7ev`hS!F32<5a`3z;Mg}=& zn%tf+G{@mYq5aKUH{SzN89CVNJ)JJ0bTAG1+{F;iHpxN4THBWOY)~?ZA4N_j=nTpB zZZ)cn+N&{=U{DSZKKPP~Bv3z|Zm-SIofXt2;fuD>^3fY4N_lPaDHRxXBVt5HL3*pj zhd7D8Aznft8WnFP&BRUwy`(48=sE)Q4;&gE*+t**QyK(!G4Km51#rYurEPWxVRjcs zX)e=2Qpf8!Mv~zT9QL7TxyJ+l`Z)%d3F%FBc!wbAvxB#zeIx!T9(;yGH+FIUIa13{ zaVh^8W3+WS@Cg0C;>y7F-*DqGZir!qhK=**o?$A0rI)j5F>6j)kWgp4v9gQH5C7Q_ z-UmJJQ{s|LBk#YZ$MHKT>^@TL0mj((7-v5q!yY2fe#C9|6P3h$e8qnDZW;4$(zs<9 z+bEz&_f$wOV3A_8L^k@-^%qhSK9P_b7&;aWVFkDSXy6P<5vgwB;}aVA;p`EM6iyLJ z5%&P@c;BDmF3EAq5&dewXEYw9kNEo>t0+_EILQjhD#>+{8>qn|Stn`J}S`-RP6>58x>^79GF$>vk!Jj2w#DjSD zM~Ravx(5R@VO}Ql-pqV_zP#b2^G@rMQ1kvR+2o|tK!rL?&ImL0gFYeK ziUu-|IYMzfrEUzADq;bP4l0CdnyMp`a3ag7Vu?^vkr@1vpVYlSsolhcde}@MEhXZ( zd5}WB+i4cS{g>e&Pgw9mEj!}}Uz%ItE6MC$6bRK9CbaPnSh|;w{@_kdq)rG<{o#+cRG+SLp@w@1SQaKQWTQD*GJg0X@{Fh+X9xSF*1gQ@@EVzHK$aHgVwg&qVN;Nf5B$$f$!LnRnVY8cVHhi?| zj1NBh+!x0gr$eVcIa5MLW~w7IKKSHYXLP22h!5hqyRlhd`mlTMJ?Gr>@jD-X{QL70 z0R8w%L5ShiobCu=jcJxJyGjf8%EW>rv{?m>43R}`SxcCjHJ|Xg49!MCn-}RdS1^R8 z(hLX7mTnh{jwqEfby3(|FiKs03@zD!{S-rZ(69{mGTDyqlEm^1jYIaVXa>W}98G9e z(SQhtiZ+IZs8ndp8kQI>7iNSrq0N{SLVMQMH8Za{hP>C9jnX+oN6Q zCcN?{(&f21;fPtUq7tZ!9GCER9TzgYw}5241A`pz1oh6TNaBht;#C=CCXpda#d~!t{gnQ0D>b}dWJX4JljD74sp+UjIjvAM#R#>b z$#6Wn?{z>+GebT3Z95ckUJ(WUAlFND;-RDBQB+ev)F@hLuI zP)fp;CK!(Fb6Zo7<(sLx(;OORsPjx)Uy?)WWfW|B6||qR1#7z$X)oF<{w`8;cG=Oz4MQ%bNMNV*O1o6LjAaRD$ka+D zLF-AaFI$|X!EKD?AL8sREyRAB(j;ct0PYd}nq9=V z>=N#?LHt1UM|K4p>?*d|HT=oac*=(HH;V@le^x_$g*+UkiY9k(2O$Map}wcz>OTls X3I!3uT~Z0*9=;%|QgLYW<4fQ_Sq9?l diff --git a/RemoteControlClient/bin/ScreenPanel.class b/RemoteControlClient/bin/ScreenPanel.class deleted file mode 100644 index 4695086c069144419cdf993cc8491f0ebc65bf7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8666 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 E1`j1N#sB~S diff --git a/RemoteControlClient/pom.xml b/RemoteControlClient/pom.xml deleted file mode 100644 index 5b1b63c..0000000 --- a/RemoteControlClient/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - 4.0.0 - RemoteControlClient - RemoteControlClient - 0.0.1-SNAPSHOT - - src - - - res - - **/*.java - - - - - - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - - - - - - - - net.java.dev.jna - jna - 4.4.0 - - - - net.java.dev.jna - jna-platform - 4.4.0 - - - - org.xerial.snappy - snappy-java - 1.1.4-M3 - - - - \ No newline at end of file diff --git a/RemoteControlClient/res/exit.png b/RemoteControlClient/res/exit.png deleted file mode 100644 index 379c423b668045eee0213fa9808511b2b8e1f4b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1194 zcmX9+2~ZPf6y6l50tRRcrg9$vg0%LsGnNEsFySx+m=FZYPz4< zpixM&o9yO}h*Xg(0x2E{h^=I-5C@PHMLDa$fLdhx65h1A_rneSN*vM^Pw&1+W@L<#IU$8kI_^ zR1yk>RohCSRRBX#l}tvGB$NONAjrcU0}KQXwvCXnHrh1g0S2PiYJr|XrvnY^00?++ zFbrE=0R*4~0yB+9qY|ED+pY%3$`O@HrD`Qi#Q_fndTrL$1q@{}$N&JqGMNlC@Y7!=S09C62qt$41S}oAi>vRNM-wVIYo6B$7_Y0v0SgS|&(JMF#mjw@O;zwh?B!8!ZLD_es*18I^o zy!-!dxslqE)I&V+>+kXjrjY%;q-mPMC(UFj8OSBc5z?Oabz10MVc0BvmOFMfB!fbu z0v*TV_{>rSp}lAQD7_)`(FpR6R|1DE+>$(VW=iDDcJE5gK3{7vF!im?^pgCPNt2*l z&kN&zsdfqX+*O}ZBsej5j`_v2>{_vF)T=+{UqvS8jVz(3hs|a)PVe)1bggA3irU(N z$-Xa=e=_PgaH`}@dfqj<@}(lDk^Oni2JF~t{zAtO9>kHu!&5HfH}|&FJxBcx5PKTt zY1NlE{KBU@47Y8)C(o_vF?37vJ*vY!>SHQ({@G6>W9~>(-VbQ2@*fxTj_=Ifziqv} zDKVf}c8XWWVeEzoFQWhSI`=k3OENNhVwE;oYr(??kGHN ziR98+3$i$Y-eozR#sX%|uR88@?E=rVR7jWQbWC$4uj^>o%Q&~0F*h=y=}@}n2<02| ze#Ye%=T>a!X#B$=)pbjiA>X`>_2UKVN~l-Xf@rgx*}kJ>Ag%Z8qlQ$eh1ee{Pnv35~MJ@M4?OQCCZbD7xf6fx*8r_>Cbl&=Ccd>bUbZV+8 zoxM5TG>ZBzQ5)*36NPV(XS%%L%qYi!?z=

go>9hCMK@=|AxHh1zacc|i&MJ4gaI LiPIRf^QZp-RvlwW diff --git a/RemoteControlClient/res/minimize.png b/RemoteControlClient/res/minimize.png deleted file mode 100644 index 545edaed4ff71dfe1da952ebc72344a0ff453aea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^+CZ$s!OXzGxTmr44v@oG9OUlAuC&U#2A(ZYp`fz$#JSOf&~=dW0{Y|(-RE0-?^l8YAs9EBdSJzu+U5 Ylu)iI0_D$*fzDv?boFyt=akR{0QvZhtpET3 diff --git a/RemoteControlServer/.classpath b/RemoteControlServer/.classpath deleted file mode 100644 index 4a683fb..0000000 --- a/RemoteControlServer/.classpath +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RemoteControlServer/.gitignore b/RemoteControlServer/.gitignore deleted file mode 100644 index b83d222..0000000 --- a/RemoteControlServer/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/RemoteControlServer/.project b/RemoteControlServer/.project deleted file mode 100644 index 8a31b2a..0000000 --- a/RemoteControlServer/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - RemoteControlServer - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - - diff --git a/RemoteControlServer/.settings/org.eclipse.jdt.core.prefs b/RemoteControlServer/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index e24b722..0000000 --- a/RemoteControlServer/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/RemoteControlServer/.settings/org.eclipse.m2e.core.prefs b/RemoteControlServer/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/RemoteControlServer/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/RemoteControlServer/bin/DebugMessage.class b/RemoteControlServer/bin/DebugMessage.class deleted file mode 100644 index 463ba44d380c2347df6fddd686c1b3627ad30a1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 778 zcmZXS%TC)+5QhH=2~Ld31xQPwEqAcfifk%2saO=~Dzue?!lJ7a_sAUZ1vyUDK32OZ z5(^%n4^=V8F~t^}IhUFF=J$X6_uuUufOmLnphU2a*B7DJ z{XDvqZbF!SuR@g^5@u{?NGKmg-=v8d)GSmmOK9{}C_hbtk&Ms8$d`nLe&h;&C}O40 z*=0GoP-8;9pP$(yw60?nCizQ3+wMQ=7$jWa^_*c1Ei4*XD5xC#949icu!J@%j3z9& zJ#AJ|_lrhzzZ5~w#B;nbuuND?*~PSl6*LG&D#j0a7ffBzU-Lu@VL7kxS*wdZa&}&U03~$X6Fx{J@%WN0m@ue$uX)}#mkKG lDr0=e7#i^UdNY~(ma`~edD z0w00cAQp%<;+qg-C#V4-;tdj(e2+bzGk50t%zXX+=`(;ExTzpUn7LciOGO0dl_z5*lpoi!TZ>ltXh86_6d*j#$+zP9mB5W)Z~7yUen4tU(sC)Pl6vH{hCI2 z5NV5Dv&OYW%Y~2%V(VPQfbcp}d@dnM^s3&vU)kYmpH`>1vmA0GZ{6H(l=YzGf0Rn| z|4C(<2L5y^>83mMx^mkJ<#^AmG`pUZPV>3zZw2xuWOT=oUMO%mP_RKLL{P%$^cCa@ zt5e;%Z|gq^SGcpL5(3q8`|_$_i?9)az#8UOuQMpPPT2fA<=3N9P?}l>GYIKJ(Ivs1 zALn}pF)RlIfal*bQb@CHj-O-5Aj#HwEU;xUoQ}jRkjc_VEPVlez=`+#9>XbK7dRU5 zmKkrD|Bhn?UxE>O8fQX0i*q5K$AvMjjBz#eT?^NX$T6-VfpuI$fit?yxXE~xQDwY_ IB2Vhn5A#lqF#rGn diff --git a/RemoteControlServer/bin/JNAScreenShot.class b/RemoteControlServer/bin/JNAScreenShot.class deleted file mode 100644 index d7687124b2ab5c9ff41a61cc666e7a0f9efdd3fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5901 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 B)X@L{ diff --git a/RemoteControlServer/bin/NetworkScreenServer$CursorThread.class b/RemoteControlServer/bin/NetworkScreenServer$CursorThread.class deleted file mode 100644 index 3ab9d019de296d29fb9f2e192244d0bef81526c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 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 TMAhgy?BEVPP4Xs+QGNIa&aDVz diff --git a/RemoteControlServer/bin/NetworkScreenServer$KeyBoardThread.class b/RemoteControlServer/bin/NetworkScreenServer$KeyBoardThread.class deleted file mode 100644 index c889dd949adc23f3ef08b7b00223c19ba47c255b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmaJ>Sx*yD6#hzbxW#BpjETR;i04jO3K@NvnKS2}d(QWr?fajlRR9UxSKuKW9uoGGf;ExREg{T| zux5l68W6L+16$F&(Pp4ZGr@sgI{w;vnD&?!Pg+Qmtd4K5m{VRsXn z!mbvPEWy`T$cai2s#H|KAAlFtDiqWZykTjuJ8hU^XnJx?Si{;_UJ&Zi1zpQ$HOr9y z>q?&lLkPJA+QEmBd97(vK?6f~Xqm!}m#Ak7`h>6ps7Iqj(Zm45sYo_}eP~gzpRmV; zs)|+|AXI9)E{era;yfYl&N%HFE?Ek2P{kn}F7tDa(C+Rh@()K6cu2)j9OLXuI8!!5 z4wsud1e20bSVaWUt$1Br%7}ZsvT&vQk*tCfghq#tQHb|zww5xdrtOT)Ei)+EoIM)c}aS$d;j za{hALOG9YhOu~+;@nBTTfO7ORwr2CJQHsN|PEIMGvR0oM)TY*lE|4iqTe`Sr$gym4 zA=EA*5!94v3ac-#6^nw0v}XH$;lyqx2nTr;czHijFevu{OCEj{>|%YTv$s5sCJ>Fi zMIgEW^|fQOo8Nx60WBfOvMOZ+P>VYLa&k~p@<37c>to&X=oxXNJdP~l_%dRnCB?~kbS&U(IyR3Bms*1UmuQhgd^@Z2#eTUu(yh2+`P2pU>{Fgw5mLN)Eq6yh#Vq|flGxL%(nRLhQo@5Xs zZm78L8vXH)@02=BNtIRp`s0ruS}x_TrR7?DSY?&vebbYk9%+I}O}%&TyYJp}mv?V} z@Xx#N0cgP+3Q8C@^b32&FehShQwTjK%xPhU`czFHRCSRIMHK`XDo&`=Y9y)ZW08T8 z6C!RaSi-PA$5m(Sh?o|-9XSxUHAC;!EL-TpWLRR4YgQ;qHhLE|(ng~DG+ndzGt`Bz zAX`7o5a=)xq8tp%ITS1nq7*AR%2B~k8kPbpdo^A3rzS^)Ii!vx1;eUdBd#WgRa296 zo*9q;88$6$G883%E7hEHgTfp&%t?_Tr^3Cy{&&h)wABv>QG=@$Tt#tO)O(I=u#RD= z8jlOh3TZrG$rJ^g5^+=_YT#%@Q^9bwl_9d2;dI2B(WuaRhD6%# z(nK;r*0*81f(S#kw0@}sM-s4Pi=61zZ80WHj$PPI zS(s8yOAwD?O+LT5IOH|dcT1P{aJl-FWE#|=gPwn**)j`pG}JETuH zade`KVVNcD&V*(=r5Xqym8wFxg`*oiA)ztPe;DlsYNeGANoC@S{NGr=t5d|tkO%WcC3`bm6Z&0&hB1xUi0VOy_i=w$x zf*R-0ia_lN;<$7;S=1tj#!aE-eA77$OclInrsDU1-Sp~w9&Mo!Q)nkZRay>eSZlqd zc_^jlf|+YMwMcPHW5#20*JU5Nrw$y*q(Z?-hK+tuI#Q-(m*RDP&SKGGQ1CRJcNfm&?)Ejm(hMHb{U{E9FNK=P-fYxX$O(UnIL9y zM!^&Ll5~bxXF4vXb262ZmphTSKf)@aIo*-m)u^JCqKs-s3%iH_{ev|%ybYek+AP**uz3!F zd6!Y2!PYExWUN_@gAX%5a44};1i-hrJ?c}oqtaA>kI6|m*~M) zIE=5U*?j{W-_ra04lm$)yon$17JkJ0_z554XS(qV{=%D&c#*JilvR!^ILrRV=z8M4 oM7$Ebj8|w45c*Sim3DQsPg9F{jrOy&&e2*!>+7`23ZlP%0kB~8fdBvi diff --git a/RemoteControlServer/bin/NetworkScreenServer$MainPanel$2.class b/RemoteControlServer/bin/NetworkScreenServer$MainPanel$2.class deleted file mode 100644 index 2c5a2a918948580ea4785bc5b50f8bffead5cfb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1891 zcma)6|56)O6#fng-6p-2&}xgd1zMvf0h%TvqG_Xmpv45R!DzAmxY=CF!gkl$z5I9r zeFxv7GfEkq@d11w|EO9$H_0SK7wXRJ>^?1%dJprfjcsLX3ug$|T3)%Y^J-6dIzMM? z$M-5usFkMz!Wq5ggy{lfR89pcap-Nwb99+-BlDctY@HBa@S7?D!g&D;XOoCwNFad} zA(k-#LlwtUE4z;xDp;2dR}n5$d|SG8892u7IOB#O;ri*2=^_&xk}Yv-D%kXcN2bF&A%7b1K|b7fxY3r^)q!4el-p$Vo492mPq<{z{~IAtK#_1RRC=-L=yu8D znGI8gQA`WG)kk64$az~}7Vi+OJwtePlP~83k=jR561a^!Jr%`i!bG%+h#RtX3-9rP zh_a;He_YMCca&am{ZOrM1xhxPC}Ym_^gLlC8pwz%;{$<3)A)m-mVq{MKNR=~cY9n5 zoSDfJu4s|%=5u~mYu^<6V^l3vxRLtO-QE^hF}Y5fTze+d%ykrN0-yAO7L2zhu#QiU zQJEza{uh;dvg!C;KA#yrpK~Vq_#BHdU>gEo^nr14i97LXyCVOdQ|CoiG*k zYn@aio(tz|TG~5R`E6&UBy0X|V5=p^44sjPg5NX}c%CeJ2A3PXs`Qr6^F-YBcxo=V zG7J?Dr9^iI6E2_7BpBxz7~^*kluDUV$b)@=-vpBEJ;$qAwv8v5oA?PL_XICIZp926 zUu(yl{v8+C7JSBdFXBc15?;ck&Mi+FCC0w*b3Z~H;qno#9pcp=5P#ftWaEdJ>RN9e zvtmb>Il{ZYpnSix{{-(>Cl9gE4PS~KV!3Or^5LF!kF9!l@4m5&gcyv3B9jK5B85NL z{u5*P3sZQ868^?At68A|JfIl1DUJgg#CK%1q>i`cbfmH{JiwPMb{Ti@6~5-geAB|9 jVGfkM96$p$f8#vW=g{QU72X-)wo|+|c{5L$?M>hx!0GaU diff --git a/RemoteControlServer/bin/NetworkScreenServer$MainPanel.class b/RemoteControlServer/bin/NetworkScreenServer$MainPanel.class deleted file mode 100644 index 02fdbbdac9ee414e89dbbf495b453bec23597600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6733 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 CKTfv* diff --git a/RemoteControlServer/bin/NetworkScreenServer$ServerSocketCloseThread.class b/RemoteControlServer/bin/NetworkScreenServer$ServerSocketCloseThread.class deleted file mode 100644 index 0b7004338d4ee3982f3e8a01dcd9018d40d26734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmZ`%-EI~D~R$BaNt%~K(g0V%moo>T$gs>XIITcQF z^fYXvE4*^gcE$0DBlNa{5Fz$XKh+C8-RcxZQ9{@|G2P@7LcBVoT8RPAP0RFN5EAK` zh)k0ZD%))l1>uHeP2Dl2KMsZ@ z8N&9gM%N9-6obydQW3|Rf>pxGj5#zUaElPt4MVtYa(9oAzh<1OzavX{h3QR}RNTS3 zg1fw^nE(wNxJQVXuD|rQKlvNU>b`~t)6I+fGMd!z=t}fJc1USR%dO2BQaKe_JXVk+ zXfH);(5W$Zy(2ViBTrcBJErALCwz_mOMLjz5Pi?Itx~3`fF)k>bEaLWyq@F;#A?Jx zQ(sN-X6GB8ZggvUe=LyNum_GIj!Y?GV#cELvIX<4Se9_gJ>7K$3%WMF%BiEoCf`hu zFPdU8c{pqZ_@^Mk@u+|40Y9Q?pQj4G9=l_FW@;FN2%c1Fm-tfjSM#4q7@ zATEdl;>?di%%&C10d=LB)x3Q>^LAz*pYHAf>|@J8jqoMp@*+29QDT^N#HM1i{i|TJ zw>#0w!6IR0qAKNON}qbi@r0AoL7lLc3r~Vu=$W&4IJ9EgNXZbD&@7i$CAS?%|=5Tr*vl*#4W2qkGiONotNp1WW zY@P9CJpRoU>yqH~j*f;y`;umqPffx!n>{Z^SmNSea%`yo;tFEs6RP+qKkbcjy*N51<>YUkg&hd+~MQ0ay4iL+psVlF6Qa RocT}qEW6Dn{{x$K_ZjTQiK+kq diff --git a/RemoteControlServer/bin/NetworkScreenServer.class b/RemoteControlServer/bin/NetworkScreenServer.class deleted file mode 100644 index 083cad760bb2aa384cf6b4d7c2c2ee62f300a57b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10356 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 diff --git a/RemoteControlServer/bin/User32.class b/RemoteControlServer/bin/User32.class deleted file mode 100644 index 90b437763ba81f8b81956dcb4e72acae10c4e3f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 700 zcma)4O>fgc5Ph4LxJgYD0+eq`p;QS6EG4}Kfuf{?dijBO544~Ug^_RVPK?abT#_51q|0DIWAP+}+_rXuOIEvz!sr~HIFF;{P$ zU_2F(u~25%j`Yk)7s{C`?#yFuj&(9~PNnL!ouZgw&Go}!&+qRO^on4Y;FBnpN}8t( zE6vss!)jkoL1`M{Vlt}UsL~7wa!|wmF zTiE&c;})IJt7W~ELBp@mzL1HKX+WQ-M7Dw|Mb^oCMt-(x4fX~0H#B~NeZ}?96e{5+ q*-a`2&dB>j=!}X!VuSFlJR|#ow{a)OcXPXidvs>>+jxM7sQdxjajV<_ diff --git a/RemoteControlServer/bin/cursor.gif b/RemoteControlServer/bin/cursor.gif deleted file mode 100644 index 29007f638933b8a8390acd1811546a4ff9694fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11759 zcmY**o9BDq zXYX&X^>ZEf{qM}{l2ecs5;j2rP=IfE0Q;PW_?8DIhX;V{Du6GmdFnwvP?;?eUf29w;Xu0ARSqz{COI0l5D8;Ge$(Fdm#0 zWUIP`PNq5^jM-w%GZdmKYVA*YE<;D$9kzajPy1Xv^vyVua6#i*3rxqPMDpHdm@7EQ z)~!5^9A~oZ-Tv&J!Io9ES?}vm$b#i8Br;sP{^lInrPTZTfsD-w0~iv5<&5nIi?)M1 zhlWK&#iZ!P1t$PqEO2a6^WSQQqL-9_LtNYns%45oO3Nxf=H}J332I_t0ZTz3a6hm! z>4P>B#l_}Q0s_p;fJ#D#N5__#CY+~c=N6hGTl`n{8R1U-;2E^jv)=N-p`7G{AJpa{ z#{e|Uzkg>NL+2VT>*z84fZwma=>YNp-r-o)eDb`r=$P>V&+Na>(D0aaK1_#KS*uaO zHKRlN$a#V#1Al&h2dZ6R+cg!#eFFxWkbS+|PIU?3Sw;4F{b9<$hwO7QuNQx?dv zWx`UC5~KeY$0qh!5z~7Q?7F!ZKlJ20H~8xG50@9s%J!Jl3o1@R z`?=OVwkeJqdIK!J{I2CfPk3r(l*n@^Ua=l%b|%Zw$||N+AM&){`~%=Rw>0%e>)4Nc zV|%`-3ks;onb2*BOtsq7OYcjc8w3_82YgdKJ#68<{&NCQ+Puz z)hh>&+?X(3z%4`SwN_e=tt|7wyc;~^=Qchuj&WabjaE2qC}rh$HCO6@mkVLM*-7F& zAk7ec5us11>#^*vsTpQNeOA#3o<<(pp!60{97{JflI|ns-4h5*=1XHRgFGKOQPN?B zl@Z+aFNR?XuVQ_a&GdFM6F}cKu_zX+XGvcye3G9fgJp#Y0I;>aB}#&6f3=8%a@?*+ zdspVO<~iQBGv$Y3L9Ghx?{8@fBWmA*)UjDsX^IoVg{)JJyMgmg-@4L|Ug0ps&xrUt zV%ah+nV=|CO;jnjDyh6N?TQ+wGu7BzdqV77dDO@3u)K-qQy*ebzF;|<4jm3C#TDWK-S|e=r zJJVHRS$8&;)vE21USE6h+Dd$l@Xf-X4xE$)#oJ}?%(IbnXaw@<8!$h3Fc!92?&lM7xZ9=-F1gHQ zQjGcR@w_4M4JcGn5s56N%Ub_{&q2GL@cXUmVdk*ojqqWy>*o)fGy$mJhByeV_JiA0 zET5}vnmF%k!sCG`$K-E6!~)a*nvQ1)*f#S-h~>P;D^0YK0yM<-p0=AV7wB*|co

0j|@% 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 diff --git a/RemoteControlServer/pom.xml b/RemoteControlServer/pom.xml deleted file mode 100644 index 5c88dd5..0000000 --- a/RemoteControlServer/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - 4.0.0 - RemoteControlServer - RemoteControlServer - 0.0.1-SNAPSHOT - - src - - - res - - **/*.java - - - - - - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - - - - - - - - net.java.dev.jna - jna - 4.4.0 - - - - net.java.dev.jna - jna-platform - 4.4.0 - - - - org.xerial.snappy - snappy-java - 1.1.4-M3 - - - - \ No newline at end of file diff --git a/RemoteControlServer/res/cursor.gif b/RemoteControlServer/res/cursor.gif deleted file mode 100644 index 29007f638933b8a8390acd1811546a4ff9694fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11759 zcmY**o9BDq zXYX&X^>ZEf{qM}{l2ecs5;j2rP=IfE0Q;PW_?8DIhX;V{Du6GmdFnwvP?;?eUf29w;Xu0ARSqz{COI0l5D8;Ge$(Fdm#0 zWUIP`PNq5^jM-w%GZdmKYVA*YE<;D$9kzajPy1Xv^vyVua6#i*3rxqPMDpHdm@7EQ z)~!5^9A~oZ-Tv&J!Io9ES?}vm$b#i8Br;sP{^lInrPTZTfsD-w0~iv5<&5nIi?)M1 zhlWK&#iZ!P1t$PqEO2a6^WSQQqL-9_LtNYns%45oO3Nxf=H}J332I_t0ZTz3a6hm! z>4P>B#l_}Q0s_p;fJ#D#N5__#CY+~c=N6hGTl`n{8R1U-;2E^jv)=N-p`7G{AJpa{ z#{e|Uzkg>NL+2VT>*z84fZwma=>YNp-r-o)eDb`r=$P>V&+Na>(D0aaK1_#KS*uaO zHKRlN$a#V#1Al&h2dZ6R+cg!#eFFxWkbS+|PIU?3Sw;4F{b9<$hwO7QuNQx?dv zWx`UC5~KeY$0qh!5z~7Q?7F!ZKlJ20H~8xG50@9s%J!Jl3o1@R z`?=OVwkeJqdIK!J{I2CfPk3r(l*n@^Ua=l%b|%Zw$||N+AM&){`~%=Rw>0%e>)4Nc zV|%`-3ks;onb2*BOtsq7OYcjc8w3_82YgdKJ#68<{&NCQ+Puz z)hh>&+?X(3z%4`SwN_e=tt|7wyc;~^=Qchuj&WabjaE2qC}rh$HCO6@mkVLM*-7F& zAk7ec5us11>#^*vsTpQNeOA#3o<<(pp!60{97{JflI|ns-4h5*=1XHRgFGKOQPN?B zl@Z+aFNR?XuVQ_a&GdFM6F}cKu_zX+XGvcye3G9fgJp#Y0I;>aB}#&6f3=8%a@?*+ zdspVO<~iQBGv$Y3L9Ghx?{8@fBWmA*)UjDsX^IoVg{)JJyMgmg-@4L|Ug0ps&xrUt zV%ah+nV=|CO;jnjDyh6N?TQ+wGu7BzdqV77dDO@3u)K-qQy*ebzF;|<4jm3C#TDWK-S|e=r zJJVHRS$8&;)vE21USE6h+Dd$l@Xf-X4xE$)#oJ}?%(IbnXaw@<8!$h3Fc!92?&lM7xZ9=-F1gHQ zQjGcR@w_4M4JcGn5s56N%Ub_{&q2GL@cXUmVdk*ojqqWy>*o)fGy$mJhByeV_JiA0 zET5}vnmF%k!sCG`$K-E6!~)a*nvQ1)*f#S-h~>P;D^0YK0yM<-p0=AV7wB*|co
0j|@% z$U0xImw?8y;H!xgCqAssKLu49dMX+JV$_2wbSh&F9T2D^+P60$Wv4u$T zX`MrojHeQFq0PlP-w0_R?U|O-Yc;~A5)Q2vaSmDx5^GrN6C}C zllcnqqZ^3Kcu>e8(ltjbNky|)OrFs39V<0zjI#C89ABh7q;`Sdhu)ZhB3 znTe9;y=mg5V{g6M(k;d$b;b;!-_l*?^G54+2nLw|ydU1}(rp!Im7@`6tZ*5et)=%s z<|h-X^9i-Yw8R@@k|GY3%S41%^C}N`qoRq*{I|n-i1plZeoeB9DiuF-4mA}F=gngt zzKO>zEy|poD3GKWpAF>@a1ebzPd0--K0pM1AXv&Ue}=}-CC;)~K#yM`PkH@x|1V!U zg+IMw?d_KCm zOBN)E$9b(W&YSY_Ypg?t`70XH%H+qmRs`(?>0X&N*T>Y@GibdZe~pG|wQE?U%)-Bx zT-OrOQn(VT^m!M0gG8y+x>}7yG@*XrL_LgCzVn-CY&!nItTIvS**39p?t9az;#T{{ zi8ILNuUh;{6%}834ckhm%YOl*TKkK%2hw~#~VC8Les$YFr zs`YS+$q*1B1Kx{dmO#DVMzR4-{gCPU(3g`t1RsA5(gg587$;SL%D>vkRF^{}CU?m@ ze+@HiNebZKyQ2lxh&(6vXn+426(?wn592aDgwE*?HZR7+z_m+tV^D8n8Mud1V;?p2SJZSy_kpxIlkldMsPYC{WgMXX+cGpFK8gZSH6%AUKB z&#JQ6mb!>93Hm~j9_MBLax`#_tgnmgJOM&6HC_>+=O)JeqZ2YpVuSi!-l(w(94<60kUwn^OJ3 zx+Cn!knBbEaeTEcXXEgym1-W>ShfpW5T$FiK6mp82En6O^y&2jgbL}@GE4+FYbMR{BV*AALZjHN7SmEaTK1E(<-@ErYZB&Q!HZ9PTFi2Rh?=PlFNg0V zgt^7u+<$k}wr;xuX@STM!x%%U9lAeD4CL?8BI8_fKz{Zf%2m2r;cL2SWtI z=vTtLtPwC|m_mA305T{P5-uwQGSLl{841Pv6&`p_d25 zXI(T1Ya*SC4L^E38nfH6t7MTdlLx0OZJh#**Xh;ke%;0nGsmV+m&)sr$sQmW_?h_@l3ufikUg85_3BGAP>l2fG9GCpQyzlcvm2ZPfti@7R}ROZ(0^ylvfT#ueuFLCgPXbN!DFfylkRKaW6df*3SiYXPq*Maj~ zUO4Z-Ej}yc2I5WJXs&%?+bI~s@h^Jaz!*LH#sh^F+4s>uA>`!5U6W*WRqK2WQPtdkG=!m&ZnGpz=Z)7;449`Z_2l? zvq?LXHv1$7mKF4l@gvM}H*0mq>Ie5ho{Bshy;Wec-%ouAzl3>gqPO<^jo;spJgCs* zt^aCS?XvX%)6ul(e~Zf&A}&0I@w3esbDIPcL7K^(7Yx8a)8E|3RZ<(!bf%Qy0X@MxW~Cm(fw@P zJ9ha`%|jpQj3o{ zJc)uLKv{i7L{;?@F+f%fxU(cX&Z)AQx3vw~0R+}(^z{#L4ZSc1jgF1?dQbBT%u+0( zw!q!X-a*W(^qaF0aV16=sbMY&^M^C4cIOJ|$S_}VvV$)(t&BV>}PH2KkdRj0Ube(qi1BqU0bRh?4`-7us zUdyyMh8Y>rZ3%ny9RtWjp9ZC}LX#@ywbg-!#hx__lLT}7B!J&kvs+Nq-2hKk)M6nr zuBbn(Q5b#U+?xH(lNUGEn;cn1evU8hDv#CLB=Lil7M^eQ26-}Zo*T&X?e0y0CnSuW z%;|bmy53p#Jmf-F$}}DVyc;yJ$=fJPj6KLATAt_;Nm@s;V5^f!!Euf;as?b;K}>?{ zHRZPmA(oJtP^3HCVi-v-BO^StSsFvwcCc5oqM$4_Tz)MH&yl6{RsP+Dmz;I|wS6WH z+|*Ik4K~m8PxR`hBVoH`bA>>M7DkcCGt6xVDtK*z??isvr+NAFC`huaBaGRlxfTn1!5~TmtzW+fR zCBOsV{SVseQR18`|F;QZBumx$rwRI!ticNC^RB&EI)4yXoG9ztc))Nx00FXO<4cK7KN@-4L0q|)#+vD@5@b)fUQi=PQudnUFNwh1e zpiBKli*G2JpAnY_QKQ4+y}qaC_|o9#7(ro##Gl89t=|TPNJ8N-h>IzWuFeCO>FHYu zJqish4Ogak4aQFO(%_0lp+R+Y3t);S>8vgDkp9`Ybb+wh2rA3o_l^nhWOf$78VL;v zV;Xy%o0Q7uUm;IbE$jcs54+wO1+J-m;sV5Vtj2uRIq54dI=1+}@Utb{pj`S$EuAi} zG@RpSr9t-#hx6mCl&7^YhA0wQcU=z6;YJ9dE~Nm`Zodh8RSe#p>F0qg5!@bXZ4O4l zsvA>9ov3Wl`RZp2KNlHVQLE**Xq%zG8y(-U%FPWDO~MXH`Di14RtI0=If}+HbFs2D z*a$5U>ZG~+RrWlq>`Z&E*=0DisDqZww0O@zmb2 zeQ#b~5b0kJiH(8|u`$ZvCo+R#rCUo)OfcKa_7jy!M)SyJcD;)+wFPVrQut*-7Rj?J zW5$WPp-1Lk44TX_j>j3OT=Vo>=MR}2;*4Y;tUAce1Mgqm(2)A|ObOhughn`<{Ar&Al{F~`(I2j|po+4ddK;#q z%1pGXnpBEwF6)dG{;t|@3_`GpibzS!+achj4@)*@lV9=*8 zFo)L9o>g`&n*;R@NX}>_N4~P`6OI?h9epyLCp|cISd-JZlHEU9Oe}kD&L=Lw_xGHa zeGnW4XIU`N-gyA;<>}=h(G2-j9vW+O*)XnJ_0x+)VweBJMxGqsG$}w6pvAw z*E|Jp8^=CK76q|;bjAaEw(C-qeuNIHxi0vTM=d%d`kY64b{0j*dmS!rRnXyZcWWEi zYecZGS2!PlBGL_%oNPvE6icm#iDs0Tj|lKo&xB^@0tyO>io;43$&6AE;76qc*TPoG81}BF{V>(qUTqCIvDJvs$R18gtPp8+*EEf^mk!!m&#)}Y)iwms5 z;pnu?Q~3EM#`VDW(2`ak(tJY0UgI`$v}SO4K?nxXjlw?o6vo7(8+qxXi)IRs`2BFF zry0x}DJ!OpfrJFJsGLQy8<3U@>iMfXfW$RU)5`F;YE7QSBp61Ypq=QCH-A+yw*rZ zRzU~bHDNeK`ep>#@5aAb9QE68USDEEJatV?wWB(P1E?=U=SHCES2ADI?adT=gK2K@ zSemU(i-B1ngs(0cKb7moc&pD(R-@L?7EjIQO|6mUwjP$^ieCeJnOf`=Q-5f!utgf} zsJ`Tr*8|_mEBONd;{F_Vl#GZ$y8VQDe-l&9*$x= zExMM-*q)#^u}}t&L5%xI0@+X+vxR0Y87T9~B?WWVhYn%tY^LNRmRycQVI3Af$%KCG z-XSL3{2)(WW2PRajetEPVae(kJAX9QYXl_s8e+SXne#aTEUn^oDlFv59JmdE~k_2a<6gyjDM6E%Pm zVE!Lf1cJ$lHN?*e1qj`KCIj{A&5mz(sg2Z~+Q`Jd-?e8E@5 zWUSKtFqd%#Z+%w>dCHcBKh$t%`n<^J#9RNeXJi!7Z=&kH(dqNi;U5bLcLzmU)4mBY zA_*Y(Ne*`a(Q;zOF#r-E$w6+88JyWhXhngtLQS3N()*y51Py-nill7G*4(} z7Zv9-kOjB^NF5a!JWMzGYvr>AZb1{L!(2pM+4E@N1cBR}541Iyie>dS*Jf=DzjOcx zLQ8>p!?l{7l;`=~q$7o7eH@3?@5%LYk?oDzKG9Oj4|wmJna*xm3?D=%wWJ96?>t^g zS@4Vz<-;Dd-sXPP35^4WoZ2qmX?jknsey)<5y*52NN`zGT_F_ z1jm<+=)`y%RmdaYD-jc)OK-ywr+p{k5o=j#1I|`GJ}M&{Lgc;7xl`aECA@$4nbS(! zS38RNAdRHDuf|u}?tU>d3}k$aQyp|b&w5HQq~U6hU6k6y6@WE$e`o)+^8NN{Gt;E| zvsNRv)@N|^g*CdJ2@V+~!&#}qt7&&rAP;{W_yPiAz22Iw^7p4;w z@H!X`?i&&sCae!ZIEBQSp{J*V?CBCx;?$!Qc!~l{=MaQK@i6K~hUe15Z;% zOHvy$2hAY^I8;6|QZ<$Z7_YAHr6(Ck9|E$13M!pu`xelbmRAd5pJ|gLsjx6kPO#3G zhSR~oCJ-f4&ulE@`1JnrdpYrfdz@sC(eLNqzqJu;SKDGtJW=??nSkN5EyyDc;K>C@ z{(49iZ-M}x@)A&qg8rb)3*!@i8~3>4K{BZye=r28g`SG-y04Z}r&9ua?=cj` zt(A&rklpW>l5F1Dk&_(YkuR}nex&k?#Oz>EW& ztVMK89~sBOGW<5CAk+oH9lSq|RZrJXiPJj;L(aU2CCgjB+eZ4evDlSuFXNL!0*Lri>ak+FOBH9l8gW zZYGSS0D>ROTF@DRJ$g<*`=wCdrBiLZj|6vKSlkzSKgq;Bnc1fKHasqeiKz$5(t{^q zzhXU}+8*{th-XU-#YFit&v=W)>d<-=Upj~367R|f6D^#r>?Q67(__SFbD0z;$Zxjp zr>Mw2HK%*Izk(u?p1s;mH&0a;THwNPRT*ZY#?oO_#tV_O?h04OE)i_E@8L9chT@2@b{4 zy0BMN*3EHiKPC89B*8VH&z`vG&7Ky3VkB#Flq248ttfgLU(S9lmi44S9mSqYnT zzHuj<`}>cQedu=ey8YkhLoPd?KYKKqVR+aL7NmPwPQ&!cp)O#kQ4jMjF+O@RXpz$fCfQbzN z++k702llL^=HSAb^bgrQnQV->*#QttKz3haNuTXk@o1*o{^ITsO8sNMv58FOOpfvF zQ&ancq#`-iL&jeUKoQ(qSR@3RUyf0%%bULI_SP1+Qd`CpU(2Lwq1F(gabT{*9E#zb zL_lO6%?|LTwJddLCKq1^I_PI_bcTK2ckY5Qy-8Oe=+r}l5|^!wQ?+kb&3(CY0&%KU-}0jxNI#{GXDEypLVh) zYQDPtCjNUv`S7-r*wavA7!9)RPe%P!Iq1*9bpniu3oFqnrsN5sfA`|v2QSEH!2*eP z;uQ+1su*N+*iFPCT?CViN1@nhx@k<9W&-1s>|(uJP>8h!kroruWqCYG5`S2N-C^u2 zT8JT8ga#+Ea9c5}3ZK_R5=CmNIgIN)(opo$216J7#D`vkN!asOK?o&8svk^M2sTxS zY>rS&Hyz2C$fjMqRj0Mz)s5q$-aIN(q<(SCX7GYGqcoGi5G|&_>G|Tj{0FgP8;cJ4 zN^7n()A5buEYI!fvbc`$O+#W~*=fIQKWnLX&#lR2tD%Vt5j8Ki*Wk7Kmyx^GsOAy! zm`TBt(}$)30;N;7q{LB@a=OUSExc!`!f37j4!9d}OTH6(8lZiM162w+Z%sTgEo6@V z?C0fqKz^lA1=WwWEM1BVZ1Hq4EJ+2F*E>Mh0j3xO+jC+ZT$scl-fONw9;2a;6CFq2 zMG-vNl*oowUUGHYa0_^5^|0(VpG#nM!)L?<-XK>K(RH=&^BP`Y$QlvEZaX%WWGh>0 zHmX*-X^u~`SzX$E15~%; z7NBiTqmIYxGnVryc$4W+g>CE7lIScW5STk48$xA>zRUa>AGsV&@*2J;JF{Kf0LtEvjH1Qe?XP7tc@Qu)N z-!!T&$Qfb$L*P)1fNusd2Hd%lhP3%65P7ri8{kaoRFI8Khg2X;j?8rhr)G)l1*?tE z+{49af6j*apzRWd2r=Q}@P^AN8!KFDt(BRc&90#i(|+>kQ~uvH=zkNU zd_?NM{d27Ok(TBEPl$dqjBEt6a{nR3G5hy0i8A-h2#q=wPR|Ky*WPE(ysJr*X2!&~ z&15^JY=3?<)Sx&A^o=N8L@n9{z}aC4gafq;xsNY2JXBHJ3zIS$mX;Qy75^^LE5#?h zFcT7&E#n7`uBtA!FD+B>VN7apZ(?X^H3z_aK0`}nDpCEFbGt|TyY`nv&mOZ#iI&)t#h9V zu=g}E?nhuJd>@RTfq^`Jb{&`vJDCm<&pn7?3~dwak3L}#jqZ9&vNlFBk*mcZo&-S0 zhH|_oAv=^FPa`*F+~;9HwB;1S)`&O?*+Pp7yg9TqlD?=oW4@5>E>@aeq|kDxoPeI@ zm)ElPI9|uANv%}5A75dkjHF=1#%y2@P`)PQn zaa?wDqm(j^>>Oy(GqELss+Z*QNL(r%%zD4}19%?y8y$QVQLZ3oOud>OL`6y=K|Ses zt%7K?!{;;2Ci0Gjsx>wAAR=xzi9`788E{GvL%ql zp7`fi#ysEUbyK83m9jc;%0#W*5SshZ$(O*Ir^^v+rW$X~ zWGve=rTv>Y^XkT0GvT%5b?TTT`U>f^nCdwe+;G0U+{^;=L+J|U=8*iX5ZT?2Ep)@g zq7Uh&rX!_sx&>o%nUrD`R<`4(f+cpiE5HyNoiF8I2|p0bj~DtYW-#RY;43o5Kli)A zEb6IfqbXLCe@|axGDPy#BDOUVEvdY8jVZ9y6T=Wx#G-wiLs4$aS-EOWiTk1<7xQb8 z_XfwQSo^Nca(wk!#cAWD;P3qhfo$rNa^GGNyR()FN!*C$UJYEV)@?YhRG~f|C97%l zt_`Byw6L?hW6iM7vD2jVB&_6RAKb=tbXyeB6Mfwo)%(!ekK>7_VM@@hRDW$z^lYFL zG3dy`#Y!5K0)j^-*xbMx6G2|1C&g|~9gek}e&h>Ox<=!FS*G|v#9v|M9imPOcv z1XpF!V_J!A>-=&09mAk)VWNG{8YZr$&(Jngj=SZE{F>U~8+LV?(OX;)N0MFoKjd+{ z&v|=3VaE1`C+;VKmq@RkE`Nx<#p=bo7e4$H{@NF-ph{e5O;*&q1FL4?@0}f}s{P=U z?#~zD^9a-!;YIsNkI-fJZ`y%l^Ee-&D*^hzhK*?@yjS0*-aXX)Ffxma{<-IR;q;yT zo2{7h<{(Fx+X{a+`Hg=QciV5sDY@`(_0v+GyS0z54|kVUo4rR5{Aj;+S>D`Z@~{z4 zWdHuf^BQx2n+eE7g+a(Bj&nZ^9~|616Yv(pA7F$x0e4QM!v$RvoZVUfe8AytldNMX z43YcD02URJ`m;1k{8GS}faXx*Ss#(hoA3HWKLm%`$#@;*lIbx$bwil>c)3-Z{~rrJ z#x=^v2F3Qj4GKyxvg5yVfykwQ;+m}%XN@yg*_r(oQsb*%U}{=~6C0@|i@ZV=3B8D# ztTIVEmq6ai%J-Br+qTVm+mB>fZ(z;7`02S@6s@1}-%NZ(`3l8vVqt*196tD}`T+u9 zaP<&r8xS-Ql$31i9wUYbj|dEeBhrO4sdIAjf(!VwaBNBf!S(gYO+ohM6+AV8G_^S` zsclI14)m_>NW16(0n9iW;Os28r`L9ZN1S$Uu6C(vnQe7u9k^k?t+qe6(7pNTkoS0g z^xXfF0n`b-2A+QLx)DAjQz^+dbh@i5}+(nEu>DID#75lIh;kUntI z!a^IE;7KQ@wivq8q)UO6(;Xqb1%3-u3*>`y$OlLIY zLYGFuR(xwFG4%MI;s;;y%R5g7&A`GO>dg!Bl10_L^Q13vB(;%$jw@IOMLa{>2l6M9 zR9Sr12v%Iw1@bix>INjVJG0qd2npcT%dUKrJT=n6+)Ox)EgiT^y34DO)p>B#K9s`? z9GsNfVthj;Btv%EuCW4k_5-h{PeP3_w$Jk`yW zoOdw2qmndX^VPl7c8}YGj66Jb9jFY;k)}9%wQ!EF>^+7RUTb{&U{3o!<$;`EuCY$o zI3^UGief~5BtDe3pA9SO^%`41qAl4`v9%^Nj6Qw5jGZ&vlLMXVsiiZuRbk;Q(Tj*u z-+{_R^O5GZ{ZcT~Sl)4T3k&^OVBVVhq!|`#Y8b)GG^d4F8I<@ZHI++DF<4=sbUy=Q>f`bqL2D?{ry=y6E{cf^v#o pMYpf%`E-8!IE7=WcJ95|<=pN;=YDKZ<^=!L4j&j|KaRdd{}0ih9bEtb diff --git a/ScreenCaptureSample/ScreenCaptureSample.iml b/ScreenCaptureSample/ScreenCaptureSample.iml new file mode 100644 index 0000000..787555e --- /dev/null +++ b/ScreenCaptureSample/ScreenCaptureSample.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ScreenCaptureSample/pom.xml b/ScreenCaptureSample/pom.xml new file mode 100644 index 0000000..30df3c3 --- /dev/null +++ b/ScreenCaptureSample/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + groupId + ScreenCaptureSample + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + net.java.dev.jna + jna + 4.1.0 + + + + net.java.dev.jna + jna-platform + 4.1.0 + + + + org.xerial.snappy + snappy-java + 1.1.4 + + + + + \ No newline at end of file diff --git a/ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot.java b/ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot.java new file mode 100644 index 0000000..da581d0 --- /dev/null +++ b/ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot.java @@ -0,0 +1,177 @@ +package dydtjr1128; + +import com.sun.jna.Native; +import com.sun.jna.platform.win32.WinDef.HBITMAP; +import com.sun.jna.platform.win32.WinDef.HDC; +import com.sun.jna.platform.win32.WinDef.HWND; +import com.sun.jna.platform.win32.WinGDI.BITMAPINFO; +import com.sun.jna.platform.win32.WinGDI.BITMAPINFOHEADER; +import com.sun.jna.platform.win32.WinNT.HANDLE; +import com.sun.jna.win32.W32APIOptions; + +import java.awt.*; +import java.awt.image.*; + +public class JNAScreenShot { + + public static BufferedImage getScreenshot(Rectangle bounds) { + + HDC windowDC = GDI.GetDC(USER.GetDesktopWindow()); + HBITMAP outputBitmap = GDI.CreateCompatibleBitmap(windowDC, bounds.width, bounds.height); + try { + HDC blitDC = GDI.CreateCompatibleDC(windowDC); + try { + HANDLE oldBitmap = GDI.SelectObject(blitDC, outputBitmap); + try { + GDI.BitBlt(blitDC, 0, 0, bounds.width, bounds.height, windowDC, bounds.x, bounds.y, GDI32.SRCCOPY); + //SRCCOPY�� �����׸� �״�� �����ؿ��� �� ���� + } finally { + GDI.SelectObject(blitDC, oldBitmap); + } + BITMAPINFO bi = new BITMAPINFO(40); + bi.bmiHeader.biSize = 40; + + + boolean ok = GDI.GetDIBits(blitDC, outputBitmap, 0, bounds.height, (byte[]) null, bi, 0x00); + + + if (ok) { + System.out.println("11111"); + BITMAPINFOHEADER bih = bi.bmiHeader; + System.out.println("22222"); + bih.biHeight = -Math.abs(bih.biHeight); + System.out.println("33333"); + bi.bmiHeader.biCompression = 0; + return bufferedImageFromBitmap(blitDC, outputBitmap, bi); + } else { + return null; + } + } finally { + GDI.DeleteObject(blitDC); + } + } finally { + GDI.DeleteObject(outputBitmap); + } + } + HBITMAP ScreenCapture(HWND hWnd) + { + int ScreenWidth = 1920; + int ScreenHeight = 1080; + HDC hScrDC, hMemDC; + HBITMAP hBitmap; + + HDC windowDC = GDI.GetDC(USER.GetDesktopWindow()); + hMemDC = GDI.CreateCompatibleDC(windowDC); + hBitmap = GDI.CreateCompatibleBitmap(windowDC, ScreenWidth, ScreenHeight); + GDI.SelectObject(hMemDC, hBitmap); + + GDI.BitBlt(hMemDC, 0, 0, ScreenWidth, ScreenHeight, windowDC, 0, 0, GDI.SRCCOPY); + + GDI.DeleteDC(hMemDC); + GDI.DeleteDC(windowDC); + return hBitmap; + } + + private static BufferedImage bufferedImageFromBitmap(HDC blitDC, HBITMAP outputBitmap, BITMAPINFO bi) { + BITMAPINFOHEADER bih = bi.bmiHeader; + int height = Math.abs(bih.biHeight); + final ColorModel cm; + final DataBuffer buffer; + final WritableRaster raster; + int strideBits = (bih.biWidth * bih.biBitCount); + int strideBytesAligned = (((strideBits - 1) | 0x1F) + 1) >> 3;//8������ + final int strideElementsAligned; + System.out.println(strideBits + " " + strideBytesAligned + " " + bih.biBitCount); + bi.bmiHeader.biPlanes=1; + bi.bmiHeader.biBitCount=24; + bi.bmiHeader.biSizeImage = ( ( bi.bmiHeader.biWidth * bi.bmiHeader.biBitCount + 31 ) & ~31 ) / 8 * bi.bmiHeader.biHeight; + bi.bmiHeader.biCompression = 0; + switch (bih.biBitCount) { + case 16: + strideElementsAligned = strideBytesAligned / 2; + cm = new DirectColorModel(16, 0x7C00, 0x3E0, 0x1F); + buffer = new DataBufferUShort(strideElementsAligned * height); + raster = Raster.createPackedRaster(buffer, bih.biWidth, height, strideElementsAligned, + ((DirectColorModel) cm).getMasks(), null); + break; + case 24: + strideElementsAligned = strideBytesAligned/3 ; + //image.setData(Raster.createRaster(screenImage.getSampleModel(), + //new DataBufferByte(imageByte, imageByte.length), new Point())); + System.out.println("-------------------------"); + cm = new DirectColorModel(24, 0xFF0000, 0xFF00, 0xFF); + buffer = new DataBufferByte(strideElementsAligned * height);//DataBufferInt(strideElementsAligned * height); + System.out.println(bih.biWidth + " " + bih.biHeight + " " + strideElementsAligned); + raster = Raster.createPackedRaster(buffer, bih.biWidth, height, strideElementsAligned, + ((DirectColorModel) cm).getMasks(), null); + System.out.println("rrrrrrrrrrrrrrrrrrrrrrrrrrr"); + break; + case 32: + strideElementsAligned = strideBytesAligned/4 ; + //image.setData(Raster.createRaster(screenImage.getSampleModel(), + //new DataBufferByte(imageByte, imageByte.length), new Point())); + cm = new DirectColorModel(32, 0x00FF0000, 0x0000FF00, 0x000000FF); + buffer = new DataBufferInt(strideElementsAligned * height); + System.out.println(bih.biWidth + " " + bih.biHeight + " " + strideElementsAligned); + raster = Raster.createPackedRaster(buffer, bih.biWidth, height, strideElementsAligned, + ((DirectColorModel) cm).getMasks(), null); + break; + default: + throw new IllegalArgumentException("Unsupported bit count: " + bih.biBitCount); + } + boolean ok; + System.out.println(buffer.getDataType()); + switch (buffer.getDataType()) { + case DataBuffer.TYPE_BYTE: { + byte[] pixels = ((DataBufferByte) buffer).getData(); + ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); + break; + } + case DataBuffer.TYPE_INT: { + int[] pixels = ((DataBufferInt) buffer).getData(); + ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); + } + break; + case DataBuffer.TYPE_USHORT: { + short[] pixels = ((DataBufferUShort) buffer).getData(); + ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); + } + break; + default: + throw new AssertionError("Unexpected buffer element type: " + buffer.getDataType()); + } + if (ok) { + return new BufferedImage(cm, raster, false, null); + } else { + return null; + } + } + + private static final User32 USER = User32.INSTANCE; + + private static final GDI32 GDI = GDI32.INSTANCE; + +} + +interface GDI32 extends com.sun.jna.platform.win32.GDI32 { + GDI32 INSTANCE = (GDI32) Native.loadLibrary(GDI32.class); + + boolean BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, + int dwRop); + + HDC GetDC(HWND hWnd); + + boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, byte[] pixels, BITMAPINFO bi, int usage); + + boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, short[] pixels, BITMAPINFO bi, int usage); + + boolean GetDIBits(HDC dc, HBITMAP bmp, int startScan, int scanLines, int[] pixels, BITMAPINFO bi, int usage); + + int SRCCOPY = 0xCC0020; +} + +interface User32 extends com.sun.jna.platform.win32.User32 { + User32 INSTANCE = (User32) Native.loadLibrary(User32.class, W32APIOptions.UNICODE_OPTIONS); + + HWND GetDesktopWindow(); +} \ No newline at end of file diff --git a/ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot2.java b/ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot2.java new file mode 100644 index 0000000..de4a4df --- /dev/null +++ b/ScreenCaptureSample/src/main/java/dydtjr1128/JNAScreenShot2.java @@ -0,0 +1,120 @@ +package dydtjr1128; + +import com.sun.jna.platform.win32.WinDef.HBITMAP; +import com.sun.jna.platform.win32.WinDef.HDC; +import com.sun.jna.platform.win32.WinGDI.BITMAPINFO; +import com.sun.jna.platform.win32.WinGDI.BITMAPINFOHEADER; +import com.sun.jna.platform.win32.WinNT.HANDLE; + +import java.awt.*; +import java.awt.image.*; + +public class JNAScreenShot2 { + + public static BufferedImage getScreenshot(Rectangle bounds) { + + HDC windowDC = GDI.GetDC(USER.GetDesktopWindow()); + HBITMAP outputBitmap = + GDI.CreateCompatibleBitmap(windowDC, + bounds.width, bounds.height); + try { + HDC blitDC = GDI.CreateCompatibleDC(windowDC); + try { + HANDLE oldBitmap = + GDI.SelectObject(blitDC, outputBitmap); + try { + GDI.BitBlt(blitDC, + 0, 0, bounds.width, bounds.height, + windowDC, + bounds.x, bounds.y, + GDI32.SRCCOPY); + } finally { + GDI.SelectObject(blitDC, oldBitmap); + } + BITMAPINFO bi = new BITMAPINFO(40); + bi.bmiHeader.biSize = 40; + boolean ok = + GDI.GetDIBits(blitDC, outputBitmap, 0, bounds.height, + (byte[]) null, bi, 0); + if (ok) { + BITMAPINFOHEADER bih = bi.bmiHeader; + bih.biHeight = -Math.abs(bih.biHeight); + bi.bmiHeader.biCompression = 0; + return bufferedImageFromBitmap(blitDC, outputBitmap, bi); + } else { + return null; + } + } finally { + GDI.DeleteObject(blitDC); + } + } finally { + GDI.DeleteObject(outputBitmap); + } + } + + private static BufferedImage bufferedImageFromBitmap(HDC blitDC, HBITMAP outputBitmap, BITMAPINFO bi) { + BITMAPINFOHEADER bih = bi.bmiHeader; + int height = Math.abs(bih.biHeight); + final ColorModel cm; + final DataBuffer buffer; + final WritableRaster raster; + int strideBits = + (bih.biWidth * bih.biBitCount); + int strideBytesAligned = + (((strideBits - 1) | 0x1F) + 1) >> 3; + final int strideElementsAligned; + switch (bih.biBitCount) { + case 16: + strideElementsAligned = strideBytesAligned / 2; + cm = new DirectColorModel(16, 0x7C00, 0x3E0, 0x1F); + buffer = + new DataBufferUShort(strideElementsAligned * height); + raster = + Raster.createPackedRaster(buffer, + bih.biWidth, height, + strideElementsAligned, + ((DirectColorModel) cm).getMasks(), + null); + break; + case 32: + strideElementsAligned = strideBytesAligned / 4; + cm = new DirectColorModel(32, 0xFF0000, 0xFF00, 0xFF); + buffer = + new DataBufferInt(strideElementsAligned * height); + raster = + Raster.createPackedRaster(buffer, + bih.biWidth, height, + strideElementsAligned, + ((DirectColorModel) cm).getMasks(), + null); + break; + default: + throw new IllegalArgumentException("Unsupported bit count: " + bih.biBitCount); + } + final boolean ok; + switch (buffer.getDataType()) { + case DataBuffer.TYPE_INT: { + int[] pixels = ((DataBufferInt) buffer).getData(); + ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); + } + break; + case DataBuffer.TYPE_USHORT: { + short[] pixels = ((DataBufferUShort) buffer).getData(); + ok = GDI.GetDIBits(blitDC, outputBitmap, 0, raster.getHeight(), pixels, bi, 0); + } + break; + default: + throw new AssertionError("Unexpected buffer element type: " + buffer.getDataType()); + } + if (ok) { + return new BufferedImage(cm, raster, false, null); + } else { + return null; + } + } + + private static final User32 USER = User32.INSTANCE; + + private static final GDI32 GDI = GDI32.INSTANCE; + +} diff --git a/ScreenCaptureSample/src/main/java/dydtjr1128/ScreenCapture.java b/ScreenCaptureSample/src/main/java/dydtjr1128/ScreenCapture.java new file mode 100644 index 0000000..c8ccf8b --- /dev/null +++ b/ScreenCaptureSample/src/main/java/dydtjr1128/ScreenCapture.java @@ -0,0 +1,270 @@ +package dydtjr1128; + +import com.sun.image.codec.jpeg.JPEGCodec; +import com.sun.image.codec.jpeg.JPEGImageDecoder; +import com.sun.image.codec.jpeg.JPEGImageEncoder; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.SynchronousQueue; + + +public class ScreenCapture extends JFrame { + private JLabel FPSlabel; + private int FPScount = 0; + private int screenWidth, screenHeight; + int buffersize = 1; + byte imgbyte[][] = new byte[buffersize][]; + SynchronousQueue imageBlockingQueue2 = new SynchronousQueue<>(); + BlockingQueue imageBlockingQueue = new ArrayBlockingQueue<>(3); + + public ScreenCapture() { + setTitle("screen"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setLayout(null); + //this.setAlwaysOnTop(true); + ScreenPanel sp = new ScreenPanel(); + setContentPane(sp); + setSize(800, 800); + setVisible(true); + + Thread th = new Thread(sp); + th.start(); + FPSCheckThread fps = new FPSCheckThread(); + fps.start(); + } + + class ScreenPanel extends JPanel implements Runnable { + BufferedImage image; + int screenWidth, screenHeight; + Robot robot = null; + + public ScreenPanel() { + screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width; + screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height; + FPSlabel = new JLabel("FPS : " + Integer.toString(FPScount)); + FPSlabel.setFont(new Font("�������", Font.BOLD, 20)); + FPSlabel.setBounds(10, 10, 100, 50); + add(FPSlabel); + addMouseListener(new MouseListener() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 1 && e.getButton() == e.BUTTON3) { + //System.out.println("4444"); + robot.mouseMove(e.getX() * screenWidth / getWidth(), e.getY() * screenHeight / getHeight()); + robot.mousePress(MouseEvent.BUTTON3_MASK); + robot.mouseRelease(MouseEvent.BUTTON3_MASK); + } else if (e.getClickCount() == 2) { + //mx : wx = getwidth : winwidth + robot.mouseMove(e.getX() * screenWidth / getWidth(), e.getY() * screenHeight / getHeight()); + robot.mousePress(MouseEvent.BUTTON1_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_MASK); + robot.mousePress(MouseEvent.BUTTON1_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_MASK); + } + } + + public void mousePressed(MouseEvent e) { + + } + + public void mouseReleased(MouseEvent e) { + + } + + public void mouseEntered(MouseEvent e) { + + } + + public void mouseExited(MouseEvent e) { + + } + }); + try { + robot = new Robot(); + } catch (AWTException e) { + e.printStackTrace(); + } + screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width; + screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height; + image = robot.createScreenCapture(new Rectangle(0, 0, screenWidth, screenHeight)); + + repaint(); + } + + @Override + protected void paintComponent(Graphics g) { + + super.paintComponent(g); + try { + FPScount++; + BufferedImage ii = toBufferedImage(imageBlockingQueue2.take()); + g.drawImage(ii, 0, 0, getWidth(), getHeight(), this); + //byte[] imageBytes = ((DataBufferByte) ii.getData().getDataBuffer()).getData(); + //System.out.println(imageBytes.length); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + /*private BufferedImage screenShot(){ + //Creating an rbg array of total pixels + int[] pixels = new int[screenWidth * screenHeight]; + int bindex; + // allocate space for RBG pixels + ByteBuffer fb = ByteBuffer.allocateDirect(screenWidth * screenHeight * 3); + + // grab a copy of the current frame contents as RGB + GL11.glReadPixels(0, 0, screenWidth, screenHeight, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, fb); + + BufferedImage imageIn = new BufferedImage(screenWidth, screenHeight,BufferedImage.TYPE_INT_RGB); + // convert RGB data in ByteBuffer to integer array + for (int i=0; i < pixels.length; i++) { + bindex = i * 3; + pixels[i] = + ((fb.get(bindex) << 16)) + + ((fb.get(bindex+1) << 8)) + + ((fb.get(bindex+2) << 0)); + } + //Allocate colored pixel to buffered Image + imageIn.setRGB(0, 0, screenWidth, screenHeight, pixels, 0 , screenWidth); + + //Creating the transformation direction (horizontal) + AffineTransform at = AffineTransform.getScaleInstance(1, -1); + at.translate(0, -imageIn.getHeight(null)); + + //Applying transformation + AffineTransformOp opRotated = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); + BufferedImage imageOut = opRotated.filter(imageIn, null); + return imageOut; + }*/ + public void run() { + Rectangle rect = new Rectangle(0, 0, screenWidth, screenHeight); + double avg = 0; + int count = 0; + while (true) { + try { + + long s = System.currentTimeMillis(); + //image = JNAScreenShot2.getScreenshot(rect); + image = robot.createScreenCapture(rect); + //image = getScaledImage(image, 1920, 1080); + + //9~11frame + imageBlockingQueue2.add(toByteArray(image)); + avg += 1/((System.currentTimeMillis() - s) / (double) 1000); + System.out.println(imageBlockingQueue2.size() + " " + avg / count++); + repaint(); + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + public byte[] toByteArray(BufferedImage image) throws IOException {//ImageIO보다 빠름 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos); + encoder.encode(image); + return baos.toByteArray(); + } + + public BufferedImage toBufferedImage(byte[] image) throws IOException {//ImageIO보다 빠름 + ByteArrayInputStream bais = new ByteArrayInputStream(image); + JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(bais); + + return decoder.decodeAsBufferedImage(); + } + + public BufferedImage getScaledImage(BufferedImage myImage, int screenWidth, int screenHeight) { + BufferedImage background = new BufferedImage(screenWidth, screenHeight, BufferedImage.TYPE_INT_RGB); + Graphics2D g = background.createGraphics(); + //g.setColor(Color.WHITE); + g.drawImage(myImage, 0, 0, screenWidth, screenHeight, null); + g.dispose(); + return background; + } + + /*class ImgDoubleBufferTh extends Thread { + BufferedImage bufferimage; + + public void run() { + int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width; + int screennHeight = Toolkit.getDefaultToolkit().getScreenSize().height; + BufferedImage screenImage; + Robot robot = null; + try { + robot = new Robot(); + } catch (AWTException e) { + } + + Rectangle rect = new Rectangle(0, 0, screenWidth, screennHeight); + int ff = 1; + long starttime, endtime; + while (true) { + starttime = System.nanoTime(); + bufferimage = robot.createScreenCapture(rect);//JNAScreenShot.getScreenshot(rect);//robot.createScreenCapture(rect); + endtime = System.nanoTime() - starttime; + System.out.println("capture " + endtime); + bufferimage = getScaledImage(bufferimage, 1920, 1080); + byte[] imageByte = ((DataBufferByte) bufferimage.getRaster().getDataBuffer()).getData(); + + try { + byte[] bbb = Snappy.compress(imageByte); + b.addElement(bbb); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + *//* starttime = System.nanoTime(); + bb.addElement(bufferimage); + endtime = System.nanoTime() -starttime; + System.out.println("add " + endtime); *//* + + + } + + } + }*/ + + class FPSCheckThread extends Thread { + int sum = 0; + double avg = 0; + int roop = 0; + + public void run() { + while (true) { + try { + + sleep(1000); + sum += FPScount; + roop++; + avg = (double) sum / roop; + avg = Double.parseDouble(String.format("%.3f", avg)); + + FPSlabel.setText("FPS : " + Integer.toString(FPScount) + " " + Double.toString(avg)); + //repaint(); + System.out.println("FPS : " + FPScount + " " + avg); + + FPScount = 0; + + } catch (InterruptedException e) { + } + } + } + } + + public static void main(String[] args) { + new ScreenCapture(); + } +}