Domanda

Sto cercando di creare un auto-clicker in Java (unica lingua che conosco e ho appena imparato le discussioni). Voglio avere l'applet aperto in essa la propria finestra (non su una pagina web), e voglio essere in grado di avviare e arrestare il programma con la barra spaziatrice, senza la finestra essere selezionati in modo da poter utilizzare l'auto-clicker su un altro programma ed essere in grado di fermarlo senza alt-f4ing un mucchio di roba.

C'è qualcosa che mi può fare riferimento a che mi può aiutare con questo? O avete qualche suggerimento?

È stato utile?

Soluzione

Questo potrebbe essere fuori dalla portata di un applet Java. In realtà, ganci da tastiera globali sono decisamente fuori del campo di applicazione semplicemente utilizzando Java, ma può aiutare a ottenere muovendo nella giusta direzione.

Tuttavia, è necessario qualche speranza. Io punto si nella direzione di JNI (Java Native Interface) , che vi permetterà di utilizzare le librerie native. Ora, dal momento che si vuole rimanere nel mondo Java, vi suggerisco di non direttamente tramite JNI perché dovrete scrivere del codice nativo di confusione (in genere C, C ++). Ci sono diversi wrapper per JNI che consentono di utilizzare le funzioni, ma le implementazioni native sono astratte via, ma molti di questi soldi costo.


Quindi la soluzione migliore per voi, credo, è JNA (Java Native Access) . Questo consente di chiamare direttamente librerie native all'interno di Java. . (NOTA:. L'implementazione non sarà cross platform Devi fare implementazioni separate per Windows, Linux, ecc) C'è un buon esempio per i ganci da tastiera di Windows negli esempi sul sito web del progetto

Per quanto riguarda l'apertura di una propria finestra non in una pagina web, vuoi l'applet viene eseguito all'interno del browser, ma nel suo processo separato, o semplicemente essere in una finestra separata e ancora contare sulla finestra del browser di essere aperta?

  • Se si vuole lanciare semplicemente una nuova finestra e richiedono ancora il browser di essere aperto, quindi ecco un buon esempio:

    final Frame window = new Frame("This is the Frame's Title Bar!");
    window.add(new Label("This is the Frame."));
    window.setSize(300,200);
    window.setVisible(true);
    
    window.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent we){
            window.dispose();
        }
    });
    
  • Se si desidera che l'applet per deporre le uova un nuovo processo e correre senza la necessità del browser, guardare in JavaFX .

Altri suggerimenti

risposta in ritardo, ma si spera utile:)

È possibile utilizzare JNA, è un gioco da ragazzi !!

  1. ottenere JNA (jna.jar)
  2. creare la propria mappatura per User32 (User32.dll) nella forma

    public interface User32 extends StdCallLibrary {
    User32 INSTANCE = (User32) Native.loadLibrary("User32", User32.class,   Options.UNICODE_OPTIONS);
    
    
    // dwWakeMask Constants
    public static final int QS_ALLEVENTS = 0x04BF;
    public static final int QS_ALLINPUT = 0x04FF;
    public static final int QS_ALLPOSTMESSAGE = 0x0100;
    public static final int QS_HOTKEY = 0x0080;
    public static final int QS_INPUT = 0x407;
    public static final int QS_KEY = 0x0001;
    public static final int QS_MOUSE = 0x0006;
    public static final int QS_MOUSEBUTTON = 0x0004;
    public static final int QS_MOUSEMOVE = 0x0002;
    public static final int QS_PAINT = 0x0020;
    public static final int QS_POSTMESSAGE = 0x0008;
    public static final int QS_RAWINPUT = 0x0400;
    public static final int QS_SENDMESSAGE = 0x0040;
    public static final int QS_TIMER = 0x0010;
    
    
    public static final int INFINITE =    0xFFFFFFFF;
    
    
    /*
    DWORD WINAPI MsgWaitForMultipleObjects(
    __in  DWORD nCount,
    __in  const HANDLE *pHandles,
    __in  BOOL bWaitAll,
    __in  DWORD dwMilliseconds,
    __in  DWORD dwWakeMask
    );*/
    
    
    int MsgWaitForMultipleObjects(int nCount, Pointer pHandles, boolean bWaitAll, int dwMilliSeconds, int dwWakeMask);
    
    
    /* fsModifiers vaues */
    public static final int MOD_ALT = 0x0001;
    public static final int MOD_CONTROL = 0x0002;
    public static final int MOD_NOREPEAT = 0x4000;
    public static final int MOD_SHIFT = 0x0004;
    public static final int MOD_WIN = 0x0008;
    
    
    /* BOOL WINAPI RegisterHotKey(
    __in_opt  HWND hWnd,
    __in      int id,
    __in      UINT fsModifiers,
    __in      UINT vk
    );
    */
    boolean RegisterHotKey(Pointer hWnd, int id, int fsModifiers, int vk);
    }
    
  3. Basta controllare le seguenti pagine per avere una chiara idea di come funzionano le cose sotto il cofano:

h ** p: //msdn.microsoft.com/en-us/library/ms646309%28VS.85%29.aspx

h ** p: //msdn.microsoft.com/en-us/library/ms684242%28VS.85%29.aspx

  1. Controlla questa pagina per vedere quali sono le costanti fondamentali È possibile registrare un callback per

h ** p: //msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx

  1. Creare un programma di test in questo modo:
User32 user32 = User32.INSTANCE;
boolean res = user32.RegisterHotKey(Pointer.NULL, 9999, User32.MOD_ALT | User32.MOD_CONTROL, WINUSER.VK_LEFT);
if(!res)
  System.out.println("Couldn't register hotkey");

System.out.println("Starting and waiting");
user32.MsgWaitForMultipleObjects(0, Pointer.NULL, true, User32.INFINITE, User32.QS_HOTKEY);
System.out.println("Ending");

User32.INFINITE è una costante documentato con valore 0xFFFFFFFF

Mi dispiace per i link http rinominati in h ** p :) regole StackOverflow Stefano

Penso che si possa fare questo metodo setVisible(false) utilizzando. Finestra sarà lì, ma utente non sarà in grado di vederlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top