Go Down

Topic: Utilizzo funzioni libreria di Windows con Arduino (Read 737 times) previous topic - next topic

fabpolli

richiesta di Arduino restituisca la finestra attualmente attiva (il titolo?), ma se, come mi sembra tu stia dicendo, l'OP ha su Arduino un qualcosa che già ora si interfaccia tramite USB simulando una tastiera, non credo che si
Il mio era un esempio, un ipotesi d'utilizzo, aspettiamo l'OP per chiarimenti ma visto i dubbi non credo stia usando una Leonardo in configurazione tastiera o joystick ma piuttosto una Uno con qualche pulsante collegato ergo in ogni caso la cicca va fatta lato Windows e non lato Arduino che si limita a inviare "tasto X premuto" e a quel punto cosa ci sia sullo schermo non gli frega una benamata mazza :)

Egidio80

Credo sia un oggetto tipo tastiera programmabile, ne esisteva una tempo fa con un lcd su ogni tasto che in funzione del programma visualizzato sullo schermo mostrava sui tasti la funzione che avrebbero compiuto.
Ed esempio se avevi aperto wort e premevi il Ctrl allora sul tasto C appariva icona o testo per Copia, sul tasto X taglia ecc. se invece aprivi Photoshop allora visualizzava le funzioni dei tasti legate all'applicativo, chessò al posto della M visualizzava l'icona del rettangolo di selezione e così via.
Lui ha un software companion su PC che istruisce Arduino per comprendere quale sia il software in uso, premendo un pulsante su Arduino vorrebbe che il PC faccia copia se c'è word, seleziona se c'è Photoshop e così via...

Esattamente, ho questa condizione.
Ho ricreato una testiera di controllo programmabile con annesso encoder che replica le funzioni di scorrimento principalmente di cursori.
L'applicativo Photoshop è il principale e poi per mezzo della riprogrammazione dei tasti uso lo stesso dispositivo per controllare software diversi.

fabpolli

#17
May 13, 2019, 02:10 pm Last Edit: May 13, 2019, 02:11 pm by fabpolli
Quindi sei nella condizione che illustravo poco fa (che potenza la mia sfera di cristallo USB :) ) ovvero ad Arduino sapere cosa c'è sul monitor non gli interessa, solo il software lato PC deve sapere qual'è il programma in uso, Arduino comunicando via seriale non ha possibilità d'interagire con il PC (se stiamo parlando della Uno, della Mega in configurazione standard) quindi la comunicazione che interessa a te è monodirezionale, ovvero Arduino parla il PC ascolta e agisce, se l'utente preme il pulsante X o gira l'encoder a destra di tre passi ci sia Photoshop, Word, la calcolatrice o il notepad non cambia di una virgola, Arduino dirà via seriale "Premuto tasto X", "Girato encoder A di 3 passi a DX", ecc. il tuo software lato PC riceverà la comunicazione, la "interpreta", verifica il software in uso e farà fare ciò che è stato deciso, ma tutto questo lato PC e qui ti si apre un mondo per decidere se rendere la configurazione scritta nella roccia del software o se renderla configurabile (file, db, ecc.)

Egidio80

La scheda che uso è la Leonardo.
Veramente vorrei che la comunicazione sia bidirezionale anche se come hai descritto tu, il software lato PC sarebbe perfetto facesse tutto questo con possibilità di configurazione  (file, db, ecc.).

Non ho però ancora le conoscenze per poterlo creare.

Per ora sto ancora studiando sull'argomento e pensavo che una soluzione con due/tre diversi valori di programmazione scritti direttamente all'interno di Arduino possa essere sufficiente.

Prendendo spunto da quanto avete espresso nei precedenti post riassumo lo stato delle cose che avrei in mente di fare:

- Tastierino "riprogrammabile" con tasti ed encoder a bordo con l'ausilio di un display che indica lo stato.(fatto)

- Software scritto all'interno di Arduino con le diverse configurazioni che emula le pressioni dei tasti di una
  tastiera o combinazione di questi. (fatto)

- Software residente all'interno del PC che comunica ad Arduino la finestra attiva per permettere ad Arduino la 
  "rimappatura" in automatico (da fare)

fabpolli

