Newsgroup: it.comp.lang.visual-basic
Titolo: [?] verifica presenza tastiera

Ho bisogno di controllare la presenza della tastiera.
Non nel sistema (questo lo so già fare) ma durante l'esecuzione di un prg.
Questo perché la tastiera viene scollegata e ricollegata periodicamente, e
dovrei sapere se in un certo momento è connessa o no.
Qualsiasi comando API riporta la configurazione di Windows, quindi mi dice che
la tastiera c'è sempre.
Mi andrebbe bene anche sapere se il mouse (o il joystick) è connesso o no (anche
lui viene disconnesso e riconnesso periodicamente).
Al momento non ne sono ancora venuto a capo...
Qualcuno ha dei consigli?
Grazie a tutti
--
GbC
http://www.chiappori.net
giov...@chiappori.net

 dovrei sapere se in un certo momento è connessa o no.
Mi viene in mente una idea, ma non ho tempo di provarla e se funziona è un
miracolo.
Prova a cambiare lo stato del caps-lock (o del num-lock) e a rileggerlo. Se
windows interroga la tastiera per sapere lo stato, sei a cavallo.
Per quanto riguarda il mouse, ti puo' bastare monitorare l'ultima posizione
con la GetCursorPosition? Se sta fermo per 5 minuti, puoi far conto che
l'abbiano staccato, e appena si muove l'hanno riattaccato di sicuro. 8-)
Ciao
*Roby*

Il primo metodo che mi hai indicato non controlla lo stato della tastiera (avevo
già provato, anche con api più complesse per la tastiera).
Il secondo (la posizione del mouse) è quello che utilizzo ora (insieme alla
verifica dei tasti premuti della tastiera con la SystHook). Funziona, ma mi
costringe a gestire un timeout che trovo illogico e poco pratico.
Volevo trovare un sistema 'poltically correct'.
Intanto continuo a cercare, ma se vi viene in mente qualcosa fatemelo sapere...
Comunque grazie.


 Intanto continuo a cercare, ma se vi viene in mente qualcosa fatemelo
sapere...
La cosa mi ha stuzzicato abbastanza da spingermi a rispulciare la
documentazione di quando lavoravo in assembler...
La porta di ingresso della tastiera è la 60h. Inutile andarla a leggere però
perche il PIC (Programmable Interrupt Controller) fa si che appena c'è un
carattere in attesa intervenga l'interrupt 09h che ne legge il valore.
Probabilmente Windows rimappa l'interrupt, ma questa è un'altra storia e
comunque la porta risulta sempre vuota lo stesso.
C'e' anche una porta di scrittura però, la 61h. Le specifiche dicono che
quando l'interrupt legge dalla porta 60h, deve  fare a fine routine un
doppio toggling del bit 7 della porta 61h e quindi comunicare al PIC la fine
dell'interrupt scrivendo 20h sulla porta 20h.
Si tratterebbe di fregarsene della porta 20h e concentrarsi sulla 61h.
Purtroppo pero'  la mia documentazione finisce qui.
Io ho comunque un sospetto. All'inizializzazione (cioè quando riceve
corrente per la prima volta) la tastiera manda un qualche segnale sulla
porta 60h: qualche cosa che non è un codice di un carattere e quindi non
viene interpretato dall'interrupt di tastiera. Questo codice viene mandato
fino a quando la tastiera non riceve il canonico doppio toggling del bit 7,
cosa che avviene per l'appunto al primo interrupt, anche se il codice di
tastiera non viene interpretato. In questo caso il Bios allo startup si
aspetterebbe questo valore sulla porta 60h e se non lo trova si lamenta
dicendo che la tastiera non è collegata.
Il bandolo della matassa sta sicuramente nella routine di startup del Bios.
Da qualche parte dovrei averne un listato disassemblato, ma ora sto in ferie
e non mi porto dietro proprio tutto. 8-)
Forse si potrebbe fare qualche test riscrivendosi l'handle dell'interrupt
09h, ma se pure funzionasse lo farebbe solo sotto Dos.
Chissà che diavolo combina windows con l'handle della tastiera. Magari
Windows 3.1 chiamava il Bios per leggere la tastiera, ma già da Win 95 credo
che non lo faccia più (e sicuramente non lo fa Windows NT). In ogni caso per
bene che vada potresti sapere quando la tastiera viene riattaccata, ma non
quando viene scollegata.
Come succede di solito nel dialogo con l'hardware è un problema di
compatibilità all'indietro. Una volta era impossibile che un PC funzionasse
senza tastiera, quindi nessuno si è probabilmente preoccupato di gestirne lo
stato di presenza.
Comunque la faccenda è intrigante. Se dovessi scoprire qualche cosa d'altro
fammelo sapere che mi interessa.
Ciao
*Roby*

In origine pensavo di fare un tsr che testasse le porte 60 e 61, o l'irq 9 (in
cascata out su 61 > imp irq 9)... Magari un device driver per la tastiera
personalizzato...
Ma non riesco ad avere nessuna risposta dal sistema nè dal bios... Non c'è nulla
da nessuna parte, nessun bit di flag settato... Sembra che la tastiera dopo
l'ipl scompaia... Le porte sono lì, se fai qualcosa lo leggi dopo l'irq 9, sia
che la tastiera ci sia sia che non ci sia...
Credo (non ho avuto il tempo di verificare) che dopo l'ipl il bios se ne freghi
della tastiera... Ogni out ed ogni irq vanno via lisci, e non settano alcun bit
da nessuna parte.
Se ad esempio fai l'ipl e controlli la porta 60 si vede che la tastiera è lì...
se la stacchi e ricontrolli la porta 60 la tastiera è sempre lì... anche
pastrocchiando con le porte (tipo leggi il buffer di tastiera corrente o svuota
il buffer e rileggilo..). C'è di peggio... Se fai il boot senza tastiera e poi
la attacchi, le porte sono sempre lì... Insomma, la funzionalità della tastiera
è sempre garantita dal bios (e da windows); nulla ti dice che la tastiera non
c'è... (in fondo a cosa serve sapere se la tastiera c'è o non c'è... te ne
accorgi da solo, no? è una periferica passiva).
Però mi sono accorto che con w98 se stacco la tastiera non succede nulla, ma
quando la riattacco il kernel plug'nplay si accorge che è successo qualcosa...
Windows si pianta per qualche secondo (plug 'n play in azione?) poi riparte.
Le impostazioni della tastiera (velocità di ripetizione e tempo di attesa) si
azzerano (ma se le leggi sono sempre quelle di windows; tee ne accorgi solo
premendo i tasti)...
Mi basterebbe sapere cosa sta facendo il plug 'n play...
Qualcuno ha qualche documentazione sulle funzioni plug 'n play di w?
Nell'sdk di non se ne parla...
Insomma, sono un sostenitore degli ambienti gui, ma in questo caso mi piacerebbe
avere sotto il buon vecchio dos...
