; ACTSYNC ; ; Programma per Proteus ; ; (C) 2005 Simone Zanella Productions ; ; Introduce in emulazione di tastiera i dati presenti in un file localizzato su un dispositivo connesso via ; ActiveSync. ; Questo programma può essere installato come script associato al servizio Proteus. ; ; I parametri si trovano all'inizio del programma e sono: ; - TIMEOUT = timeout in millisecondi per la risposta del dispositivo ; - KILLFILE = flag che indica se cancellare il file dopo averlo trasmesso; se 0, ; il file non viene rimosso, ma non viene più ritrasmesso finché non cambia la data/ora/dimensione; ; - TEMPFILE = nome del file temporaneo (dove scaricare i dati prima di inviarli in emulazione tastiera) ; - FILENAME = file del terminale da scaricare ; - POSTFIX = terminatore ; ; In dettaglio, il programma esegue le seguenti operazioni: ; - verifica se c'è un dispositivo collegato ed il file da scaricare; ; - se lo trova, lo scarica nel file temporaneo e lo invia in emulazione di tastiera; ; - se è richiesta la cancellazione, rimuove il file, oppure verifica la data/ora/dimensione ; e torna ad inviare il file solo quando uno di questi dati cambia. ; ; Il codice commentato più sotto permette anche in alternativa di: ; - selezionare una specifica finestra (applicativo Ultra-Edit) ed inviare il dato verbatim, seguito da Invio; ; - lanciare il blocco note (se non aperto), introdurre il dato verbatim (seguito da Invio) e tornare alla finestra ; iniziale. #!proteus -z -j !extern CEGetFile, PROTEXT.DLL, ProteusCEGetFile, 4, 0 !extern CEFileInfo, PROTEXT.DLL, ProteusCEFileInfo, 2, 560 !include "win32.prt" CONST TIMEOUT = 3000 CONST KILLFILE = 0 CONST TEMPFILE = "C:\\ACTSYNC.TMP" CONST FILENAME = "/My Documents/dati.txt" CONST POSTFIX = "{ENTER}" LASTCEFIND = "" WHILE 1 ; Rimuove il file temporaneo FREMOVE(TEMPFILE) IF KILLFILE ; Se il file viene rimosso dopo la trasmissione, lo prelevo direttamente RESULT = CEGetFile(FILENAME, TEMPFILE, TIMEOUT, KILLFILE) ELSE ; Verifico data/ora del file e lo scarico solo se cambiate CEFIND = CEFileInfo(FILENAME, TIMEOUT) ; Se non è un servizio e l'utente ha premuto ESC, esce !ifndef SERVICE IF KBDHIT() IF EQ(GETCH(), 27) BREAK FI FI !endif IF ISNOTEMPTY(CEFIND) IF STRNEQ(LEFT(CEFIND, 304), LEFT(LASTCEFIND, 304)) RESULT = CEGetFile(FILENAME, TEMPFILE, TIMEOUT, KILLFILE) IF EQ(RESULT, 0) CEFIND = CEFileInfo(FILENAME, TIMEOUT) IF ISNOTEMPTY(CEFIND) LASTCEFIND = CEFIND FI FI ELSE RESULT = -1 FI ELSE RESULT = -1 FI FI ; Se non è un servizio e l'utente ha premuto ESC, esce !ifndef SERVICE IF KBDHIT() IF EQ(GETCH(), 27) BREAK FI FI !endif IF EQ(RESULT, 0) H = FOPEN(TEMPFILE, 1) IF EQ(H, -1) CONTINUE FI WHILE NOT(FEOF(H)) Dato1 = FREADLN(H) ; >>> Codice di esempio commentato (funzionamento alternativo) <<< ; ; Seleziona una specifica finestra (che sappiamo essere sicuramente esistente) prima di ; inviare il dato in emulazione di tastiera, senza ulteriori elaborazioni, tranne l'aggiunta del postfisso. ; ; IF STRLEN(Dato1) ; W32SETFOCUS(W32FINDWINDOW("*ULTRAEDIT-32*")) ; W32SENDKEYS(KTrans(Dato1) POSTFIX) ; FI ; CONTINUE ; >>> Codice di esempio commentato (funzionamento alternativo) <<< ; ; Seleziona la finestra del Blocco note; se non esiste, lancia il programma, attende 2 secondi, quindi ; introduce il dato in emulazione di tastiera, senza ulteriori elaborazioni. ; Il fuoco (= finestra in primo piano) al termine torna all'applicazione precedentemente in evidenza. ; ; IF STRLEN(Dato1) ; Hold = W32GETFOCUS() ; ; HW = W32FINDWINDOW("*Blocco note*") ; IF EQ(HW, 0) ; W32SHELL("NOTEPAD.EXE") ; SLEEP(2) ; HW = W32FINDWINDOW("*Blocco note*") ; FI ; IF NEQ(HW, 0) ; W32SETFOCUS(HW) ; W32SENDKEYS(KTrans(Dato1) POSTFIX) ; ELSE ; CONSOLELN "Impossibile aprire blocco note!" ; FI ; W32SETFOCUS(Hold) ; FI ; CONTINUE W32SENDKEYS(KTrans(Dato1) POSTFIX) LOOP FCLOSE(H) FI LOOP ABORT 0 FUNCTION KTrans(s) ; Mappatura dei caratteri speciali: caratteri che non si trovano ; sulla tastiera potrebbero richiedere l'introduzione della sequenza ; con ALT + numero l = STRLEN(s) r = "" FOR x = 1 TO l c = SUBSTR(s, x, 1) SWITCH c STREQ ON "~" r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD6}{ALT UP}" ON "{" r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD3}{ALT UP}" ON "}" r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD5}{ALT UP}" ON "+", "^", "%", "(", ")", "[", "]" r = r "{" c "}" OTHER r = r c OFF NEXT RETURN r