Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119

    [VB6] "Sendkeys" del contenuto di una variabile

    Salve,

    avrei bisogno di "mandare" una label1.caption di un mio programmino ad una text1.text di un applicazione esterna...

    Posso usare SendKeys ? Come?

    E' ovvio che non conosco a priori label1.caption, altrimenti non si porrebbe il problema.

    label1.caption è il risultato di calcoli del mio programmino (es: 13.54), che serve come input ad un'applicazione esterna.


    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    ...Forse ho risolto così.. ditemi cosa ne pensate..

    Clipboard.Clear
    Clipboard.SetText (label1.Caption)

    poi nel programma esterno mando i TAB per arrivare sulla textbox che voglio e invio qualche CANC per cancellarla...

    Dopodichè mando CTRL+V (che mi pare sia "^V")....


    Se avete qualche idea per renderlo meno macchinoso mi fate un favore, comunque così dovrebbe andare..

    (Ora è meglio se vado a dormire, domani si vedrà..)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    Scusate ho provato questo codice ma succede una cosa strana... ho tre label che contengono i valori: 10 , 11 , 12.
    La finestra immediata mi mostra i valori corretti mentre sul notepad mi viene visualizzato:
    12
    12
    12

    Risulta solo l'ultimo, come è possibile?



    codice:
        Private Sub Command1_Click()
    TaskId = Shell("Notepad", vbMaximizedFocus)
    AppActivate TaskId
        Clipboard.Clear
        Clipboard.SetText (Label1.Caption)
        Debug.Print Clipboard.GetText
        SendKeys "^V" ' ctrl-V
        SendKeys "{ENTER}"
    
        Clipboard.Clear
        Clipboard.SetText Label2.Caption
            Debug.Print Clipboard.GetText
            SendKeys "^V" ' ctrl-V
            SendKeys "{ENTER}"
        Clipboard.Clear
        Clipboard.SetText Label3.Caption
            Debug.Print Clipboard.GetText
            SendKeys "^V" ' ctrl-V
    End Sub
    Ho provato ad inserire doevents dopo ogni ctrl-v e ora funziona, ma come si spiega la cosa?

    Grazie

  4. #4
    ciao,
    il codice sembra giusto, evidentemente c'è qualcosa che riguarda la clipboard che ci sfugge...
    non utilizzare la clipboard, ma metti direttamente:
    codice:
    Private Sub Command1_Click()
        TaskId = Shell("Notepad", vbMaximizedFocus)
        AppActivate TaskId
        
        SendKeys Label1.Caption & "{ENTER}"
        SendKeys Label2.Caption & "{ENTER}"
        SendKeys Label3.Caption & "{ENTER}"
    
    End Sub
    ...anche perchè la clipboard è comunque meglio lasciarla come ultima soluzione, dovresti prima salvarti quello che c'è in memoria (quello che l'utente ha copiato), poi rimette il contenuto a posto.
    Do' per scontato che utilizzi il blocco note solo per le prove, altrimenti ci sono soluzioni migliori...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    Originariamente inviato da Luciano79

    Do' per scontato che utilizzi il blocco note solo per le prove, altrimenti ci sono soluzioni migliori...
    Sì, è la prima cosa che mi è venuta in mente per fare prove rapide...

    Grazie per la risposta, non pensavo che sendkeys potesse avere come argomento una variabile...

    Sì può dire che ho risolto il problema ma quel malfunzionamento che ho descritto sopra mi ha incuriosito molto... non capisco come sia possibile... Qualcuno l'ha provato?

    mi riferisco a questo:
    codice:
    Private Sub Command1_Click()
    TaskId = Shell("Notepad", vbMaximizedFocus)
    AppActivate TaskId
        Clipboard.Clear
        Clipboard.SetText (Label1.Caption)
        Debug.Print Clipboard.GetText
        SendKeys "^V" ' ctrl-V
        SendKeys "{ENTER}"
    
        Clipboard.Clear
        Clipboard.SetText Label2.Caption
            Debug.Print Clipboard.GetText
            SendKeys "^V" ' ctrl-V
            SendKeys "{ENTER}"
        Clipboard.Clear
        Clipboard.SetText Label3.Caption
            Debug.Print Clipboard.GetText
            SendKeys "^V" ' ctrl-V
    End Sub
    Come è possibile che riporti 3 volte la label3.caption???

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Questo codice

    codice:
        TaskId = Shell("Notepad", vbMaximizedFocus)
        AppActivate TaskId
        
        Clipboard.Clear
        Clipboard.SetText Label1.Caption
        SendKeys "^V{ENTER}"
        DoEvents
        
        Clipboard.Clear
        Clipboard.SetText Label2.Caption
        SendKeys "^V{ENTER}"
        DoEvents
        
        Clipboard.Clear
        Clipboard.SetText Label3.Caption
        SendKeys "^V{ENTER}"
        DoEvents
    lavora correttamente perche' ogni DoEvents permette alla "pompa dei messaggi" di windows di lavorare correttamente.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    Ma, scusa oregon, è come dire che il comando sendkeys è più lento degli altri ? e quindi quando "arriva" il primo sendkeys la clipboard contiene già l'ultima label?

    E' curioso, di solito si considera che ad ogni riga di codice corrisponda l'azione associata , ma evidentemente non è così...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    L'azione associata alla SendKeys e' *asincrona*. L'esecuzione della SendKeys, dal punto di vista del VB, consiste nell'invio di una serie di messaggi WM_KEYDOWN e WM_KEYUP (come saprai, Windows lavora elaborando, finestra per finestra e thread per thread quando serve, una coda di messaggi inviati da altre parti del sistema) a Windows; e' il gestore della coda dei messaggi di Windows che ha la responsabilita' di tradurre tutti i messaggi nelle vere e proprie azioni, indipendentemente dal codice VB che continua ad essere elaborato.

    Quando VB esegue del codice in una Sub pero', *non lascia* il controllo al gestore dei messaggi di Windows (che deve elaborare la coda dei messaggi che si sta riempiendo ...) ma lo fa soltanto alla fine. Quando si trova alla fine della Sub, tutti i messaggi WM_KEYDOWN e WM_KEYUP vengono eseguiti da Windows che svuota la coda e che si trova 3 ^V e il testo dell'ultima label nella clipboard.

    Se inserisci un DoEvents dopo la SendKeys, indichi a Windows di elaborare la coda dei messaggi *prima* di continuare con la Sub e quindi elaborare nella giusta sequenza i messaggi WM_KEYDOWN e WM_KEYUP.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.