Go Down

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

Egidio80

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?

Grazie a tutti in anticipo.

fabpolli

Buona sera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (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. :)

torn24

#2
May 10, 2019, 04:37 pm Last Edit: May 10, 2019, 04:39 pm by torn24
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. :)

fabpolli

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

Egidio80

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.

Grazie

fabpolli

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.

fabpolli

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

Egidio80

Perfetto, adesso è più chiaro.

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?

Grazie

fabpolli

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.
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  :)


fabpolli

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

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.

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.

Grazie mille per la disponibilità.

torn24

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.

docdoc

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"?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

fabpolli

#13
May 13, 2019, 09:34 am Last Edit: May 13, 2019, 09:35 am by 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.
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

docdoc

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.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up