Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Adobe Acrobat Automation
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
COM/DCOM et OLE Automation
Divers
Thread ID:
01062691
Message ID:
01063750
Vues:
32
We no longer do this, but we did at one time and it worked rather well. We switched to a 3rd party toolkit though since we have around 400 pdf forms that had to be generated and this method takes some configuration initially for all formfields on the forms.

1) Enter dummy data onto a form in Acrobat 6 and export the data to .xfdf format. The .xfdf file is an xml file. When you open Adobe Reader and point to an .xfdf file and there are both a .pdf file (form image) and an .xfdf file (data) Adobe Reader launches the .pdf form and populates the fields with the data in the .xfdf file. Use the .xfdf file created when you exported the dummy data to determine the xml values required to populate the fields on the fly.
2) Stuff the .pdf into a memo field in a table of all forms using FILETOSTR().
3) When the user prints a form, we create both the .pdf and the appropriate .xfdf file on the fly. We use STRTOFILE() to create the .pdf form.
4) If the user has Adobe Reader on their hard drive (we search for it programmatically by checking registry associations and locations on the hard drive if necessary) launch Adobe Reader programmatically from within Visual FoxPro app pointing to the .xfdf file created and Adobe Reader loads with the pdf and the fields populated with the data from the Visual FoxPro app. Use CreateProcess and GetExitCodeProcess to launch Adobe Reader and wait for it to exit. Alternatively, you use the web browser control on a vfp form to launch the form (we do this).
5) When Adobe Reader closes (we suspend processing in our app until it is exited) delete both the .xfdf and the .pdf file

Create a table that maps out the order of the fillable form fields/tags and then generate the .xfdf file on the fly. for example, We used a table called acordefn which contained the formname, formfield, and the order of the tag.
Acordefn table:
formname     formfield           formorder
25           AGENCY.ADDR1           1      && 1st tag
25           AGENCY.NAME            2      && 2nd tag
Example generated .xfdf file:
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f href="../finishedforms/130.pdf"/>
<ids original="09C45E0011319E1D16B7987F78A4F5FB" modified="9CE596CE9498FF4DB24C5CA7F3594705"/>
<fields>
   <field name="AGENCY">
      <field name="ADDR1">
         <value>sdffdfd</value>
      </field>
      <field name="NAME">
         <value>dfsdfdf</value>
      </field>
   </field>
</fields>
</xfdf>
Below is a program that we used in the past to generate the .xfdf file. We also had a table named acordict that mapped fillable form field tags to our variables. It is one of the original drafts that worked and it could be modified, streamlined, etc. For instance this example searches the registry for Adobe Reader, enters a password for passworded forms, and also launches Adobe Reader which in unecessary since the webbrowser is much more suitable for viewing the pdf form. The portion scanning the acordefn table and generating the .xfdf file may be useful though.
PARAMETERS xacordform
IF TYPE('xacordform')<>"C" .OR. EMPTY(xacordform)
   RETURN .F.
ENDIF
IF TYPE('li_acord')<>"L" .OR. !li_acord   && no acord license
   RETURN .F.
ENDIF
IF TYPE('li_acordview')<>"L"
   RETURN .F.
ENDIF
IF TYPE('dopass') ="U"
   dopass = .F.      && do not process password on acord pdf forms
ENDIF
PRIVATE acordalias, tempfile, pdffile, lcsetsafety, xreturn
acordalias = ALIAS()
tempfile = hdir+xacordform+'.xfdf'
pdffile  = hdir+xacordform+'.pdf'
lcsetsafety = SET('SAFETY')
xreturn = .F.
SET SAFETY OFF
IF FILE(pdffile)      && .pdf file
   DELETE FILE (pdffile)
ENDIF
IF FILE(tempfile)      && .xfdf file
   DELETE FILE (tempfile)
ENDIF
IF UseFile("ACORDEFN",ddir)
   IF UseFile("ACORDICT",ddir)
      DO AcordGen
      DO AcordExe
   ENDIF
ENDIF
IF USED("ACORDICT")   && holds acord/policy profiler data dictionary
   USE IN ACORDICT
ENDIF
IF USED("ACORDEFN")   && holds field definitions
   USE IN ACORDEFN
