Newsgroup: it.comp.appl.access
Titolo: keybd_event senza 'pause'

Riporto anche qui il tread che ho proposto sul NG Microsoft di Access,
mi rendo conto di chiedere qualcosa di strano, ma forse qualcuno può
venirmi in aiuto...
Devo fare una serie di copia-incolla con VBA dalle righe di una certa
applicazione a un foglio di Excel. Inizialmente ho provato con SendKeys
ma
non mi prendeva CTRL+C (SendKeys "^C", True) e neppure CTRL+V (SendKeys
"^V",
True), allora ho ripiegato sulla API di Windows "keybd_event". Alla
fine sono
arrivato a farlo funzionare ma ho dovuto mettere delle pause (orrore!)
altrimenti faceva un po' quello che voleva lui: ogni volta che lanciavo
la
routine ottenevo dei risultati diversi, copiava solo certe righe,
lasciava
delle righe vuote, etc. Penso però che mettere le pause non sia la
soluzione
migliore, quindi vorrei chiedere consigli...
Nel modulo:
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte,
ByVal
bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public Sub KeyDown(vbk As Byte)
    keybd_event vbk, 0, 0, 0
End Sub
Public Sub KeyUp(vbk As Byte)
    keybd_event vbk, 0, KEYEVENTF_KEYUP, 0
End Sub
Nella form:
Private Const Attesa As Single = 0.04
Private Sub pausa()
    Static Fine As Single
    Fine = Timer + Attesa
    While Timer < Fine: Wend
End Sub
Private Sub cmd0_Click()
    Dim i As Integer
    For i = 2 To 50
        DoEvents
        AppActivate "Applicazione"
        pausa
        Call VaiGiu
        pausa
        Call CopiaTesto
        pausa
        DoEvents
        AppActivate "Microsoft Excel - MioFile.xls"
        pausa
        Call VaiGiu
        pausa
        Call IncollaTesto
        pausa
    Next
End Sub
Private Sub CopiaTesto()
    KeyDown vbKeyControl
    KeyDown vbKeyC
    KeyUp vbKeyC
    KeyUp vbKeyControl
End Sub
Private Sub IncollaTesto()
    KeyDown vbKeyControl
    KeyDown vbKeyV
    KeyUp vbKeyV
    KeyUp vbKeyControl
End Sub
Private Sub VaiGiu()
    KeyDown vbKeyDown
    KeyUp vbKeyDown
End Sub
Grazie a tutti!
Pileggi

Pileggi ha scritto:

Sinceramente non ho letto tutto il post, ma la soluzione usata a mio
avviso non è
valida...!
Per me dovresti ricorrere alla ClipBoard(API) purtroppo dovendo
muoverti su 2 applicazioni diverse....!
Trovi molto codice per VB6 su vbAccelerator, dovresti, con un pò di
fatica, riuscire a risolvere in modo più adeguato...!
@Alex

 ha scritto nel messaggio
news:1158854960.0...@b28g2000cwb.googlegroups.com...














Grazie a tutti!
Pileggi
Ci provo.
Se il problema è trasferire dati da access ad excel, perché non usi il
metodo TRANSPOSE in automazione?
Sul workbook ti crei un foglio di servizio sul quale trasponi in una sola
volta tutti i tuoi dati. Poi li gestisci con i riferimenti assoluti sugli
altri fogli.
Quindi, prima ottieni i dati di cui hai bisogno con ADO, metti tutto in una
o più matrici con il metodo GetRows e infine trasferisci il malloppo.
Il metodo riduce al minimo i tempi di elaborazione (alti perché il server di
automazione è fuori-processo), crea una matrice trasposta (le colonne
diventano righe e viceversa) che trasferisce in blocco e non t'incasina con
le API.
L'unica cosa alla quale dei porre attenzione sono i campi NULL (con un campo
null, transpose fallisce).
Siate clementi se ho detto una stupidaggine :)
Ciao

 fatica, riuscire a risolvere in modo più adeguato...!
Ti ringrazio ho trovato questi due link sul sito di Karl
Per inviare testo alla clipboard:
http://support.microsoft.com/?kbid=210216
Per recuperarlo dalla clipboard:
http://support.microsoft.com/?kbid=210213
ma mi rimane un problema: la funzione API per inviare testo alla
clipboard prevede che questo testo io ce l'abbia sotto forma di
stringa, mentre invece io devo prelevarlo dall'applicazione, come fare
senza usare una combinazione di tasti della tastiera?
Grazie ancora,
Pileggi

Pileggi ha scritto:

Qual'è l'applicazione in partenza....?
Da come avevo capito è Access, quindi se si trova in una TextBox ti
basta selezionarla
e mandarla in ClipBoard come testo .....
Forse ho capito male...?
@Alex

 Forse ho capito male...?
Si, in realtà io Access lo uso solo per scrivere il codice,
l'Applicazione di partenza è un programma che contiene indirizzi.
Mi sono ricordato del tuo tutorial sulle API che mi avevi indicato
tempo fa per un altro problema, c'era una maschera di Access che
prelevava il testo del NotePad tramite la funzione SendMessageSTRING il
problema è che nel mio caso non conosco la classe della
finestra-figlia, nel tuo esempio per il NotePad, scrivevi "Edit", forse
posso usare questa classe anche nel mio caso? Intanto provo...
Grazie,
Pieggi

Pileggi ha scritto:

Certo che si, se non conosci il nome della Classe serve che usi un
programma come
SPY++ che ti restituisce l'Handle ed il ClassName, a quel punto con
FindWindowEx
recuperi l'Handle via Codice e con SendMessage recuperi il Testo in
esso contenuto.
C'è un pò da giocare, ma si riesce...!
@Alex