Newsgroup: it.comp.lang.visual-basic
Titolo: sendkeys e il CTRL DESTRO

Ciao ragazzi. ho un grosso problema con VBA per office
Sono riuscito a far colloquiare excel e il terminale personal communications
(CICS) del mio ufficio. Avevo creato una applicazione che riusciva a leggere le
celle di un foglio excel e a riportare il loro contenuto nei campi a terminale.
Il problema sorge quando devo confermare tutto. Dentro al CICS per confermare i
dati devo premere o il CTRL di destra della tastiera oppure il tasto invio del
tastierino numerico. Sono andato sull'help ma non sono riuscito a trovare le
corrispondenze per questi 2 tasti. Sapete per caso come posso risolvere la
cosa??
Grazie in anticipo e CIAO!!!
David
-- 
Posted from  [62.98.117.232] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

cosa??
Dovresti poter fare il subclassing di una tua finestra.
In vb e' piuttosto semplice, ti posto un esempio sotto la firma,
ma non so in vba.
Eventualmente facci sapere.
ciao, hal
--------------------------------------------------------
--In vb serve un progetto con un form vuoto e un modulo bas.
--Nel form scrivere:
Option Explicit
Private Sub Form_Load()
    SubClass Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
    UnSubClass Me
End Sub
-- nel modulo .bas scrivere:
Option Explicit
Private mWndProcOrg As Long         ' original window procedure
Private mHWndSubClassed As Long     ' subclassed window
Private Const WM_KEYDOWN = &H100
Private Const VK_LCONTROL = &HA2    ' left CONTROL key
Private Const VK_RCONTROL = &HA3    ' right CONTROL key
Private mForm As VB.Form            ' subclassed form
Public Declare Function SetWindowLong _
   Lib "user32" Alias "SetWindowLongA" _
      (ByVal hWnd As Long, _
      ByVal nIndex As Long, _
      ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong _
   Lib "user32" Alias "GetWindowLongA" _
      (ByVal hWnd As Long, _
      ByVal nIndex As Long) As Long
Public Declare Function CallWindowProc _
   Lib "user32" Alias "CallWindowProcA" _
      (ByVal lpPrevWndFunc As Long, _
      ByVal hWnd As Long, _
      ByVal Msg As Long, _
      ByVal wParam As Long, _
      ByVal lParam As Long) As Long
'Constants for GetWindowLong() and SetWindowLong() APIs.
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
'''''''''''''''''''''''''''''''''''''''''''''''
Public Sub SubClass(ByRef a_frm As VB.Form)
    If mWndProcOrg Then Exit Sub
    mHWndSubClassed = a_frm.hWnd
    mWndProcOrg = SetWindowLong(mHWndSubClassed, GWL_WNDPROC, _
                                   AddressOf WindowProc)
    Set mForm = a_frm
End Sub
Public Sub UnSubClass(ByRef a_frm As VB.Form)
   If Not (a_frm Is mForm) Then Exit Sub
   If mWndProcOrg = 0 Then Exit Sub
   SetWindowLong mHWndSubClassed, GWL_WNDPROC, mWndProcOrg
   mWndProcOrg = 0
   mHWndSubClassed = 0
   Set mForm = Nothing
End Sub
Public Function WindowProc(ByVal hWnd As Long, _
                    ByVal uMsg As Long, ByVal wParam As Long, _
                    ByVal lParam As Long) As Long
 
    On Local Error Resume Next  ' qui non ci si deve incartare mai !
    If (hWnd = mHWndSubClassed) Then
      If uMsg = WM_KEYDOWN Then
        Debug.Print wParam, Hex$(lParam)
        If wParam = vbKeyControl Then
            If (lParam \ &H1000000) Then
                mForm.Caption = "Control Destro"
            Else
                mForm.Caption = "Control Sinistro"
            End If
        Else
            mForm.Caption = vbNullString
        End If
      End If
    End If
    WindowProc = CallWindowProc(mWndProcOrg, hWnd, _
                        uMsg, wParam, ByVal lParam)
End Function
-- that's all !

hal ha scritto:
[snip]
cancella tutto !
mi sono accorto solo ora che volevi trasmettere e non ricevere !
In questo caso ti servono le seguenti macro, esportate dall' api:
Private Const VK_RCONTROL = &HA3
Private Const VK_LCONTROL = &HA2
Private Declare Sub keybd_event Lib "user32"  _
                                    Alias "keybd_event" ( _
                                   ByVal bVk As Byte, ByVal bScan As Byte, _
                                   ByVal dwFlags As Long, _
                                   ByVal dwExtraInfo As Long)
scusa la confusione, ma in casa ci stavamo attrezzando
per uscire ;-)
ciao, hal