Newsgroup: it.comp.lang.visual-basic
Titolo: Come realizzo una tastiera?

Ciao a tutti!
Vorrei realizzare una tastiera tipo quella che mette a disposizione Windows,
in grado di scrivere in ogni finestra attiva.
Ho utilizzato la funzione keybd_event, ma non riesco a far scrivere proprio
su tutti i form visualizzati.
Qualcuno di voi sa come potrei fare? Accetto ogni tipo di idea o consiglio.
Grazie in anticipo
FaMa (Fabrizio)

> Qualcuno di voi sa come potrei fare? Accetto ogni tipo di idea o
consiglio.
Se vuoi ti mando un programmino che ho scritto qualche tempo fa... Non l'ho
mai finito però funziona e fa quello che tu chiedi.
Ignazio

me lo puoi mandare anche a me? grazie!

Sarei felice di riceverlo, molte grazie.
FaMa

 wrote in message
news:ah0ueo$3h3$1...@newsreader.mailgate.org...


 Qualcuno di voi sa come potrei fare? Accetto ogni tipo di idea o
consiglio.
perchè dipende dall'elemento che ha il focus.(immagina se il focus è su un
pulsante? ) :)
dovresti prima attivare il controllo che dovrebbe ricevere il carattere ...
ciao :)

Ve lo mando qui...
Sappiate che:
- è brutto e scritto male, ma funziona;
- con la toolbar "debug" di VB visibile ha problemi;
- con ripetizioni troppo veloci ha problemi.
In un secondo momento lo caricherò sul sito comune, datemi solo il tempo di
scrivere due righe.
Ignazio
Per farlo funzionare, copiate questo testo ed incollatelo in un file
dandogli l'estensione frm.
VERSION 5.00
Begin VB.Form Form1
   Caption         =   "NeclTastiera"
   ClientHeight    =   630
   ClientLeft      =   1530
   ClientTop       =   1545
   ClientWidth     =   1560
   LinkTopic       =   "Form1"
   ScaleHeight     =   630
   ScaleWidth      =   1560
   Begin VB.CommandButton KeyCMD
      Caption         =   "~"
      Height          =   435
      Index           =   0
      Left            =   120
      TabIndex        =   0
      Tag             =   "{~}"
      Top             =   120
      Width           =   435
   End
   Begin VB.Timer Timer1
      Interval        =   10
      Left            =   660
      Top             =   120
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function SetActiveWindow Lib "user32" (ByVal hWnd As Long)
As Long
Private LastHWND As Long
Private StrQueue As String
Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal
hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long,
ByVal cy As Long, ByVal wFlags As Long)
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_SHOWWINDOW = &H40
Private Sub PrimoPiano(Form As Form, State As Boolean)
If State = True Then
  SetWindowPos Form.hWnd, HWND_TOPMOST, Form.Left / 15, _
               Form.Top / 15, Form.Width / 15, _
               Form.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
Else
  SetWindowPos Form.hWnd, HWND_NOTOPMOST, Form.Left / 15, _
               Form.Top / 15, Form.Width / 15, _
               Form.Height / 15, SWP_NOACTIVATE Or SWP_SHOWWINDOW
End If
End Sub
Private Sub KeyCMD_MouseDown(Index As Integer, Button As Integer, Shift As
Integer, x As Single, Y As Single)
Dim s() As String
Dim i As Long
Dim t As String
If KeyCMD(Index).Tag = "" Then
  StrQueue = KeyCMD(Index).Caption
Else
  's = Split(KeyCMD(Index).Tag, ";")
  'For i = 0 To UBound(s) - 1
  '  t = t + Chr(s(i))
  'Next i
  'StrQueue = t
  StrQueue = KeyCMD(Index).Tag
End If
End Sub
Private Sub Timer1_Timer()
Dim t As Long
Timer1.Enabled = False
PrimoPiano Me, True
t = GetActiveWindow()
If t = Me.hWnd Then
  If Not StrQueue = "" Then
    SetActiveWindow LastHWND
    DoEvents
    SendKeys StrQueue, True
    StrQueue = ""
  End If
Else
  LastHWND = t
End If
Timer1.Enabled = True
End Sub