Java KeyListener senza finestra essendo aperta?
-
22-08-2019 - |
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?
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 !!
- ottenere JNA (jna.jar)
-
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); }
-
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
- 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
- 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.