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

Macros et VBA Excel Discussion :

Icône perso dans barre de titre de MsgBox


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut Icône perso dans barre de titre de MsgBox
    bonjour,

    je cherche à placer une icône perso dans la barre de titre d'un MsgBox appellé de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call MsgBox("Bla bla", vbSystemModal, "mon Titre")
    Vos pistes sont les bienvenues.
    Merci

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour, fred65200,

    Es-tu bien certain de ce que cette transformation t'est nécessaire ?

    Avant-même de tenter de le faire (sans savoir si j'y parviendrai), en effet, je vois bien qu'il me faudra :
    - sous-classer la msgbox (un hook)
    - en extraire son hwnd (son handle)
    Jusque là, je vois bien comment faire

    puis
    - extraire le hwnd de sa barre de titre (pas forcément le même)
    (j'ai là une idée et ce ne devrait pas être trop dur)

    - extraire ensuite son hdc (contexte de disposiitif) ==>> pas certain de l'avoir facilement, celui-ci
    - y dessiner l'icône (pas de problème si je réussis à passer l'étape précédente)

    Au total : un sous-classement (il vaut souvent mieux l'éviter), plusieurs fonctions de l'Api de Windows et plusieurs lignes de code (assez nombreuses).

  3. #3
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bonjour ucfoutu,

    J'espérais que tu tombes sur ce fil, étant persuadé que tu pourrai m'apporter une solution.

    La transformation n'est absolument pas nécessaire, c'est surtout la démarche qui m'intéresse.
    Je réussi à extraire le hwnd de la MsgBox, après, je patauge.
    Je vais chercher le hwnd de la barre de titre.
    Tes propositions sont les bienvenues.
    Fred

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Aïe,

    Mauvaises nouvelles !

    Impossible d'extraire (comme je le croyais et comme avec toute autre fenêtre ouverte normalement) le hwnd de la barre d'outil de la fenêtre de la msgbox.

    Le problème ? on l'a "hameçonnée" en sous-classement et (dans cet état et alors même qu'elle n'est pas encore complètement dessinée) on ne peut encore utiliser GetWindowLong pour extraire le hwnd de sa barre de tître à l'aide du hwnd de la fenêtre à créer (alors que lui, on a pu l'extraire !) !!

    J'ai tentré quielques manoeuvres hasardeuses et ai même réussi à planter ma machine (même plus moyen, pour l'une de ces manoeuvres, de stopper à l'aide du gestionnaire de tâches ...)
    Je crois bien que nous allons abandonner, fred65200.
    Désolé.

  5. #5
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    Merci encore ucfoutu,
    voilà où j'en suis, ça semble fonctionner.
    Je n'ai pas réussi à insérer le chemin de l'icône dans la fonction monMsgBox. --> Crash à la pelle.

    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
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    '---------------------------------------------------------------------------------------
    ' Module      : modOK
    ' Auteur      : fred65200 - Frédéric CHAPIN - http://www.developpez.net/forums/private.php?do=newpm&u=190475
    ' Date        : 06/02/2009
    ' Description : Afficher une icône perso dans un MsgBox
    '---------------------------------------------------------------------------------------
     
    Option Explicit
    Private Const monIcone As String = "D:\ATMG\MG1.bmp"
     
    'Constantes des MsgBox Windows
    Private Const MB_OK = 0
    Private Const MB_OKCANCEL = 1
    Private Const MB_ABORTRETRYIGNORE = 2
    Private Const MB_YESNOCANCEL = 3
    Private Const MB_YESNO = 4
    Private Const MB_RETRYCANCEL = 5
     
    Private Const MB_ICONHAND = 16
    Private Const MB_ICONQUESTION = 32
    Private Const MB_ICONEXCLAMATION = 48
    Private Const MB_ICONASTERISK = 64
     
    Private Const MB_ICONINFORMATION = 64
    Private Const MB_ICONSTOP = 16
     
    Private Const MB_DEFBUTTON1 = 0
    Private Const MB_DEFBUTTON2 = 256
    Private Const MB_DEFBUTTON3 = 512
     
    Private Const MB_APPLMODAL = 0
    Private Const MB_SYSTEMMODAL = 4096
    Private Const MB_TASKMODAL = 8192
     
    'Valeurs renvoyées par les MsgBox Windows
    Private Const IDOK = 1
    Private Const IDCANCEL = 2
    Private Const IDABORT = 3
    Private Const IDRETRY = 4
    Private Const IDIGNORE = 5
    Private Const IDYES = 6
    Private Const IDNO = 7
     
    Private Const IDPROMPT = &HFFFF&
     
    Private Const HWND_DESKTOP = 0
     
    Private X As Long
     
    Private Const WH_CBT = 5
    Private Const GWL_HINSTANCE = (-6)
    Private Const HCBT_ACTIVATE = 5
     
    Private Type MSGBOX_HOOK_PARAMS
       hwndOwner   As Long
       hHook       As Long
    End Type
     
    Private MHP As MSGBOX_HOOK_PARAMS
     
    Private Declare Function ExtractIconA Lib "shell32.dll" ( _
        ByVal hInst As Long, _
        ByVal lpszExeFileName As String, _
        ByVal nIconIndex As Long) As Long
     
    Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
     
    Private Declare Function GetWindowLong Lib "user32" _
       Alias "GetWindowLongA" ( _
       ByVal hwnd As Long, _
       ByVal nIndex As Long) As Long
     
    Private Declare Function MessageBox Lib "user32" _
       Alias "MessageBoxA" ( _
       ByVal hwnd As Long, _
       ByVal lpText As String, _
       ByVal lpCaption As String, _
       ByVal wType As Long) As Long
     
    Public Declare Function SendMessageA Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Integer, _
        ByVal lParam As Long) As Long
     
    Private Declare Function SetDlgItemText Lib "user32" _
       Alias "SetDlgItemTextA" ( _
       ByVal hDlg As Long, _
       ByVal nIDDlgItem As Long, _
       ByVal lpString As String) As Long
     
    Private Declare Function SetWindowsHookEx Lib "user32" _
       Alias "SetWindowsHookExA" ( _
       ByVal idHook As Long, _
       ByVal lpfn As Long, _
       ByVal hmod As Long, _
       ByVal dwThreadId As Long) As Long
     
    Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
        ByVal hHook As Long) As Long
     
     
    Sub testFC()
    Dim valRetour As Integer
    valRetour = monMsgBox(MB_OK, "monTitre", "Bla bla")
    MsgBox "Valeur retournée : " & valRetour
    End Sub
     
    Function monMsgBox( _
        boutons As Long, _
        titre As String, _
        texte As String) As Long
     
      'Interception du Hook
       With MHP
          .hwndOwner = HWND_DESKTOP
          .hHook = SetWindowsHookEx(WH_CBT, _
                                    AddressOf MsgBoxHookProc, _
                                    GetWindowLong(HWND_DESKTOP, GWL_HINSTANCE), _
                                    GetCurrentThreadId())
       End With
     
      'Appel de la fonction API
       monMsgBox = MessageBox(HWND_DESKTOP, _
                                texte, _
                                titre, _
                                boutons)
     
     
    End Function
     
    Function MsgBoxHookProc( _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long
     
    'Le MsgBox va bientôt s'afficher
    If uMsg = HCBT_ACTIVATE Then
     
        'Bouton Ok personnalisé
        SetDlgItemText wParam, IDOK, "C'est bon"
     
        'Ajout de l'icône perso
        'X = ExtractIconA(0, monIcone, 0)
        'icône Word pour le sujet
        X = ExtractIconA(0, Application.Path & Application.PathSeparator & "Winword.exe", 0)
        SendMessageA wParam, &H80, False, X
     
        '«Unhook»
        UnhookWindowsHookEx MHP.hHook
     
    End If
     
    MsgBoxHookProc = False
     
    End Function
    Qu'en penses-tu?

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Citation Envoyé par fred65200 Voir le message
    bonjour,

    je cherche à placer une icône perso dans la barre de titre d'un MsgBox appellé de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call MsgBox("Bla bla", vbSystemModal, "mon Titre"
    Vos pistes sont les bienvenues.
    Merci
    Ben oui, mais.... ce n'est pas là le défi de départ, non ?
    Tu n'as pas utilisé la MsgBox dfe VB, là ...

  7. #7
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    Tu as raison Ucfoutu, je n'ai rien réussi à faire de concret à partir de la demande initiale. Je me suis rabattu sur cette autre possibilité. Fred

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    C'est très bien.

    Pour placer l'icône, il te faut :
    - extraire le hdc de ton handle de la barre de titre
    - l'y insérer par DrawIcon (il ne sera toutefois pas persistant, mais pas grave)

    Question, maintenant :
    Mais alors : pourquoi n'avoir pas fait l'économie d'un userform modal, directement, en lieu et place ?
    Tu serais alors parti de son hwnd, extrait plus facilement celui de sa barre de titre (sans sous-classement), etc...

    Il reste que ce que tu as fait est très bien ...
    Séparé comme il convient entre UserForm et Module (pour le hook) et complété par l'extraction du hdc et la fonction DrawIcon, il serait plein d'enseignements divers.

  9. #9
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    C'est très bien.

    Pour placer l'icône, il te faut :
    - extraire le hdc de ton handle de la barre de titre
    - l'y insérer par DrawIcon (il ne sera toutefois pas persistant, mais pas grave)

    Question, maintenant :
    Mais alors : pourquoi n'avoir pas fait l'économie d'un userform modal, directement, en lieu et place ?
    Tu serais alors parti de son hwnd, extrait plus facilement celui de sa barre de titre (sans sous-classement), etc...
    Merci pour tes critiques. Pour ma culture personnelle, peux tu illustrer par un exemple l'économie d'un userform. Merci

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Ben...

    Tu crées un UserForm avec les boutons et le texte que tu veux.
    - tu sais déjà extraire le hwnd d'un userForm
    - tu sais également extraire celui de sa barre de titre (à l'aide de SetWindowLong )
    - La fonction GetDC te permet, à l'aide de ce hwnd, d'en extraire le hdc (en espérant que la barre en soit dotée)
    - Tu y dessines l'icône avec, au choix, DrawIcon ou DrawIconEx.
    Commence avec celà.
    On m'attend au restaurant mais, si tu le souhaites, on pourra continuer demain par MP.

  11. #11
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    re
    tu veux dire quelque chose comme ça?
    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
    Option Explicit
    Private Declare Function ExtractIconA Lib "shell32.dll" ( _
        ByVal hInst As Long, _
        ByVal lpszExeFileName As String, _
        ByVal nIconIndex As Long) As Long
     
    Private Declare Function SendMessageA Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Integer, _
        ByVal lParam As Long) As Long
     
    Private Declare Function FindWindow& Lib "user32" _
        Alias "FindWindowA" ( _
        ByVal lpClassName$, _
        ByVal lpWindowName$)
     
     
    Private Sub UserForm_Initialize()
    'Icone Word
    Dim monIcone As Long
    monIcone = ExtractIconA(0, Application.Path + Application.PathSeparator + "Winword.exe", 0)
    SendMessageA FindWindow(vbNullString, Me.Caption), &H80, False, monIcone
     
    End Sub
    Bonne soirée
    @+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/10/2014, 18h05
  2. Placer une icône perso dans la barre de titre d'un MsgBox
    Par fred65200 dans le forum Contribuez
    Réponses: 0
    Dernier message: 06/02/2009, 20h34
  3. Réponses: 4
    Dernier message: 03/06/2007, 07h18
  4. [AJAX] ajax et # dans barre de titre
    Par speedev dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/05/2006, 17h55
  5. Comment Afficher adresse complete dans barre de titre ?
    Par SubZero2 dans le forum Langage
    Réponses: 2
    Dernier message: 26/01/2006, 16h55

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