Questo cambia tutto, la Leonardo può essere "vista" come tastiera, quindi se tutti i comandi che devi emulare sono usabili da tastiera lato PC ti basta che il SW invii la finestra attiva e tutta la programmazione e la gestione degli eventi la fai da Arduino. Non conosco la leonardo quindi non so dirti se si può usare contemporaneamente come tastiera e come porta USB, se si sei a posto, altrimenti dovrai aggiugere HW per "parlare" da PC ad Arduino a mezzo seriale.
Comunque come detto la leonardo non la sonosco quindi mi metto qui in un angolino altrimenti sparerei bojate pazzesche quindi passo la palla a chi ti può aiutare nel modo corretto :)

Egidio80

Grazie mille  :)
Intanto io continuo a studiare.
Questo è un progetto che va per le lunghe prima di essere ottimizzato alla perfezione  :)

docdoc

Non conosco la leonardo quindi non so dirti se si può usare contemporaneamente come tastiera e come porta USB
Non ho neanche io la Leonardo, ma non credo, perché su Windows viene vista come una periferica HID-keyboard quindi non c'è possibilità di comunicazione seriale secondo me, soprattutto nella direzione opposta a quella di funzionamento di una tastiera (PC->Leonardo).

Per cui ribadisco che "a naso" direi che non si possa fare, se non, come dici anche tu, aggiungendo altro hardware *e* dotando il PC di un programma che al cambiamento di finestra comandi al display di cambiare le informazioni mostrate. Al limite l'unica soluzione fattibile che mi viene in mente è aggiungere un Nano ad esempio, e dedicarlo  al controllo del display (se è questo l'unico scopo di questa richiesta), ma significa dover collegare al PC anche un secondo cavo USB. Oppure lasciar perdere la USB e controllare il display (sempre montato "in parallelo" oltre al Leonardo) tramite Ethernet (tramite shiedl Ethernet) o forse meglio via WiFi (in questo caso tramite una MCU ESP o WeMos D1).
Altro non mi viene in mente, non conoscendo meglio il suo progetto.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Egidio80

#22
May 13, 2019, 04:35 pm Last Edit: May 13, 2019, 04:36 pm by Egidio80
... *e* dotando il PC di un programma che al cambiamento di finestra comandi al display di cambiare le informazioni mostrate. Al limite l'unica soluzione fattibile che mi viene in mente è aggiungere un Nano ad esempio, e dedicarlo  al controllo del display (se è questo l'unico scopo di questa richiesta), ma significa dover collegare al PC anche un secondo cavo USB. Oppure lasciar perdere la USB e controllare il display (sempre montato "in parallelo" oltre al Leonardo) tramite Ethernet (tramite shiedl Ethernet) o forse meglio via WiFi (in questo caso tramite una MCU ESP o WeMos D1)...
Ma io non devo pilotare un display..
Per farla "semplice", al cambio finestra, Windows dovrebbe comunicare ad Arduino:
-"Photoshop"
-"Autocad"
-"Word"
-...
..e Arduino si comporta di conseguenza.

docdoc

Ok, e quindi Arduino che deve fare quando riceve queste informazioni?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

fabpolli

Ok, e quindi Arduino che deve fare quando riceve queste informazioni?
Niente, aspetta che l'utente prema un pulsante collegato ad Arduino o giri un encoder, a quel punto agendo come tastiera/mouse/joystick in base a come hai collegato la Leonardo (in questo caso tastiera credo) in base al programma attivo ricevuto dal PC invia una serie di caratteri per fare una determinata azione, Es. se l'ultimo programma attivo è Photoshop e l'utente preme sul pulsante collegato al pin 8 allora invia al pc la pressione della E che farà fare una determinata cosa a Photoshop, se l'ultimo programma attivo ricevuto da pc è Word e l'utente preme il solito tasto allora verrà inviata la sequenza di tasti Ctrl+C e word copierà quanto selezionato e così via.

docdoc

Niente, aspetta che l'utente prema un pulsante collegato ad Arduino o giri un encoder, a quel punto agendo come tastiera/mouse/joystick in base a come hai collegato la Leonardo (in questo caso tastiera credo) in base al programma attivo ricevuto dal PC invia una serie di caratteri per fare una determinata azione
Mah allora se questa è la richiesta credo che l'unica è mettere un qualcosa (Nano o WeMos D1 mini) che riceve input dal PC, e con questo comunicare (via seriale?) con Leonardo per dargli il comando di switch. Ma implica comunque la realizzazione sul PC di un programmino che si aggancia alla seconda USB e ad ogni cambio di finestra attiva (cosa che temo si possa fare solamente per programmi impostati con permessi amministrativi per probabilissimi blocchi lato Windows per ovvie questioni di sicurezza...) invia alla sua controparte il relativo comando, che sarà reinviato alla Leonardo tramite seriale USB (o via WiFi alla WeMos, magari con un pacchetto UDP).