ENDIF
IF !EMPTY(acordalias) .AND. ALIAS() <> acordalias
   SELECT (acordalias)
ENDIF
IF !EMPTY(lcsetsafety)
   SET SAFETY &lcsetsafety
ENDIF
IF FILE(pdffile)      && .pdf file
   DELETE FILE (pdffile)
ENDIF
IF FILE(tempfile)      && .xfdf file
   DELETE FILE (tempfile)
ENDIF
RETURN xreturn
 
PROCEDURE AcordGen
SELECT Acordefn.formname, Acordefn.formfield, Acordefn.formorder,;
  Acordict.profiler, 01 AS starttag, 00 AS endtag;
 FROM ;
     acordefn ;
    LEFT OUTER JOIN acordict ;
   ON  Acordefn.formfield = Acordict.formfield;
 WHERE  Acordefn.formname = ( xacordform );
 ORDER BY Acordefn.formorder;
 INTO CURSOR Acordfields READWRITE 
SELECT Acordfields
GOTO TOP
PRIVATE m.output
m.output = FCREATE(tempfile,0)
IF m.output < 0
   =MESSAGEBOX("Could not create '+tempfile+' Acord xml file.",0+16+4096,"ERROR")
   RETURN
ENDIF
PRIVATE ifields, mfield, mvalue
ifields = 1
mfield = ''
mvalue = ''
DIMENSION fNames[1], fTagNames[1]
fNames = ''
fTagNames = ''
PRIVATE i, iRecCount, iRecNo, iFieldCount, iFieldNo
iRecCount = RECCOUNT()
*---Remove duplicate tags
FOR iRecNo = 1 TO iRecCount
   GOTO iRecNo
   *---Expand field name
   mfield = Acordfields.formfield
   ifields = OCCURS('.', mfield) + 1
   DIMENSION fNames[ifields]
   fNames = ''
   FOR i = 1 TO ifields
      IF OCCURS('.', mfield) > 0
         fNames[i] = SUBSTR(mfield, 1, AT('.', mfield))
         mfield = SUBSTR(mfield, AT('.', mfield)+1)
      ELSE
         fNames[i] = mfield
         mfield = ''
      ENDIF
   NEXT
   *---Initialize EndTag
   REPLACE AcordFields.endtag WITH ifields
   *---Step through the field names.  Skip the last one
   iFieldCount = ifields - 1
   FOR iFieldNo = 1 TO iFieldCount
      IF fNames[iFieldNo] = '*.'
         LOOP
      ENDIF
      GOTO iRecNo
      SKIP
      SCAN REST
         *---Expand field name
         mfield = Acordfields.formfield
         ifields = OCCURS('.', mfield) + 1
         DIMENSION fTagNames[ifields]
         fTagNames = ''
         FOR i = 1 TO ifields
            IF OCCURS('.', mfield) > 0
               fTagNames[i] = SUBSTR(mfield, 1, AT('.', mfield))
               mfield = SUBSTR(mfield, AT('.', mfield)+1)
            ELSE
               fTagNames[i] = mfield
               mfield = ''
            ENDIF
         NEXT
         *---Check for Duplicates
         IF TYPE('fTagNames[iFieldNo]') <> 'U'
            IF fNames[iFieldNo] == fTagNames[iFieldNo]
               IF iFieldNo = 1
                  fTagNames[iFieldNo] = '*.'
                  REPLACE Acordfields.starttag WITH Acordfields.starttag + 1
               ELSE
                  IF fTagNames[iFieldNo-1] = '*.'
                     fTagNames[iFieldNo] = '*.'
                     REPLACE Acordfields.starttag WITH Acordfields.starttag + 1
                  ENDIF
               ENDIF
            ELSE
               EXIT
            ENDIF
         ELSE
            EXIT
         ENDIF
         *---Save Record
         mfield = ''
         FOR i = 1 TO ifields
            IF !EMPTY(fTagNames[i])
               mfield = mfield + fTagNames[i]
            ENDIF
         NEXT
         REPLACE Acordfields.formfield WITH mfield
      ENDSCAN
   NEXT
   *---Set EndTag
   GOTO iRecNo
   SKIP
   IF !EOF('Acordfields')
      ifields = OCCURS('*', AcordFields.formfield)
      SKIP -1   
      REPLACE AcordFields.endtag WITH AcordFields.endtag - ifields
   ENDIF
