IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

ActiveX et les Handle


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de waldo2188
    Profil pro
    Chef de projets
    Inscrit en
    Mars 2004
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Mars 2004
    Messages : 115
    Par défaut ActiveX et les Handle
    Bonjour,

    Je suis donc en stage où l’on ma demandé de créer un contrôle active X permettant d’imprimer un fichier qui lui est passé en paramètre.
    Le contrôle est appelé dans une page web par une fonction javascript.

    Ce contrôle doit pouvoir imprimé deux types de fichier :
    - Document Word avec comme extension RTF
    - Document Acrobat Reader avec comme extension PDF

    Mon Problème :
    Je bloque sur l’utilisation de certaines API, car le contrôle Active X doit être capable d’imprimer un fichier au forma PDF. Pour cela j’ouvre le fichier passé en paramètre grâce à la fonction « ShellExecute ». Par la suite je dois fermer cette application, pour cela il faut récupérer son Handle, mais je n’y arrive pas du tout.

    J’ai donc récupéré du code sur Internet qui permet de lister toute les applications en cours. Sur celui-ci je pouvais récupérer le Handle de Adobe Acrobat Reader. J’ai donc recréé le même code sur mon contrôle active X, mais cela ne marche pas. Je ne vois pas d’où viens mon problème.

    Je vous met ci dessous le code de mon contrôle active X (Il a besoins de deux contrôle Timer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    'utilisé pour word
    Dim docword As New Word.Application
     
    'utilisé pour Adobe Acrobat Reader
    'Ouvre AAR
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
     
    'Permet de fermer la fenetre
    Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
     
    ' La fonction GetParent recherche le handle du parent propriétaire de la fenêtre indiquée.
    Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
     
    ' La fonction GetWindow recherche le handle de la fenêtre active
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
     
    ' La fonction GetWindowTextLength recherche la longueur, en caractères, du texte de barre du titre de la fenêtre indiquée (si la fenêtre a une barre de titre). Si la fenêtre indiquée est une commande, la fonction recherche la longueur du texte dans la commande.  Cependant, GetWindowTextLength ne peut pas rechercher la longueur du texte d'une commande d'édition dans une autre application.
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
     
    ' La fonction GetWindowText copie le texte de la barre du titre de la fenêtre indiquée (si elle a un) dans un buffer. Si la fenêtre indiquée est une commande, le texte de la commande est copié. Cependant, GetWindowText ne peut pas rechercher le texte d'une commande dans une autre application.
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
     
    Private meHwnd As Long
    Private Const GW_HWNDFIRST = 0
    Private Const GW_HWNDNEXT = 2
     
     
    Public Sub GoImprime(unChemin As String)
    'teste permettant de savoir si le fichier est un RTF ou un PDF
     
    Dim teste As String
    Dim toto As Boolean
     
    teste = Right$(unChemin, 3)
     
    If teste = "pdf" Or teste = "PDF" Then
        Dim Retour As Long
     
        'la fonction ShellExecute va ouvrir l'application adapté à l'extention et le paramètre Print va permetre d'imprimer, l'application sara ensuite fermé
        Retour = ShellExecute(hwnd, "print", unChemin, "", vbNullString, 0)
     
     
        'mise en route du timer
        Timer2.Enabled = True
     
        '10 sec avant la fermeture de word
        Timer2.Interval = 10000
     
        Call Timer2_Timer
     
     
        Else
     
        'Enonciation des variables
        'Création d'une instance de WinWord
        Set docword = CreateObject("word.application")
        'True pour word visible et false pour le mettre en arrière plan
            docword.Visible = False
     
            docword.DisplayAlerts = False    'évite les erreurs de traitement
     
            'ouverture du document, sans la sélection du type de selui-ci
          doc = docword.Documents.Open(unChemin, 0)
          'impression de celui ci
          docword.ActiveDocument.PrintOut
     
        'mise en route du timer
        Timer1.Enabled = True
     
          '10 sec avant la fermeture de word
        Timer1.Interval = 1000
     
    End If
     
     
    End Sub
     
    Private Sub Timer1_Timer()
    'estinction du timer
         Timer1.Enabled = False
    'fermeture de word
         docword.Application.Quit (0)
     
    End Sub
     
    Private Sub Timer2_Timer()
    Dim reSultat As Long
    MsgBox (meHwnd)
    'Récupération des handle afin de trouver celui de acrobat Reader
            Dim CurrWnd As Long
            Dim Parent As Long
            Dim Length As Long
            Dim NomTache As String
            Dim NomAAR As String
            Dim monHandle As Long
            Dim reSultat As Long
     
            ' Handle de la fenetre active
            CurrWnd = GetWindow(hwnd, GW_HWNDFIRST)
            While CurrWnd <> 0
            ' On prend la fenetre mere de l'application
            Parent = GetParent(CurrWnd)
            Length = GetWindowTextLength(CurrWnd)
            NomTache = Space$(Length + 1)
            Length = GetWindowText(CurrWnd, NomTache, Length + 1)
            ' Ici on a le nom de la fenetre qui apparait dans la barre du CTRL+ALT+SUPP
            NomTache = Left$(NomTache, Len(NomTache) - 1)
     
            If NomTache <> "" Then
                 List1.AddItem NomTache + ":" + Str(CurrWnd)
     
               'récupération d'une partie du nom du processus
                NomAAR = Left$(NomTache, 14)
                'on recherche un certain processus afin de récupérer son handle
                If NomAAR = "Acrobat Reader" Then
                   meHwnd = CurrWnd
                    'on ferme l'application
                      reSultat = PostMessage(meHwnd, WM_CLOSE, vbNull, vbNull)
                End If
            End If
     
            CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
     
            Wend
     
    End Sub
    Je vous remercie d’avance pour vos réponses.

    Balises code ajouter par shwin
    Merci d'y penser

  2. #2
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    shellexecute retourne le handle de l'application

    If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.

    If the function fails, the return value is an error value that is less than or equal to 32. The following table lists these error values:
    0
    The operating system is out of memory or resources.

    ERROR_FILE_NOT_FOUND
    The specified file was not found.

    ERROR_PATH_NOT_FOUND
    The specified path was not found.

    ERROR_BAD_FORMAT
    The .EXE file is invalid (non-Win32 .EXE or error in .EXE image).

    SE_ERR_ACCESSDENIED
    The operating system denied access to the specified file.

    SE_ERR_ASSOCINCOMPLETE
    The filename association is incomplete or invalid.

    SE_ERR_DDEBUSY
    The DDE transaction could not be completed because other DDE transactions were being processed.

    SE_ERR_DDEFAIL
    The DDE transaction failed.

    SE_ERR_DDETIMEOUT
    The DDE transaction could not be completed because the request timed out.

    SE_ERR_DLLNOTFOUND
    The specified dynamic-link library was not found.

    SE_ERR_FNF
    The specified file was not found.

    SE_ERR_NOASSOC
    There is no application associated with the given filename extension.

    SE_ERR_OOM
    There was not enough memory to complete the operation.

    SE_ERR_PNF
    The specified path was not found.

    SE_ERR_SHARE
    A sharing violation occurred.

  3. #3
    Membre confirmé Avatar de waldo2188
    Profil pro
    Chef de projets
    Inscrit en
    Mars 2004
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Mars 2004
    Messages : 115
    Par défaut re
    Hé bien oui je suis dacord avec vous, mais dans mon cas, je ne sais pas vraiment pourquoi, ca ne me retourne que 42, et cela tout le temps.
    c'est pour cela que je bloque.
    merci de votre aide;

  4. #4
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Sub Commande27_Click()
    Dim retour As Long
    retour = ShellExecute(Me.hwnd, "print", "C:\windows\bureau\compactage.txt", vbNullString, vbNullString, 1)
    MsgBox retour
    End Sub
    il me retourne bien mon handle. Et le fichier est aussitot ferme (automatiquement) apres impression.<

    Que vaut la valeur unChemin ?

  5. #5
    Membre confirmé Avatar de waldo2188
    Profil pro
    Chef de projets
    Inscrit en
    Mars 2004
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Mars 2004
    Messages : 115
    Par défaut re
    La valeur unChemi, contien le chemin a parcourir pour trouver le fichier.
    exemple : C:\monDossier\monSousDossier\Monfichier.pdf

    Je veux bien vous croire que ce marche, car j'ai tout d'abord testé mon code avec un formulaire Vb tout simple, mais quand j'implante ce code dans un controle ActiveX, et que j'appel ce controle à partir d'une page Web, la fonction FindExecute me retour uniquement 42.

    Essayer d'en faire un controle activeX et si cela marche je veux bien me metre a genoux devant le PC

    en tout cas j'aimerais vous féliciter pour la vitesse ou vous répondez, là je vous tire mon chapeau!
    Merci encore

  6. #6
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    findexecute ou shellexecute qui te retourne 42 ?

    mais il y a-t-il une impression ?

  7. #7
    Membre confirmé Avatar de waldo2188
    Profil pro
    Chef de projets
    Inscrit en
    Mars 2004
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Mars 2004
    Messages : 115
    Par défaut re
    C'est shellexecute qui me retourne 42, et oui il me lance bien l'impression!

  8. #8
    Membre confirmé Avatar de waldo2188
    Profil pro
    Chef de projets
    Inscrit en
    Mars 2004
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Mars 2004
    Messages : 115
    Par défaut Hey!!! ;p
    C'est bon j'ai résolut le problème.
    Pour faire fonctionner le code qui liste toute les application et leur handle, il faut un handle valide. Mais le Controle ActiveX ne me retournant aucun handle valide, j'ai cherché un composant windows qui serais toujours ouvert et qui serais commun à tt les windows. J'ai trouvé sur un forum comment récupéré le handle du bouton Démaré de la bare des tache.
    Bonne journée à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer tous les handles d'une application choisie
    Par dacid dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 21/04/2006, 17h24
  2. [Paradox] Comment fermer tous les handles
    Par Zugg dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/12/2005, 11h22
  3. ActiveX et les balise PARAM...
    Par Metal3d dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 16/09/2005, 16h40
  4. Comment obtenir les Handles des boutons systèmes de Windows ?
    Par Desraux dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 22/12/2004, 23h20
  5. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo