package sivantoledo.win32;

public class SendInput {
  
  static { 
    java.io.FileOutputStream dll_f;
    java.io.InputStream      dll_r;
    try {
      System.loadLibrary("SendInput"); 
    } catch (UnsatisfiedLinkError ule) {
      try {
        dll_r = SendInput.class.getClassLoader().getResourceAsStream("native/win32/SendInput/release/SendInput.dll"); 
        dll_f = new java.io.FileOutputStream("SendInput.dll");
        byte[] buffer = new byte[8192];
        int    bytes_read = 0;
        do {
          dll_f.write(buffer, 0, bytes_read);
          bytes_read = dll_r.read(buffer);
        } while (bytes_read != -1);
        dll_r.close();
        dll_f.close();
        System.loadLibrary("SendInput");
      } catch (java.io.IOException ioe) {
        System.out.println("Error encountered while trying to copy a DLL to the working directory: "
                           +ioe.getMessage());
      }
    }
  }
  
  public native static int mouseRelative(int dx, int dy);
  public native static int mouseDownUp(int button);
  public native static int charDownUp(char unicode);
  public native static int keyDownUp (char key);
  public        static int keyDownUp (String key) {
    try {
      return keyDownUp( (char) SendInput.class.getField(key).getInt(null) );
    } catch (Exception e) {
      return 0;
    }
  }

  public static void main(String[] arguments) {
    
    try {
      System.out.println("key value = "+SendInput.class.getField("VK_TAB").getInt(null));
    } catch (NoSuchFieldException nsfe) {
      System.out.println("No such field");
    } catch (IllegalAccessException iae) {
      System.out.println("illegal access field");
    }
    //System.out.println(charDownUp((char)1488));
    System.out.println(keyDownUp("VK_LEFT"));
    //System.out.println(keyDownUp(VK_LEFT));
    //System.out.println(keyDownUp(VK_LEFT));
    //System.out.println(keyDownUp(VK_LEFT));
    //System.out.println(keyDownUp(VK_LEFT));
    //System.out.println(keyDownUp(VK_LEFT));
    //System.out.println(keyDownUp(VK_LEFT));
    //System.out.println(keyDownUp('X'));
  }  
  
  public final static char VK_LBUTTON      = 0x01;
  public final static char VK_RBUTTON      = 0x02;
  public final static char VK_CANCEL       = 0x03;
  public final static char VK_MBUTTON      = 0x04;    /* NOT contiguous with L & RBUTTON */

  //#if(_WIN32_WINNT >= 0x0500)
  public final static char VK_XBUTTON1     = 0x05;    /* NOT contiguous with L & RBUTTON */
  public final static char VK_XBUTTON2     = 0x06;    /* NOT contiguous with L & RBUTTON */
  //#endif /* _WIN32_WINNT >= 0x0500 */

  /*
   * 0x07 : unassigned
   */

  public final static char VK_BACK         = 0x08;
  public final static char VK_TAB          = 0x09;

  /*
   * 0x0A - 0x0B : reserved
   */

  public final static char VK_CLEAR        = 0x0C;
  public final static char VK_RETURN       = 0x0D;

  public final static char VK_SHIFT        = 0x10;
  public final static char VK_CONTROL      = 0x11;
  public final static char VK_MENU         = 0x12;
  public final static char VK_PAUSE        = 0x13;
  public final static char VK_CAPITAL      = 0x14;

  public final static char VK_KANA         = 0x15;
  public final static char VK_HANGEUL      = 0x15;  /* old name - should be here for compatibility */
  public final static char VK_HANGUL       = 0x15;
  public final static char VK_JUNJA        = 0x17;
  public final static char VK_FINAL        = 0x18;
  public final static char VK_HANJA        = 0x19;
  public final static char VK_KANJI        = 0x19;

  public final static char VK_ESCAPE       = 0x1B;

  public final static char VK_CONVERT      = 0x1C;
  public final static char VK_NONCONVERT   = 0x1D;
  public final static char VK_ACCEPT       = 0x1E;
  public final static char VK_MODECHANGE   = 0x1F;

  public final static char VK_SPACE        = 0x20;
  public final static char VK_PRIOR        = 0x21;
  public final static char VK_NEXT         = 0x22;
  public final static char VK_END          = 0x23;
  public final static char VK_HOME         = 0x24;
  public final static char VK_LEFT         = 0x25;
  public final static char VK_UP           = 0x26;
  public final static char VK_RIGHT        = 0x27;
  public final static char VK_DOWN         = 0x28;
  public final static char VK_SELECT       = 0x29;
  public final static char VK_PRINT        = 0x2A;
  public final static char VK_EXECUTE      = 0x2B;
  public final static char VK_SNAPSHOT     = 0x2C;
  public final static char VK_INSERT       = 0x2D;
  public final static char VK_DELETE       = 0x2E;
  public final static char VK_HELP         = 0x2F;

  /*
   * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
   * 0x40 : unassigned
   * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
   */

  public final static char VK_LWIN         = 0x5B;
  public final static char VK_RWIN         = 0x5C;
  public final static char VK_APPS         = 0x5D;

  /*
   * 0x5E : reserved
   */

  public final static char VK_SLEEP        = 0x5F;

  public final static char VK_NUMPAD0      = 0x60;
  public final static char VK_NUMPAD1      = 0x61;
  public final static char VK_NUMPAD2      = 0x62;
  public final static char VK_NUMPAD3      = 0x63;
  public final static char VK_NUMPAD4      = 0x64;
  public final static char VK_NUMPAD5      = 0x65;
  public final static char VK_NUMPAD6      = 0x66;
  public final static char VK_NUMPAD7      = 0x67;
  public final static char VK_NUMPAD8      = 0x68;
  public final static char VK_NUMPAD9      = 0x69;
  public final static char VK_MULTIPLY     = 0x6A;
  public final static char VK_ADD          = 0x6B;
  public final static char VK_SEPARATOR    = 0x6C;
  public final static char VK_SUBTRACT     = 0x6D;
  public final static char VK_DECIMAL      = 0x6E;
  public final static char VK_DIVIDE       = 0x6F;
  public final static char VK_F1           = 0x70;
  public final static char VK_F2           = 0x71;
  public final static char VK_F3           = 0x72;
  public final static char VK_F4           = 0x73;
  public final static char VK_F5           = 0x74;
  public final static char VK_F6           = 0x75;
  public final static char VK_F7           = 0x76;
  public final static char VK_F8           = 0x77;
  public final static char VK_F9           = 0x78;
  public final static char VK_F10          = 0x79;
  public final static char VK_F11          = 0x7A;
  public final static char VK_F12          = 0x7B;
  public final static char VK_F13          = 0x7C;
  public final static char VK_F14          = 0x7D;
  public final static char VK_F15          = 0x7E;
  public final static char VK_F16          = 0x7F;
  public final static char VK_F17          = 0x80;
  public final static char VK_F18          = 0x81;
  public final static char VK_F19          = 0x82;
  public final static char VK_F20          = 0x83;
  public final static char VK_F21          = 0x84;
  public final static char VK_F22          = 0x85;
  public final static char VK_F23          = 0x86;
  public final static char VK_F24          = 0x87;

  /*
   * 0x88 - 0x8F : unassigned
   */

  public final static char VK_NUMLOCK      = 0x90;
  public final static char VK_SCROLL       = 0x91;

  /*
   * NEC PC-9800 kbd definitions
   */
  public final static char VK_OEM_NEC_EQUAL= 0x92;   // '=' key on numpad

  /*
   * Fujitsu/OASYS kbd definitions
   */
  public final static char VK_OEM_FJ_JISHO = 0x92;   // 'Dictionary' key
  public final static char VK_OEM_FJ_MASSHOU = 0x93;   // 'Unregister word' key
  public final static char VK_OEM_FJ_TOUROKU = 0x94;   // 'Register word' key
  public final static char VK_OEM_FJ_LOYA  = 0x95;   // 'Left OYAYUBI' key
  public final static char VK_OEM_FJ_ROYA  = 0x96;   // 'Right OYAYUBI' key

  /*
   * 0x97 - 0x9F : unassigned
   */

  /*
   * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
   * Used only as parameters to GetAsyncKeyState() and GetKeyState().
   * No other API or message will distinguish left and right keys in this way.
   */
  public final static char VK_LSHIFT       = 0xA0;
  public final static char VK_RSHIFT       = 0xA1;
  public final static char VK_LCONTROL     = 0xA2;
  public final static char VK_RCONTROL     = 0xA3;
  public final static char VK_LMENU        = 0xA4;
  public final static char VK_RMENU        = 0xA5;

  //#if(_WIN32_WINNT >= 0x0500)
  public final static char VK_BROWSER_BACK      = 0xA6;
  public final static char VK_BROWSER_FORWARD   = 0xA7;
  public final static char VK_BROWSER_REFRESH   = 0xA8;
  public final static char VK_BROWSER_STOP      = 0xA9;
  public final static char VK_BROWSER_SEARCH    = 0xAA;
  public final static char VK_BROWSER_FAVORITES = 0xAB;
  public final static char VK_BROWSER_HOME      = 0xAC;

  public final static char VK_VOLUME_MUTE       = 0xAD;
  public final static char VK_VOLUME_DOWN       = 0xAE;
  public final static char VK_VOLUME_UP         = 0xAF;
  public final static char VK_MEDIA_NEXT_TRACK  = 0xB0;
  public final static char VK_MEDIA_PREV_TRACK  = 0xB1;
  public final static char VK_MEDIA_STOP        = 0xB2;
  public final static char VK_MEDIA_PLAY_PAUSE  = 0xB3;
  public final static char VK_LAUNCH_MAIL       = 0xB4;
  public final static char VK_LAUNCH_MEDIA_SELECT = 0xB5;
  public final static char VK_LAUNCH_APP1       = 0xB6;
  public final static char VK_LAUNCH_APP2       = 0xB7;

  //#endif /* _WIN32_WINNT >= 0x0500 */

  /*
   * 0xB8 - 0xB9 : reserved
   */

  public final static char VK_OEM_1        = 0xBA;   // ';:' for US
  public final static char VK_OEM_PLUS     = 0xBB;   // '+' any country
  public final static char VK_OEM_COMMA    = 0xBC;   // ',' any country
  public final static char VK_OEM_MINUS    = 0xBD;   // '-' any country
  public final static char VK_OEM_PERIOD   = 0xBE;   // '.' any country
  public final static char VK_OEM_2        = 0xBF;   // '/?' for US
  public final static char VK_OEM_3        = 0xC0;   // '`~' for US

  /*
   * 0xC1 - 0xD7 : reserved
   */

  /*
   * 0xD8 - 0xDA : unassigned
   */

  public final static char VK_OEM_4        = 0xDB;  //  '[{' for US
  public final static char VK_OEM_5        = 0xDC;  //  '\|' for US
  public final static char VK_OEM_6        = 0xDD;  //  ']}' for US
  public final static char VK_OEM_7        = 0xDE;  //  ''"' for US
  public final static char VK_OEM_8        = 0xDF;

  /*
   * 0xE0 : reserved
   */

  /*
   * Various extended or enhanced keyboards
   */
  public final static char VK_OEM_AX       = 0xE1;  //  'AX' key on Japanese AX kbd
  public final static char VK_OEM_102      = 0xE2;  //  "<>" or "\|" on RT 102-key kbd.
  public final static char VK_ICO_HELP     = 0xE3;  //  Help key on ICO
  public final static char VK_ICO_00       = 0xE4;  //  00 key on ICO

  //#if(WINVER >= 0x0400)
  public final static char VK_PROCESSKEY   = 0xE5;
  //#endif /* WINVER >= 0x0400 */

  public final static char VK_ICO_CLEAR    = 0xE6;


  //#if(_WIN32_WINNT >= 0x0500)
  public final static char VK_PACKET       = 0xE7;
  //#endif /* _WIN32_WINNT >= 0x0500 */

  /*
   * 0xE8 : unassigned
   */

  /*
   * Nokia/Ericsson definitions
   */
  public final static char VK_OEM_RESET    = 0xE9;
  public final static char VK_OEM_JUMP     = 0xEA;
  public final static char VK_OEM_PA1      = 0xEB;
  public final static char VK_OEM_PA2      = 0xEC;
  public final static char VK_OEM_PA3      = 0xED;
  public final static char VK_OEM_WSCTRL   = 0xEE;
  public final static char VK_OEM_CUSEL    = 0xEF;
  public final static char VK_OEM_ATTN     = 0xF0;;
  public final static char VK_OEM_FINISH   = 0xF1;
  public final static char VK_OEM_COPY     = 0xF2;
  public final static char VK_OEM_AUTO     = 0xF3;
  public final static char VK_OEM_ENLW     = 0xF4;
  public final static char VK_OEM_BACKTAB  = 0xF5;

  public final static char VK_ATTN         = 0xF6;
  public final static char VK_CRSEL        = 0xF7;
  public final static char VK_EXSEL        = 0xF8;
  public final static char VK_EREOF        = 0xF9;
  public final static char VK_PLAY         = 0xFA;
  public final static char VK_ZOOM         = 0xFB;
  public final static char VK_NONAME       = 0xFC;
  public final static char VK_PA1          = 0xFD;
  public final static char VK_OEM_CLEAR    = 0xFE;

  /*
   * 0xFF : reserved
   */

}