NEXT
*---Write Header
=FWRITE(m.output, '<?xml version="1.0" encoding="UTF-8"?>'+CHR(10))
=FWRITE(m.output, '<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">'+CHR(10))
=FWRITE(m.output, '<f href="'+xacordform+'.pdf"/>'+CHR(10))
=FWRITE(m.output, '<fields>'+CHR(10))
*---Loop through records
GOTO TOP
SCAN
   *---Expand field name
   mfield = Acordfields.formfield
   ifields = OCCURS('.', mfield) + 1
   DIMENSION fNames[ifields]
   fNames = ''
   FOR i = 1 TO ifields
      IF OCCURS('.', mfield) > 0
         fNames[i] = SUBSTR(mfield, 1, AT('.', mfield)-1)
         mfield = SUBSTR(mfield, AT('.', mfield)+1)
      ELSE
         fNames[i] = mfield
         mfield = ''
      ENDIF
   NEXT
   *---Write Tags
   FOR i = 1 TO ifields
      IF i >= Acordfields.starttag
         =FWRITE(m.output, '<field name="'+RTRIM(fNames[i])+'">'+CHR(10))
      ENDIF
   NEXT
   *---Write Value
   mvalue = ''
   IF !ISNULL(AcordFields.profiler) .and. !EMPTY(ALLTRIM(Acordfields.profiler))
      mvalue = EVALUATE(Acordfields.profiler)
   ENDIF
   mvalue = XmlEncode(mvalue)
   =FWRITE(m.output, '<value>'+RTRIM(mvalue)+'</value>'+CHR(10))
   FOR i = 1 TO Acordfields.endtag
      =FWRITE(m.output, '</field>'+CHR(10))
   NEXT
ENDSCAN
=FWRITE(m.output, '</fields>'+CHR(10))
=FWRITE(m.output, '</xfdf>'+CHR(10))
=FCLOSE(m.output)
USE IN Acordfields
RETURN
 
