Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Tastierina virtuale che interagisce con gli applicativi Windows

Scusatemi se il titolo è troppo lungo ...
Sto realizzando una tastirina virtuale che deve interagire con applicativi
windows, ad esempio scrivere nel notepad, word e altri applicativi.
Ho iniziato il mio programmino in maniera semplice utilizzando API, GetFocus
e SendMessage per poter scrivere nei TextBox su un Form di un exe standard.
Ora vorrei andare oltre cercando di interagire con altri programmi, ma
evidentemente il GetFocus opera solo nell'ambito dei form.
Sapreste consigliarmi qualche altra API? O dirmi se la strada che ho
intrapreso è sbagliata?
I tasti della keyboard virtuale li ho creati con i label per poter sfruttare
gli handle dei vari controlli, ed il GetFocus ha funzionato in maniera
corretta fino a quando i textbox erano sullo stesso form .
Scusatemi se le mie domande posso sembrare banali, ma fortunatamente grazie
a voi,  ho già fatto notevoli progressi ... immaginatevi come ero prima :)
Grazie mille
Salvatore
P.S.: Nell'attesa di una vostra risposta, continuo la mia ricerca su google

 intrapreso č sbagliata?
Non capisco quale sia il tuo problema.
La GetFocus non č una funzione API... č un evento!
E le funzioni API che accettano hWnd come parametro funzionano con tutte le
finestre, e per finestre si intende in senso lato qualsiasi oggetto
provvisto di hWnd, cioč praticamente tutti gli oggetti in Windows.
Ciao

Cercherò di essere più chiaro (mia ignoranza permettendo).
Ho creato un nuovo progetto EXE Standard all'interno sono presenti un form
contenente un label e due text box ed un modulo.
Nel modulo ho inserito le seguenti istruzioni.
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As
Long
Public Declare Function GetFocus Lib "user32" () As Long
Nel form invece:
Private Sub Label1_Click()
Dim Temp, focus
focus = GetFocus
Temp = SendMessage(focus, &H102, 65, 0)
End Sub
Il programma al click del label mi invia il carattere corrsipondente al
codice ASCII 65 in corrispondenza del textbox che ha il focus.
Ora mi piacerebbe creare in Visual Basic una tastierina alfa numerica, che
interagisce con gli altri applicativi di windows ogni volta che viene
chiamata, in modo da poter sostituire la tastiera, in pratica una sorta di
tastiera virtuale come quella presente sui palmari.
Purtroppo il programmino che ho fatto funziona solo con i textboxs presenti
nel form in cui sono presenti i labels, che fungono da tasti.
Cosa devo fare per farlo interagire con altri programmi ed altri form?
Forse dovrei cambiare strategia?
Alcune delle scelte da me fatte derivano dal fatto, che dovendo il programma
girare su windows CE non posso usare tutte le potenzialità di Visual Basic
6, ma devo limitarmi a quelle istruzioni che funzionano anche con L'Embedded
Visual Basic 3.0 per Windows CE.
Se sono stato nuovamente poco chiaro, vi prego di dirmelo, così cercherò di
farvi capire meglio il mio problema.
Grazie mille
Salvatore

 nel form in cui sono presenti i labels, che fungono da tasti.
Ecco, qui non ho capito.
In che senso "solo con i textboxs presenti  nel form in cui sono presenti i
labels"?
Intendi solo nella tua tastiera?
Se tu conosci l'hWnd di un textbox puoi inviargli il WM_CHAR ugualmente.
Forse a te interessa sapere l'hWnd della textbox che ha il focus...
Allora ci siamo, io dopo non poche imprecazioni sono riuscito ad ottenere
l'hWnd del controllo attivo anzichè del form: bisogna redirigere il focus,
usa questa funzione:
Questa ottiene l'handle del form (child = False) o del controllo attivo
(Child = True) della finestra in primo piano.
Dato che la finestra attiva non è detto sia quella in primo piano credo ti
basti sostituire GetForegroundWindow con GetActiveWindow.
Ciao
Function GetWindow(ByVal Child As Boolean) As Long
    Dim t_id As Long
    Dim c_t_id As Long
    If Child Then
        'Get the selected control of the foreground window
        t_id = GetWindowThreadProcessId(hwnd, 0&)
        c_t_id = GetWindowThreadProcessId(GetForegroundWindow, 0&)
        Call AttachThreadInput(c_t_id, t_id, True)
        GetWindow = GetFocus()
        Call AttachThreadInput(c_t_id, t_id, False)  'Restore the input
queue
    Else
        GetWindow = GetForegroundWindow()
    End If
End Function