Domanda

Sto lavorando allo sviluppo di una tastiera su schermo con Java. Questa tastiera ha un JComponent per ogni possibile chiave. Quando viene rilevato un mouse verso il basso sul pulsante, voglio inviare un codice tastiera specifico all'applicazione attualmente attiva. La tastiera stessa si trova in un JFrame senza decorazioni e impostata su sempre in primo piano.

Ho scoperto che la classe Robot può essere utilizzata per simulare questi eventi da tastiera sulla coda nativa. Tuttavia, in questo caso, la selezione del JComponent significherebbe che la pressione del tasto viene ricevuta sul JFrame e non sarei in grado di riceverlo nell'altra applicazione

Come posso mantenere la tastiera su schermo " Sempre-senza-focus " ;? È forse possibile utilizzare un altro approccio per inviare il tasto premuto?

È stato utile?

Soluzione 3

Apparentemente l'unico modo per farlo è avere un layer JNI che renderà la conversione da Java a nativo. Java non ha un modo semplice per fornire tale funzionalità.

Questo potrebbe essere un concetto interessante per una piccola biblioteca di terze parti per qualcuno che vuole imparare il JNI ...

Altri suggerimenti

Ho trovato jnativehook quando stavo cercando di controllare un gamebot con i comandi effettivi di tastiera e mouse (per essere più "umani").

L'unica soluzione che ho trovato finora, è rendere ogni chiave un JComponent (quindi non può avere lo stato attivo) e impostare le seguenti proprietà su JFrame:

    setUndecorated(true);
    setFocusableWindowState(false);
    setFocusable(false);
    enableInputMethods(false);

Ora quando uso la classe robot posso inviare eventi a qualsiasi finestra focalizzata facendo clic sui tasti. L'unica limitazione è che sembra funzionare solo per finestre che appartengono alla stessa macchina virtuale e non funziona affatto con qualsiasi altra finestra di sistema.

hai provato a chiamare le funzioni native setfocus () o setactivewindow () per spostare lo stato attivo prima di utilizzare la classe robot?

Non sono a conoscenza di alcun modo per farlo in modo indipendente dal SO. Non conosco Windows, ma sarebbe possibile parlare con il server X tramite il protocollo X.

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