Uso della Clipboard di Windows

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
Salve a tutti,
ho scritto un programmino che fa uso della clipboard di Windows 10.
Concettualmente il programma è molto semplice, esegue piccole operazioni in funzione di due risposte (SI - NO), che vengono passate mediante l'impiego della clipboard di Windows 10.
Codice:
(defun ELIMINALIBRETTO (/ Risp1 Risp2 Controllo7 fp4 fp5)

        (SERVOAIUTOICONE)

        (setq Risp1$ nil)
        (setClipText "")

        (startapp "C:\\AutocadSupporto\\LibertyTre\\EliminaLibretto.exe " "C:\\AutocadSupporto\\LibertyTre\\EliminaLibretto.tkn")

        (setq stop (+ 100 (getvar 'millisecs)))
        (while (> stop (getvar 'millisecs)))

        (while (and (/= Risp1$ "SI") (/= Risp1$ "NO"))
            (setq Risp1$ (getClipText))
        );;while

        (princ "\n")
        (princ "Risp1$ >>>>> ")
        (princ Risp1$)
        (princ "\n")

        (setq stop (+ 100 (getvar 'millisecs)))
        (while (> stop (getvar 'millisecs)))

        (if (and (/= Risp1$ "SI") (/= Risp1$ "NO"))
            (progn
                (alert "Errore di lettura")
                (setq Risp1$ nil)
                (setClipText "")
            (vl-exit-with-error "Uscita dal programma")
            );; progn
        );;if           

        (if (= Risp1$ "SI")
            (progn
                (setq dflb (vl-file-delete "C:\\AutocadSupporto\\Libretto\\LibrettoPregeo.dat"))
                (if (= dflb T)
                    (alert "File LibrettoPregeo.dat eliminato")
                    (progn
                        (alert "Il file LibrettoPregeo non esiste")
                        (setq Risp1$ nil)
                        (setClipText "")
                    (vl-exit-with-error "Uscita dal programma")
                    );; progn
                );;if
        );;progn
       );;if

        (if (= Risp1$ "NO")
            (progn
                (alert "Eliminazione LibrettoPregeo annullata")
                (setq Risp1$ nil)
                (setClipText "")
        (vl-exit-with-error "Uscita dal programma")
            );; progn           
        );;if

        (setq Risp1$ nil)
        (setClipText "")
        (setq Risp2$ nil)

        :: ----------------------------------------------------

        (startapp "C:\\AutocadSupporto\\LibertyTre\\ResetPrimaRiga.exe " "C:\\AutocadSupporto\\LibertyTre\\ResetPrimaRiga.tkn")

        (setq stop (+ 100 (getvar 'millisecs)))
        (while (> stop (getvar 'millisecs)))

        (while (and (/= Risp2$ "SI") (/= Risp2$ "NO"))
            (setq Risp2$ (getClipText))
        );;while

        (princ "\n")
        (princ "Risp2$ >>>>> ")
        (princ Risp2$)
        (princ "\n")

        (setq stop (+ 100 (getvar 'millisecs)))
        (while (> stop (getvar 'millisecs)))

        (if (and (/= Risp2$ "SI") (/= Risp2$ "NO"))
            (progn
                (alert "Errore di lettura")
                (setq Risp2$ nil)
                (setClipText "")
            (vl-exit-with-error "Uscita dal programma")
            );; progn
        );;if

        (if (= Risp2$ "SI")
            (progn
        (setq PrimaRiga nil)
            (setq Controllo7 "C:\\AutocadSupporto\\Contatori\\Counter.dat")

            (if Controllo7
                    (progn
                    (setq fp4 (open "C:\\AutocadSupporto\\Contatori\\Counter.dat" "r"))
                            (setq Count (read-line fp4))
                            (setq Passo (read-line fp4))
                        (close fp4)
                    );; progn   
                );;if

                (setq Count "1000")
            (if (= Passo nil)
                (setq Passo "10")
               );;if

                (setq fp5 (open "C:\\AutocadSupporto\\Contatori\\Counter.dat" "w"))
                    (write-line Count fp5)
                    (write-line Passo fp5)
                (close fp5)

                (setq Risp2$ nil)
                (setClipText "")
                (setq Identificativo "000100")
                (alert "Reset Linea di Riferimento avvenuto")
            );; progn
       );;if

       (if (= Risp2$ "NO")
           (progn
               (alert "Reset della Linea di Riperimento annullato")
               (setq Risp2$ nil)
               (setClipText "")
               (setq Identificativo "000000")
           );;progn
       );;if

    );; defun fine comando ELIMINALIBRETTO
Le due risposte (Risp1 e Risp2), sebbene abbia introdotto un ritardo di 100 ms, qualche volta fallisce e ricevo questo errore :

errore: OpenClipboard non riuscita.

Grazie.
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, CadWorx, Lisp, VBA. YouTube: roberto portuese
Regione: Sicilia
il comando startapp è asincrono, Autolisp non aspetta la chiusura del programma avviato per continuare l'esecuzione.
La routine allegata esegue la stessa operazione potendo però specificare se attendere o meno.
 

Allegati

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
Grazie rpor66,
funziona perfettamente!
Non si smette mai di imparare! (se i maestri sono buoni)
Angelo