Salve a tutti sono nuovo del forum.
Sono un appassionato di elettronica e mi sto cimentando da qualche tempo nell'utilizzo di Arduino per alcuni semplici progetti domestici utilizzando una scheda Arduino pro micro.
Avrei un quesito in merito all'utilizzo delle librerie di windows con Arduino appunto.
In particolare avrei bisogno di ricevere informazioni da parte del sistema operativo, in merito a quale finestra di programma sia attiva (in primo piano) in un determinato momento dietro richiesta da parte di Arduino connesso al PC.
So che nella libreria di Windows esiste la funzione "GetForegroundWindow" che dovrebbe espletare quello che serve a me ma non riesco (e non so se sia possibile farlo) ad implementarla nel mio codice all'interno di IDE.
In pratica dovrei creare una struttura "if" che faccia cose diverse in funzione dell'applicativo Windows in "primo piano".
Qualcuno di voi ha già avuto modo di implementare questa funzione oppure ha creato del codice che faccia al caso mio?
Buona sera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Ciao una libreria per windows o di altro sistema operativo non può funzionare su arduino o altri microcontrollori, per tanti motivi, la libreria potrebbe richiedere "funzioni" del sistema operativo, la libreria è compilata in linguaggio macchina per processori intel o amd e non in linguaggio macchina del microcontrollore, e sicuramente altri motivi che non conosco
Per fare quello che chiedi in teoria si potrebbe seguire questa linea...
Tu comunichi tramite arduino con il PC, per cui su PC c'è un programma che comunica da seriale con arduino, potrebbe essere questo programma per windows, che sotto una richiesta di arduino, usa la libreria, controlla che finestra è attiva e invia una risposta ad arduino.
Ovviamente bisognerebbe riuscire a creare il programma per PC con un apposito linguaggio di programmazione.
In aggiunta a quanto detto da @torn24, nella prima parte del suo intervento, considera che Arduino ha come unica connessione con il PC una seriale quindi non può avere visibilità di cosa stia succedendo sul PC (processi in esecuzione, finestre in primo piano, ecc.) se il PC (con apposito software scritto appositamente allo scopo) non gli invia sulla seriale queste informazioni
Immaginavo fosse necessario "qualcosa in più" di una semplice istruzione..
Stabilendo però una comunicazione seriale con il PC in uso e considerando che questa comunicazione è di tipo bidirezionale, potrei ipotizzare di interrogare il PC tramite Arduino e ricevere una stringa indietro da interpretare.
Una stringa che in qualche modo venga associata al nome dell'applicativo che ha il focus in quel momento.
Io farei l'esatto opposto, ovvero sul PC crei un programa che sta li e quando varia il programma in primo piano invia qualcosa ad Arduino che non farà altro in vita sua che non aspettare la comunicazione e agire.
Facendo come fai tu avresti una marea di messaggi da Arduino verso PC e viceversa poco utili in quanto molti di questi riporterebbero sempre il solito programma in primo piano e oltretutto demandando ad Arduino l'invio delle richieste al pc dovrai per forza di cose decidere di farle ogni N unità di tempo, se queste sono troppo distanziate (Es. 5 secondi) potresti perderti un rapido scambio di applicazioni in primo piano, se sono troppo ravvicinate il tuo programma su PC avrà comunque un impatto sulle risorse impiegate perché dovrà costantemente verificare il programma in primo piano e comunicarlo ad Arduino.
tra l'altro windows mette a disposizione un hook specifico per permettere ad un programma di stare in attesa del cambio della foregroundwindow, quindi sia lato PC che lato arduino non ti resterebbe che attendere l'evento che lo stesso windows ti segnalerebbe al momento opportuno e inviare la cosa ad Arduino, niente polling da entrambe i lati, che è sempre la cosa migliore quando possibile
In realtà la mia necessità è che Arduino continui a comportarsi allo stesso modo fino a che il programma residente sul PC non comunica il cambio di "focus". A questo punto Arduino cambierebbe il suo comportamento secondo programmazione interna.
A parte il creare un apposito programma che comunichi ad Arduino il "cambio", a questo punto la mia esigenza si trasformerebbe in un lancio automatico di questo programma da parte di Arduino al momento in cui questo viene connesso alla porta USB del PC in uso. Tale programma dovrebbe poi girare in background in maniera "trasparente" per l'utente.
Arduino sarebbe in grado di fare questo lancio in automatico al momento del suo inserimento nella porta USB?
Egidio80:
In realtà la mia necessità è che Arduino continui a comportarsi allo stesso modo fino a che il programma residente sul PC non comunica il cambio di "focus". A questo punto Arduino cambierebbe il suo comportamento secondo programmazione interna.
Che è lo scenario che ti ho descritto con l'hook di windows.
Egidio80:
A parte il creare un apposito programma che comunichi ad Arduino il "cambio", a questo punto la mia esigenza si trasformerebbe in un lancio automatico di questo programma da parte di Arduino al momento in cui questo viene connesso alla porta USB del PC in uso. Tale programma dovrebbe poi girare in background in maniera "trasparente" per l'utente.
Arduino sarebbe in grado di fare questo lancio in automatico al momento del suo inserimento nella porta USB?
Grazie
Direi proprio di no anche perché è un comportamento utilizzato per iniettare dei virus/cavalli di troia nei PC da USB e che stranamente viene osteggiato dai produttori di S.O. e dagli utenti
Parti dal presupposto che tutto ciò che accade quando colleghi Arduino windows se ne accorge, crea la porta seriale USB virtuale e nient'altro quindi Arduino al PC non dice proprio nulla e non gli fa fare null'altro che non quanto indicato.
Esiste la possibilità di modificare come Arduino viene visto dal PC (non più seriale ma chesso HID, Mass storage, ecc.) quindi potresti riprogrammare il chip d'interfaccia di Arduino, creare un driver apposito su windows che si interfacci con il kernel di windows e ti consenta di fare ciò che vuoi ma sono sicuro che sia oltre le mie conoscenze e credo anche oltre le tue conoscenze di programmazione sia lato PC sia lato Arduino
Più in generale comunque non capisco se stai cercando di fare una cosa per te, quindi non vedo la difficoltà di lanciare all'avvio il tuo programma lato pc con l'esecuzione automatica di windows e dal tuo programma attendere che Arduino sia collegato e gli invii i comandi o se stai cercando di creare qualcosa da far funzionare su un qualsiasi pc del mondo
No, in realtà si tratta di realizzare un dispositivo hardware per un amico che gli permetta di manovrare con lo stesso dispositivo usb funzionalità diverse su programmi diversi. Il tutto senza doverlo riconfigurare manualmente ma in modo che si "mappi" automaticamente al variare dell'applicativo.
La parte hardware è fatta così come tutte le funzionalità programmate all'interno di Arduino.
Mancherebbe la parte di configurazione automatica.
Come dite andrebbe bene anche una esecuzione automatica del programma all'avvio di Windows. A questo non ci avevo pensato..
Per ora proseguo con lo studio poi vi terrò aggiornati.
Non mi sembra una cosa fattibile, o qualcosa di molto complesso! Ogni programma-applicazione dovrebbe comunicare con la seriale ad arduino, se io ho una comunicazione tramite seriale con arduino rimane quella finché arduino è connesso, esempio collego arduino e arduino è visto con la porta com3.
A questo punto non solo tutti i programmi devono essere in grado di comunicare con arduino tramite porta seriale, ma i vari programmi-processi devono comunicare tra loro per indicare quale porta utilizzare.
Su un idea bisogna valutare bene la fattibilità in base alle nostre conoscenze, per ogni cosa ci sono vari livelli di difficoltà, se so fare poco o niente allora si può sperare di riuscire a fare cose basilari, non certo cose che sono in pochi a riuscire a fare.
Egidio80:
No, in realtà si tratta di realizzare un dispositivo hardware per un amico che gli permetta di manovrare con lo stesso dispositivo usb funzionalità diverse su programmi diversi. Il tutto senza doverlo riconfigurare manualmente ma in modo che si "mappi" automaticamente al variare dell'applicativo.
La parte hardware è fatta così come tutte le funzionalità programmate all'interno di Arduino.
Posso dire che non ho capito UBM?
Cosa significa "manovrare con lo stesso dispositivo usb funzionalità diverse su programmi diversi"?
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.
Misteriosa la via è su come l'utente pensi di inviare tali comandi al PC e vederli eseguiti se non dal software companion che gira su PC ma a quel punto basterebbe l'hook su tastiera e Arduino perde tatalmente di significato
Mah, comunque sia da Arduino non puoi fare direttamente nulla, come abbiamo tutti già detto, perché si interfaccia solamente con la seriale virtuale via USB. Sarebbe possibile creare un software su PC che su 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 possa usare lo stesso canale anche per fare queste operazioni.
In sostanza: o specifica ESATTAMENTE cosa attualmente fa con Arduino e come (collegamenti, sketch, software e configurazione lato Windows...) oppure secondo me non si può fare, almeno stando alle attuali (scarse) informazioni fornite.
docdoc:
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
fabpolli:
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.
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.)
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)
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