Ma mi sembra tutto abbastanza complicato in rapporto al beneficio di implementare questa cosa (si può anche implementare direttamente in Windows, un programma riceve i tasti "raw! da Leonardo e li "traduce" in testi a seconda del programma in foreground).
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

fabpolli

(cosa che temo si possa fare solamente per programmi impostati con permessi amministrativi per probabilissimi blocchi lato Windows per ovvie questioni di sicurezza...)
Non ne sono sicurissimo ma un hook sul cambio programma a video non implica innalzamento dell'UAC diversamente da quanto avviene se imposti l'hook di tastiera che viene giustamente interpretato come un keylogger e che necessita di avere tutti i privilegi e probabilmente devi anche far star buono l'antivirus e l'antimalware perché anche loro credo intercettino tali SW e li blocchino.

Ma mi sembra tutto abbastanza complicato in rapporto al beneficio di implementare questa cosa (si può anche implementare direttamente in Windows, un programma riceve i tasti "raw! da Leonardo e li "traduce" in testi a seconda del programma in foreground).
Si infatti, anch'io avrei optato per una uno o una mega se i pin da usare fossero davvero tanti e avrei gestito tutto lato Windows con una semplice seriale, ma da quel che ho capito l'OP la parte Leonardo l'ha già sviluppata e vuole completare così com'è

docdoc

Non ne sono sicurissimo ma un hook sul cambio programma a video non implica innalzamento dell'UAC diversamente da quanto avviene se imposti l'hook di tastiera che viene giustamente interpretato come un keylogger
Beh è parecchio che non "bazzico" dalle parti della API di Windows, quindi forse qualcosa è cambiato, ma "a naso" dubito che si possa fare in maniera generalizzata (ossia non rilevare TUE finestre ma quelle di qualsiasi eseguibile.
Perché seppure un hook penso si possa ancora impostare, tu otterresti solo un handle della finestra che attualmente ha il focus. Da questo per prima cosa dovresti essere in grado di derivare o il titolo della finestra (sempre se dal titolo sia possibile identificare con certezza il programma) o meglio l'eseguibile associato (o genericamente la DLL), e tutta la cosa mi pare pericolosa: per dire, se fosse possibile potrei sapere se apri un antimalware, e magari anche killartelo, o mandargli tasti a tua insaputa (Ctrl-F4 ad esempio?)...

Insomma, potrei ovviamente sbagliare perché non sono aggiornato su tutte le feature delle API di Windows e relative protezioni, ma mi pare più una "idea simpatica" che una "idea praticabile".
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

fabpolli

Perché seppure un hook penso si possa ancora impostare, tu otterresti solo un handle della finestra che attualmente ha il focus. Da questo per prima cosa dovresti essere in grado di derivare o il titolo della finestra (sempre se dal titolo sia possibile identificare con certezza il programma) o meglio l'eseguibile associato (o genericamente la DLL), e tutta la cosa mi pare pericolosa: per dire, se fosse possibile potrei sapere se apri un antimalware, e magari anche killartelo, o mandargli tasti a tua insaputa (Ctrl-F4 ad esempio?)...
Non posso generalizzare ovviamente ma io ho un programmino in C# fatto da me che cerca tra tutte le finestre aperte due specifiche finestre (confronto due stringhe passate come parametro con il titolo della finestra anche parziale) se le trova cambia il padre di una in modo da "annegarla" dentro l'altra e non ho bisogno di innalzare i diritti. Quello che dici tu di killarlo o inviare tasti prevedrebbe altri hook che allora si ti costringono a innalzare l'UAC e far star boni antivirus et simila.
Considera che ci sono anche sistemi (usati dagli antivirus) che ti impediscono di terminarli anche solo temporanemente. Fine OT  :)

zoomx

Nella Leonardo è possibile far funzionare la seriale e usare contemporaneamente la libreria keyboard/mouse a quanto pare.
Dalla documentazione della libreria keyboard
Quote
When using the Mouse or Keyboard library, it may be best to test your output first using Serial.print()

Go Up