ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Envoyer des fax en série avec l'imprimante virtuelle de XP   



L'auteur

Luc
France France
Membre Actif (personne physique)
# 0000000060
enregistré le 21/10/2004

http://www.limoog.net
Gilot Luc
01 700 Neyron
Fiche personnelle


Note des membres
pas de note

Contributions > 20 - Trucs et Astuces

Envoyer des fax en série avec l'imprimante virtuelle de XP
# 0000000745
ajouté le 15/03/2010 09:31:37 et modifié le 15/03/2010
consulté 4178 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0

Description

Cete moulinette permet d'envoyer des fax en série en utilisant l'imprimante virtuelle Fax de Windows XP (installée par défaut si votre ordinateur dispose d'un modem).

Elle n'a pas été testée avec autre chose que XP. Elle est donc a priori à usage interne, pour vos propres envois de fax.

Le principe est le suivant :

- une impression vers fax doit être initiée à la main (ca pourrait se faire automatiquement mais ce n'est pas le propos ici : il faudrait définir l'imprimante par défaut puis lancer l'impression avec ShellExecute : sauf erreur de ma part, d'autres articles traitent de ces aspects)

- la moulinette prépare l'envoi du fax à des destinataires multiples : les N°s de fax sont dédoublonnés et vérifiés avant d'être ajoutés à la liste d'envoi de l'imprimante virtuelle, par détection de la fenêtre de l'imprimante virtuelle fax windows, simulation de l'appui des touches de raccourci des boutons, et utilisation du presse-papier.

NB : il est probable que selon les versions de windows l'IHM du fax virtuel change, et que donc les raccourcis claviers ne sont pas les mêmes et qu'il faille donc adapter le programme en conséquence.

Fax_Demo() est une démonstration du fonctionnement, avec des numéros bidon.

Code source :
* xTools_Fax
* LG 20100125

#DEFINE WM_KEYDOWN 0x0100
#DEFINE WM_KEYUP 0x0101
#DEFINE VK_CONTROL 0x11
#DEFINE VK_SHIFT  16
#DEFINE VK_ALT    18
#DEFINE KEYEVENTF_EXTENDEDKEY 1
#DEFINE KEYEVENTF_KEYUP 2

#Define diKeyAlt  1
#Define diKeyCtrl  2
#Define diKeyShift  4

* Lancement du programme de démonstration
Fax_Demo()

***************************************************************************************************************
* Démonstration
* LG 20091113
Function Fax_Demo

  Local lcCurseur
  m.lcCurseur = "MaFaxingList"
  Create Cursor (m.lcCurseur) (Nom C(50), Fax C(10))
  Local liNo, liNb, lcDest, lcNoFax

  * Créer 1 curseur avec 10 N°s de fax bidon
  m.liNb = 10
  For m.liNo = 1 To m.liNb
    Insert Into (m.lcCurseur) ;
      (Nom, Fax) ;
      Values ;
      ("Dest N°" + Transform(m.liNo), Transform(10000000000 - m.liNo))
  Endfor

  * Envoyer les mails
  Fax_MailingAvecCurseur(m.lcCurseur)

  If used(m.lcCurseur)
    Use In (m.lcCurseur)
  Endif

Endfunc

***************************************************************************************************************************************
*
* LG 20100125
Function Private_Fax_Init

  Private_Fax_InitAPIs()

EndFunc

***************************************************************************************************************
*
* LG 20100125
Function Private_Fax_InitAPIs

  * Environnement
  Local lnSele, llKO
  m.lnSele = Sele()

  DECLARE keybd_event IN user32;
      SHORT bVk,;
      SHORT bScan,;
      INTEGER dwFlags,;
      INTEGER dwExtraInfo
  DECLARE INTEGER FindWindow IN user32;
      STRING lpClassName,;
      STRING lpWindowName
  DECLARE SHORT VkKeyScan IN user32;
      INTEGER ch
  DECLARE INTEGER SetForegroundWindow IN user32 INTEGER hwnd
  DECLARE Sleep IN Win32API INTEGER nMilliseconds

  * Environnement
  Sele (m.lnSele)

  * Valeur de retour
  Return Not m.llKO

Endfunc

***************************************************************************************************************************************
*
* LG 20091113
Function Fax_MailingAvecCurseur
  Lparameters pcTable, pbSansSetStep, pcFichLogFax

  * Demander confirmation
  If MessageBox("Envoyer les fax maintenant ?" ;
          + Chr(13) + Chr(13) + "NB : il faut avoir auparavant lancé l'impression d'un document vers le fax, et cliqué sur Suivant pour avoir la fenêtre de saisie des N°s de fax." ;
        , 1 + 32, "FaxMailing") = 2
    * Annuler
    Return .F.
  Endif

  * Initialiser les API et Set Proc
  Private_Fax_Init()

  * Créer le curseur
  Local lcCurseur
  m.lcCurseur = "MaFaxingList"
  Select Nom as cNom, Fax AS cFax ;
    From (m.pcTable) ;
    Into Cursor (m.lcCurseur) ReadWrite

  * Recherche des doublons
  Local lcCurDoublons
  m.lcCurDoublons = "curDoublons"
  Select cFax, Count(*) AS iCnt ;
    From (m.lcCurseur) ;
    Group By cFax ;
    Having iCnt > 1 ;
    Into Cursor (m.lcCurDoublons)
  If Reccount(m.lcCurDoublons) > 0
    * Dédoublonner
    Local liCnt, liNo, lcFax
    Select (m.lcCurDoublons)
    Scan
      m.liCnt = iCnt
      m.lcFax = cFax
      Select (m.lcCurseur)
      For m.liNo = 1 To m.liCnt - 1
        Locate For cFax = m.lcFax
        If Not Found()
          Set Step On
        Else
          Delete
          Go top
        Endif
      EndFor
      Select (m.lcCurDoublons)
    Endscan
  Endif

  * Vérifier qu'il n'y a plus de doublons
  Select cFax, Count(*) AS iCnt ;
    From (m.lcCurseur) ;
    Group By cFax ;
    Having iCnt > 1 ;
    Into Cursor (m.lcCurDoublons)
  If Reccount(m.lcCurDoublons) > 0
    Select (m.lcCurDoublons)
    Browse Title "Il y a des doublons"
    Set Step On
  Endif

  Local lbInvalide, lcLstInvalides, liNb, liNbInvalides, lbKO, liNo
  Select (m.lcCurseur)
  m.lcLstInvalides = ""
  m.liNb = 0
  m.liNbInvalides = 0
  m.liNo = 0
  Scan
    m.liNo = m.liNo + 1
    If m.liNo > 50 And Not m.pbSansSetStep
      * Une pause pour faire l'envoi de ces 50
      Set Step On
      m.liNo = 0
    Endif
    Do Case
      Case Not Fax_AjouteDestinataire(Alltrim(cNom), Alltrim(cFax), @lbInvalide)
        m.lbKO = .T.
        Exit
      Case m.lbInvalide
        m.lcLstInvalides = m.lcLstInvalides + Alltrim(cNom) + " " + Alltrim(cFax) + Chr(13)
        m.liNbInvalides = m.liNbInvalides + 1
      Otherwise
        m.liNb = m.liNb + 1
    Endcase
  Endscan

  Local lcMsg

  If Not Empty(m.lcLstInvalides)
    m.lcMsg = "Ok pour " + Transform(m.liNb) + " fax" ;
          + Chr(13) + Transform(m.liNbInvalides) + " N° de fax invalides trouvés (placés dans le presse-papier) : " ;
          + Chr(13) + m.lcLstInvalides
    _cliptext = m.lcLstInvalides
  Else
    m.lcMsg = "Ok pour " + Transform(m.liNb) + " fax"
  Endif
  If Not m.lbKO
    m.lcMsg = m.lcMsg + Chr(13) + Chr(13) + "L'envoi est préparé mais non effectué. Il faut maintenant cliquer sur Valider dans la fenêtre de dislogue de l'imprimante fax." ;
        + Chr(13) + " et attendre que l'envoi de tous les fax soit terminé."
  Endif

  MessageBox(m.lcMsg ;
        , 0 + 64, "FaxMailing")

  Close Databases all


EndFunc

***************************************************************************************************************
*
* LG 20091113
Function Fax_AjouteDestinataire
  LPARAMETERS pcDestinataire, pcNoFax, pbInvalide

  LOCAL lhWindowFax, lbKO
  * Est-ce la fenetre Assistant Envoi de Télécopie est ouverte ?
  m.lhWindowFax = FindWindow(Null"Assistant Envoi de Télécopie")

  IF m.lhWindowFax <> 0

    * Vérifier la validité du N° de fax
    If Not Fax_CorrigeNo(@pcNoFax)
      m.pbInvalide = .T.
      Return
    Endif

    If Empty(m.pcDestinataire)
      m.pcDestinataire = m.pcNoFax
    Endif

    * place en avant plan la fenetre "Assistant Envoi de Télécopie est ouverte"
    * c'est le zorder(0) de Windows
    = SetForegroundWindow(m.lhWindowFax)

    * Destinataire
    KeyBd_SendKey("D", diKeyAlt)
    uSleep(100)
    _Cliptext = m.pcDestinataire
    KeyBd_SendKey("V", diKeyCtrl)
    uSleep(100)

    * N° de Fax
    KeyBd_SendKey("N", diKeyAlt)
    uSleep(100)
    _Cliptext = m.pcNoFax
    KeyBd_SendKey("V", diKeyCtrl)

    * Alt+o pour ajouter à la liste des destinataires
    KeyBd_SendKey("o", diKeyAlt)
    uSleep(100)
  Else
    MessageBox("Lancez l'impression vers Fax et cliquez sur Suivant avant de débuter")
    Set Step On
    m.lbKO = .T.
  Endif

  Return Not m.lbKO

Endfunc

***************************************************************************************************************
* Vérifier la validité du N° de fax
* LG 20091113
Function Fax_CorrigeNo
  LPARAMETERS pcNoFax

  Local lbKO
  * Enlever les "."
  m.pcNoFax = Strtran(m.pcNoFax, ".""")
  * Enlever les "("
  m.pcNoFax = Strtran(m.pcNoFax, "(""")
  * Enlever les ")"
  m.pcNoFax = Strtran(m.pcNoFax, ")""")
  * Enlever les "-"
  m.pcNoFax = Strtran(m.pcNoFax, "-""")

  If Not Len(Strtran(m.pcNoFax, " """)) = 10
    Set Step On
    m.lbKO = .T.
  Endif

  Return Not m.lbKO

EndFunc

***************************************************************************************************************
*
* LG 20091113
Function KeyBd_SendKey
  Lparameters pvLettre, piAltCtrlShift

  Local liASC
  Do Case
    Case Vartype(m.pvLettre) = "N"
      m.liASC = m.pvLettre
    Case Vartype(m.pvLettre) = "C"
      m.liASC = Asc(m.pvLettre)
    Otherwise
      Set Step On
  Endcase
  If Empty(m.piAltCtrlShift)
    m.piAltCtrlShift = 0
  Endif

  If Bitand(m.piAltCtrlShift, diKeyAlt) > 0
    * Enfoncer Alt
    = keybd_event(VK_ALT, 0, 0, 0)
  Endif
  If Bitand(m.piAltCtrlShift, diKeyCtrl) > 0
    * Enfoncer Ctrl
    = keybd_event(VK_CONTROL, 0, 0, 0)
  Endif
  If Bitand(m.piAltCtrlShift, diKeyShift) > 0
    * Enfoncer Ctrl
    = keybd_event(VK_SHIFT, 0, 0, 0)
  Endif

  * Appuyer la touche
  = keybd_event(VkKeyScan(m.liASC), 0, 0, 0)
  * Relacher la touche
  = keybd_event(VkKeyScan(m.liASC), 0, KEYEVENTF_KEYUP, 0)

  If Bitand(m.piAltCtrlShift, diKeyShift) > 0
    * Relacher Shift
    = keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
  Endif
  If Bitand(m.piAltCtrlShift, diKeyCtrl) > 0
    * Relacher Ctrl
    = keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0)
  Endif
  If Bitand(m.piAltCtrlShift, diKeyAlt) > 0
    * Relacher Alt
    = keybd_event(VK_ALT, 0, KEYEVENTF_KEYUP, 0)
  Endif

EndFunc

***************************************************************************************************************
* Mise en attente
* LG 20070312
Function uSleep
  LPARAMETERS piMilliSecondes

  Sleep(piMilliSecondes)

EndFunc

Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2017.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0