PROCEDURE AcordExe
PRIVATE cAppName, lcresult, lcline, llacordok, lcACORDdef
PRIVATE lnpos, lcpath, lcshort
cAppName = ''
lcresult = ''
lcline = ''
llacordok = .T.
lcACORDdef = SYS(5)+SYS(2003)
lnpos = 0
lcshort = ''
lcpath = ''
IF FILE(tempfile)
   IF UseFile("ACORDFRM",ddir,"FORMNAME")
      IF INDEXSEEK(UPPER(ALLTRIM(xacordform)),.T.,'ACORDFRM','FORMNAME')
         =STRTOFILE(ACORDFRM.FORMDATA,pdffile)
      ELSE
         =MESSAGEBOX("Cannot locate form:"+UPPER(ALLTRIM(xacordform))+" in forms table.",0+16+4096,"ERROR - Form Missing in Form Table.")
      ENDIF
      USE IN ACORDFRM
   ENDIF
   IF FILE(pdffile)
      DO DECLexewait
      lcresult = Acrofind()
      IF EMPTY(lcresult)
         lcresult = readregistrykey()
         IF OCCURS('"',lcresult)>0
            IF TYPE('lcresult')="C" .AND. !EMPTY(lcresult)
               m.cAppName=SUBSTR(lcresult,2,AT('"',lcresult,2)-2)
            ELSE
               m.cAppName = ''
            ENDIF
         ELSE
            m.cAppName = lcresult+"AcroRd32.Exe"
         ENDIF
      ELSE
         m.cAppName = lcresult
      ENDIF
      IF FILE(m.cAppName)   && AcroRd32.exe
         lcline = " /p /h "
         IF li_acordview   && preview in acrobat reader so user can select printer by ctrl-p
            lcline = ""
         ENDIF
         SET DEFAULT TO LEFT(hdir,RAT("\",hdir)-1)
         lnpos=(RAT("\",m.cAppName)+1)   && one position to the right of
         lcshort=''
         lcpath=''
         IF lnpos > 0
            lcshort = UPPER(SUBSTR(m.cAppName,lnpos))   && grab from lnpos to end
            lcpath  = UPPER(LEFT(m.cAppName,RAT("\",m.cAppName)-1))         && strip off the extension
         ENDIF
         IF !EMPTY(lcshort) .AND. !EMPTY(lcpath)
            lcpath = "'"+lcpath+"'"
            SET DEFAULT TO &lcpath
            llacordok = ExeWait(lcshort,lcline+hdir+xacordform+'.xfdf',lcpath)
         ELSE
            llacordok = ExeWait( m.cAppName, lcline+xacordform+'.xfdf',hdir)
         ENDIF
         IF !llacordok
            =MESSAGEBOX("Unable to print Acord Form.",0+16+4096,"ERROR")
         ELSE
            WAIT WINDOW "Finished Printing" NOWAIT
         ENDIF
         SET DEFAULT TO &lcACORDdef
      ELSE
         =MESSAGEBOX('Unable to locate Acrobat Reader. Please install and try again',0+16+4096,'ERROR - Acrobat Reader Missing.')
      ENDIF
      DO RELexewait
   ELSE
      =MESSAGEBOX("Unable to create Acord Form.",0+16+4096,"ERROR - PDF or XFDF Missing.")
   ENDIF
ELSE
   =MESSAGEBOX("Unable to create Acord Form.",0+16+4096,"ERROR - PDF or XFDF Missing.")
ENDIF
xreturn = .T.
RETURN
 
PROCEDURE DECLexewait  && load required dlls for exewait function
=ADLLS(dllarray)
IF ASCAN(dllarray,'CREATEPROCESS') = 0
   DECLARE INTEGER CreateProcess IN kernel32;
      INTEGER lpAppName, STRING lpCmdLine, INTEGER lpProcAttr,;
      INTEGER lpThrAttr, INTEGER bInhHandles, INTEGER dwCrFlags,;
      INTEGER lpEnvir, INTEGER lpCurDir, ;
      STRING @lpStInfo, STRING @lpProcInfo
ENDIF
IF ASCAN(dllarray,'GETLASTERROR') = 0
   DECLARE INTEGER GetLastError IN kernel32
ENDIF
IF ASCAN(dllarray,"CLOSEHANDLE") = 0
   DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
ENDIF
IF ASCAN(dllarray,"GETEXITCODEPROCESS") = 0
   DECLARE INTEGER GetExitCodeProcess IN WIN32API INTEGER hProcess, INTEGER @lpExitCode
ENDIF
IF ASCAN(dllarray,"SLEEP") = 0
   DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
ENDIF
RETURN
 
PROCEDURE RELexewait  && release dlls for exewait function
CLEAR DLLS CreateProcess
CLEAR DLLS GetLastError
CLEAR DLLS CloseHandle
CLEAR DLLS GetExitCodeProcess
CLEAR DLLS Sleep
RETURN
 
FUNCTION buf2dword(lcBuffer)
RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ;
   ASC(SUBSTR(lcBuffer, 2,1)) * 256 +;
   ASC(SUBSTR(lcBuffer, 3,1)) * 65536 +;
   ASC(SUBSTR(lcBuffer, 4,1)) * 16777216
 
FUNCTION readregistrykey
 
#DEFINE HKEY_CLASSES_ROOT           -2147483648
#DEFINE HKEY_CURRENT_USER           -2147483647
#DEFINE HKEY_LOCAL_MACHINE          -2147483646
#DEFINE HKEY_USERS                  -2147483645
#DEFINE REG_SZ             1   && String
#DEFINE REG_BINARY         3   && Binary data
#DEFINE REG_DWORD          4   && 32bits int
#DEFINE ERROR_SUCCESS      0   && OK
LOCAL nKey, cSubKey, cValue, cValueRead
nKey = HKEY_LOCAL_MACHINE
cSubKey = "Software\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe"
cValue = "Path"
cValueRead = ReadREG_SZ(nKey, cSubKey, cValue)
IF EMPTY(cValueRead)
   cValueRead = ''
ENDIF
RETURN cValueRead
 
FUNCTION ReadREG_SZ
PARAMETERS  nKey, cSubKey, cValue
DECLARE INTEGER RegOpenKey IN Win32API ;
   INTEGER nHKey, STRING @cSubKey, INTEGER @nResult
DECLARE INTEGER RegQueryValueEx IN Win32API ;
   INTEGER nHKey, STRING lpszValueName, INTEGER dwReserved,;
   INTEGER @lpdwType, STRING @lpbData, INTEGER @lpcbData
DECLARE INTEGER RegCloseKey IN Win32API INTEGER nHKey
LOCAL nErrCode      && Error Code returned from Registry functions
LOCAL nKeyHandle    && Handle to Key that is opened in the Registry
LOCAL lpdwValueType && Type of Value that we are looking for
LOCAL lpbValue      && The data stored in the value
LOCAL lpcbValueSize && Size of the variable
LOCAL lpdwReserved  && Reserved Must be 0
nKeyHandle = 0
lpdwReserved = 0
lpdwValueType = REG_SZ
lpbValue = ""
nErrCode = RegOpenKey(nKey, cSubKey, @nKeyHandle)
IF (nErrCode # 0) THEN
   RETURN ""
ENDIF
lpcbValueSize = 1
nErrCode=RegQueryValueEx(nKeyHandle, cValue, lpdwReserved, @lpdwValueType, @lpbValue, @lpcbValueSize)
lpbValue = SPACE(lpcbValueSize)
nErrCode=RegQueryValueEx(nKeyHandle, cValue, lpdwReserved, @lpdwValueType, @lpbValue, @lpcbValueSize)
=RegCloseKey(nKeyHandle)
CLEAR DLLS RegOpenKey
CLEAR DLLS RegQueryValueEx
CLEAR DLLS RegCloseKey
IF (nErrCode # 0) THEN
   RETURN ""
ENDIF
lpbValue = LEFT(lpbValue, lpcbValueSize - 1)
RETURN lpbValue
 
FUNCTION Acrofind
PRIVATE WNetGetConnection, lpszLocalname, lpszRemoteName, ;
   sLen, Lni, DRIVE, Dtype, llfound, Lni
PRIVATE ARRAY afilesfound(1,3)
DIMENSION afilesfound(1,3)
afilesfound(1,1)=" "
llfound = .F.
Lni = 0
DECLARE INTEGER WNetGetConnection IN win32api ;
   STRING lpszLocalName,;
   STRING lpszRemoteName,;
   INTEGER @ lpchBuffer && Declare the external WNetGetConnection ;
   API FUNCTION
slpRemoteName = SPACE(254) && Initialize variables
sLen = LEN(slpRemoteName) && Initialize variables
*--Populate the one dimensional array with valid drive letters
FOR I = 1 TO 26 && Loop through drive letters A thru Z
   DRIVE = CHR(I + 64)
   Dtype = DRIVETYPE(DRIVE) && Determine drive type
   DO CASE
      CASE Dtype = 3 && Hard drives
         Lni=Lni+1
         DIMENSION adrivelist(Lni,3)
         adrivelist(Lni,1)=DRIVE
         adrivelist(Lni,2)=.F.
         adrivelist(Lni,3)=.F.
      CASE Dtype = 4 && Removable or network drives
         iSuccess = WNetGetConnection(DRIVE + ;
            ":",@slpRemoteName,@sLen)
         IF iSuccess = 0
            Lni=Lni+1
            DIMENSION adrivelist(Lni,3)
            adrivelist(Lni,1)=DRIVE
            adrivelist(Lni,2)=.F.
            adrivelist(Lni,3)=.F.
         ENDIF
   ENDCASE
ENDFOR
llfound = .F.
FOR Lni = 1 TO ALEN(adrivelist,1)
   FOR ib = 10 TO 1 STEP -1
      lcacrofile = adrivelist(Lni,1)+":"+"\Program Files\Adobe\Acrobat "+ALLTRIM(STR(ib))+".0\Reader\AcroRd32.Exe"
      IF FILE(lcacrofile)
         llfound = .T.
         EXIT
      ENDIF
   ENDFOR
   IF llfound
      EXIT
   ENDIF
ENDFOR
CLEAR DLLS WNetGetConnection
IF llfound
   RETURN lcacrofile
ELSE
   RETURN ''
ENDIF
 
PROCEDURE  ExeWait (lcApp, lcCmdLine, lcdir)
PRIVATE lntimes
lntimes = 0
IF _VFP.AUTOYIELD = .F.
   llsetback = .T.
ELSE
   llsetback = .F.
ENDIF
_VFP.AUTOYIELD = .T.
PRIVATE lnclosepass
lnclosepass = 0
#DEFINE INFINITE  0xFFFFFFFF
LOCAL lcStartupInfo, lcProcInfo, hProcess, ;
   lnPrio, lnIBelieve1
lnIBelieve1 = 1   && Don't remember what that was
lnPrio = 32 && Priority of Process=Normal
lcStartupInfo = CHR(68) + REPLI(CHR(0), 67)
lcProcInfo = REPLI(CHR(0), 16)
IF CreateProcess(0, m.lcApp+" "+m.lcCmdLine+CHR(0), 0,0,;
      m.lnIBelieve1, m.lnPrio,;
      0, 0, @lcStartupInfo, @lcProcInfo) <> 0
   hProcess = buf2dword(SUBSTR(lcProcInfo, 1,4))
   hThread = buf2dword(SUBSTR(lcProcInfo, 5,4))
   DOEVENTS
   IF !li_acordview                  && printing only
      DO stopadobe
   ELSE
      DO WHILE .T.
         exitcode = 0               && initialize return value to 0
         = GetExitCodeProcess(hProcess, @exitcode)   && try to obtain process exit code
         IF exitcode # 259            && not still busy
            EXIT                     && fall out of loop
         ELSE
            *--Attempt to close the password window up to 3 times
            IF dopass .and. lnclosepass < 3 .AND. PassWin('Password')
               = Sleep (1000)         && wait 1 seconds
               lnclosepass = lnclosepass + 1
            ENDIF
         ENDIF
         = Sleep (100)               && wait .1 seconds
      ENDDO
   ENDIF
   = CloseHandle(hThread)
   = CloseHandle(hProcess)
ELSE
   IF llsetback
      _VFP.AUTOYIELD = .F.
   ENDIF
   RETURN .F.
ENDIF
IF llsetback
   _VFP.AUTOYIELD = .F.
ENDIF
RETURN
 
FUNCTION PassWin
PARAMETER tcTitle
DECLARE INTEGER FindWindow IN Win32API AS FindWindow STRING, STRING
lnwindow = FindWindow(0,tcTitle)
IF lnwindow > 0
   #DEFINE WM_SETFOCUS             0x0007
   #DEFINE KEYEVENTF_KEYUP         2
   #DEFINE VK_SHIFT                0x10
   DECLARE SHORT PostMessage IN user32;
      INTEGER   HWND,;
      INTEGER   Msg,;
      STRING   wParam,;
      INTEGER   LPARAM
   DECLARE INTEGER SetForegroundWindow IN Win32API;
      INTEGER HWND
   DECLARE INTEGER SetActiveWindow IN Win32API;
      INTEGER HWND
   DECLARE keybd_event IN Win32API;
      INTEGER bVk, INTEGER bScan,;
      INTEGER dwFlags, INTEGER dwExtraInfo
   HWND = lnwindow
   ReturnValue = PostMessage(HWND, WM_SETFOCUS, 0, 0)
   lcsentence = "~PASSWORD"+CHR(13) && change to valid form password
   = SetActiveWindow(HWND)
   = SetForegroundWindow(HWND)
   FOR Lni = 1 TO LEN(lcsentence)
      lcchar = SUBSTR(lcsentence, Lni, 1)
      IF lcchar <> "~"
         llshift = ISUPPER(lcchar)
         lnchar = ASC(UPPER(lcchar))
         IF llshift
            = keybd_event(VK_SHIFT, 0, 0, 0)
         ENDIF
         = keybd_event(lnchar, 0, 0, 0)
         = keybd_event(lnchar, 0, KEYEVENTF_KEYUP, 0)
         IF llshift
            = keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
         ENDIF
      ELSE
         lnchar = 192
         = keybd_event(VK_SHIFT, 0, 0, 0)
         = keybd_event(lnchar, 0, 0, 0)
         = keybd_event(lnchar, 0, KEYEVENTF_KEYUP, 0)
         = keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
      ENDIF
   NEXT
   CLEAR DLLS PostMessage
   CLEAR DLLS SetForegroundWindow
   CLEAR DLLS SetActiveWindow
   CLEAR DLLS keybd_event
   CLEAR DLLS FindWindow
   RETURN .T.
ELSE
   CLEAR DLLS FindWindow
   RETURN .F.
ENDIF
 
PROCEDURE stopadobe
PARAMETERS hThread
DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
DO WHILE !Passwin('Password') .and. lnclosepass < 10
   lnclosepass = lnclosepass + 1
   =SLEEP(300)
ENDDO
=Sleep(5000)
LOCAL awin_apps, vfp_handle, ln_current_window,ln_window_count
DIMENSION awin_apps[1,2]
vfp_handle=0
DECLARE INTEGER FindWindow ;
   IN win32api ;
   INTEGER nullpointer, ;
   STRING cwindow_name
DECLARE INTEGER GetWindow ;
   IN win32api ;
   INTEGER ncurr_window_handle, ;
   INTEGER ndirection
DECLARE INTEGER GetWindowText ;
   IN win32api ;
   INTEGER n_win_handle, ;
   STRING @ cwindow_title, ;
   INTEGER ntitle_length
vfp_handle=FindWindow(0,_SCREEN.CAPTION)
ln_current_window=vfp_handle
ln_window_count=0
DO WHILE ln_current_window>0
   lc_window_title=SPACE(255)
   ln_length=GetWindowText(ln_current_window, ;
      @lc_window_title,LEN(lc_window_title))
   IF ln_length>0
      lc_window_title=STRTRAN(TRIM(lc_window_title),CHR(0),"")
   ELSE
      lc_window_title=""
   ENDIF
   IF ln_current_window>0 .AND. !EMPTY(lc_window_title)
      ln_window_count=ln_window_count+1
      DIMENSION awin_apps(ln_window_count,2)
      awin_apps[ln_Window_Count,1]=lc_window_title
      awin_apps[ln_Window_Count,2]=ln_current_window
   ENDIF
   ln_current_window=GetWindow(ln_current_window,2)
ENDDO
PRIVATE it
FOR it = 1 TO ALEN(awin_apps,1)
   IF "Adobe" $ awin_apps(it,1)
      IF TYPE('awin_apps(it,2)')="N"
         =close2(awin_apps(it,2))
      ENDIF
   ENDIF
ENDFOR
RETURN .T.
 
PROCEDURE close2
PARAMETERS HWND
#DEFINE WM_CLOSE 16
#DEFINE WM_SETFOCUS 0x0007
DECLARE SHORT PostMessage IN user32;
   INTEGER   HWND,;
   INTEGER   Msg,;
   STRING   wParam,;
   INTEGER   LPARAM
DECLARE INTEGER SetForegroundWindow IN Win32API;
   INTEGER HWND
DECLARE INTEGER SetActiveWindow IN Win32API;
   INTEGER HWND
=PostMessage(HWND, WM_SETFOCUS, 0, 0)
=PostMessage(HWND, WM_CLOSE, 0, 0)
RETURN .T.
 
FUNCTION XmlEncode
LPARAMETERS teExpression
LOCAL lcReturn
lcReturn = TRAN(teExpression)
IF VARTYPE(teExpression) = 'C'
   lcReturn = ALLTRIM(lcReturn)
   lcReturn = STRTRAN(lcReturn, '&', '&')
   lcReturn = STRTRAN(lcReturn, '<', '&&#108;t;')
   lcReturn = STRTRAN(lcReturn, '>', '>')
   lcReturn = STRTRAN(lcReturn, '"', '"')
   lcReturn = STRTRAN(lcReturn, "'", '&apos;')
ENDIF 
RETURN lcReturn
 
FUNCTION XMLDeCode
LPARAMETERS cTXT
LOCAL i,ch
FOR i=1 TO 255
  ch=ALLTRIM(STR(i))
  cTXT=STRTRAN(cTXT,"&#"+ch+";",CHR(i))
ENDFOR 
RETURN cTXT
.·*´¨)
.·`TCH
(..·*

010000110101001101101000011000010111001001110000010011110111001001000010011101010111001101110100
"When the debate is lost, slander becomes the tool of the loser." - Socrates
Vita contingit, Vive cum eo. (Life Happens, Live With it.)
"Life is not measured by the number of breaths we take, but by the moments that take our breath away." -- author unknown
"De omnibus dubitandum"
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform