Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Blocco della tastiera con SENDKEYS

Salve a tutti, stocercando di realizzare una griglia editabile usando mshflexgrid e una textbox da
spostare sulla griglia durante la navigazione nelle celle.
Per spostarmi da una cella all'altra uso SENDKEYS inviando alla flexgrid i corrispondenti tasti di
navigazione (uso questo metodo ansiche i metodi row e col della flexgrid peche' ho notato che
quest'ultimi non generano gli eventi entercell e leavecell).
Il problema sta che se durante la navigazione viene tenuto premuto un tasto di spostamento viene
bloccata la tastiera, non solo sul prog. ma su tutto il sistema; per riattivarla devo staccarla e
riattaccarla fisicamente oppure andare nelle impostazioni della tastira dal pannello di controllo e
resettarla.
Il codice da me scritto e' il seguente (flexgrid = mshflexgrid, tb = textbox) : 
----------------------------------------------------------------
Option Explicit
Private Enum shiftMode
    shMaiuscolo = 1
    shControl = 2
    shAlt = 4
End Enum
' Entra in una nuova cella
Private Sub flexgrid_EnterCell()
    'Call spostaTextBox
    tb.Text = flexgrid.TextMatrix(flexgrid.Row, flexgrid.Col)
    tb.SetFocus
End Sub
' Esce da una cella
Private Sub flexgrid_LeaveCell()
    flexgrid.TextMatrix(flexgrid.Row, flexgrid.Col) = tb.Text
End Sub
Private Sub tb_KeyDown(KeyCode As Integer, Shift As Integer)
 
    Select Case KeyCode
        Case 40     ' Down
            If flexgrid.Row + 1 < flexgrid.Rows Then
                flexgrid.SetFocus
                SendKeys "{DOWN}"
            End If
 
            KeyCode = 0
            Exit Sub
 
        Case 9, 13  ' Tab key
            If (Shift And shMaiuscolo) <> shMaiuscolo Then
 
                flexgrid.SetFocus
                SendKeys "{TAB}"
 
                KeyCode = 0
                Exit Sub
 
            Else
 
                flexgrid.SetFocus
                SendKeys "{LEFT}"
 
                KeyCode = 0
                Exit Sub
 
            End If
 
 
        Case 38     ' UP
 
            If flexgrid.Row > flexgrid.FixedRows Then
                flexgrid.SetFocus
                SendKeys "{UP}"
            Else
                flexgrid.SetFocus
                SendKeys "{LEFT}"
            End If
 
            KeyCode = 0
            Exit Sub
 
 
    End Select
 
End Sub
Private Sub Form_Load()
    tb.BorderStyle = 0
 
    flexgrid.FixedCols = 1                          ' Non visualizza la prima colonna fissa
    flexgrid.AllowBigSelection = False              ' Se si clicca sulla colonna non la seleziona
tutta
    ' flexgrid.BandDisplay
    flexgrid.GridLines = flexGridFlat               ' Imposta il tipo di griglia di separazione
    flexgrid.ScrollBars = 0                         ' Non visualizza le barre di scorrimento
    flexgrid.SelectionMode = flexSelectionFree      ' Imposta la selezione per riga
    flexgrid.FocusRect = flexFocusHeavy ' flexFocusLight             ' La cella slezionata non viene
evidenziata
    flexgrid.AllowUserResizing = flexResizeNone     ' Mantiene la dimenzione della griglia fissa
    flexgrid.ScrollTrack = True
    flexgrid.Cols = 4
    flexgrid.Rows = 11
 
    flexgrid.FormatString = ";|1|2|3|4|5|6|7|8|9|10"
 
End Sub
Private Sub spostaTextBox()
 
    Dim sngL As Long
    Dim sngT As Long
    Dim sngW As Long
    Dim sngH As Long
    With flexgrid.Container
        sngL = .ScaleX(flexgrid.CellLeft, vbTwips, .ScaleMode)
        sngT = .ScaleY(flexgrid.CellTop, vbTwips, .ScaleMode)
        sngW = .ScaleX(flexgrid.CellWidth, vbTwips, .ScaleMode)
        sngH = .ScaleY(flexgrid.CellHeight, vbTwips, .ScaleMode)
    End With
 
    tb.Text = flexgrid.TextMatrix(flexgrid.Row, flexgrid.Col)
    ' Show textbox at the right place.
 
    tb.Move flexgrid.Left + sngL, flexgrid.Top + sngT, sngW, sngH
    tb.Top = tb.Top - 10
    tb.Left = tb.Left - 10
    tb.Visible = True
End Sub

 Private Sub tb_KeyDown(KeyCode As Integer, Shift As Integer)
[CUT]
Perche non usi
Private Sub tb_KeyUp(KeyCode As Integer, Shift As Integer) ?
cosi l'evento si schatena quando lasci il tasto
Ciao L'Oriundo

Ho scoperto a quanto pare che questo e' un problema di windows 2000 (vedendo i vecchi post qualcuno
diceva che si verificava anche su win98), microsoft dice di installare il sp2 o sostituire un paio
di librerie, l'alternativa e' usare direttamente le api di windows, io ho fatto cosě e adesso
funziona perfettamente.
Se a qualcuno interessa le api che microsoft suggerisce di usare sono queste:
 '  *********** Esempio 1 *************
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte,ByVal _
 bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2
Const VK_TAB = &H9
keybd_event VK_TAB, 0, 0, 0
keybd_event VK_TAB, 0, KEYEVENTF_KEYUP, 0
 '  *********** Esempio 2 *************
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
 (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
   ByVal lParam As Long) As Long
Const WM_KEYDOWN As Long = &H100
Const VK_TAB As Long = &H9
Dim retVal as long
retVal = PostMessage(Me.hwnd, WM_KEYDOWN, VK_TAB, 0)