Passer un USF ouvert d'un fichier à l'autre

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour,
j'ai crée usf que j'ouvre sur le fichier 1.
Lorsque je passe sur le fichier 2 le usf n'apparait plus alors qu'il y a 2 ou 3 ans cela était possible.
J'ai pourtant mis: USF1.show 0.
Avez vous une réponse à me proposer?
Merci
Carlos
 

patricktoulon

XLDnaute Barbatruc
GetWindowLong
GWL_WNDPROC(-4)Pour connaître l'adresse de la fonction WindProc de la fenêtre.
GWL_STYLE(-16)Renvoie le style de la fenêtre.
GWL_EXSTYLE(-20)Renvoie le style étendu de la fenêtre.
GWL_HWNDPARENT(-8)Permet de récupérer le handle de la fenêtre Parent.
GWL_HINSTANCE(-6)Pour récupérer le handle de l'instance possédant la fenêtre.

Set WindowLong -8, 0 met donc je pense à 0 le handle de la fenêtre parent
je pense pas @Dranreb
la ou tu met "-8" on attend un handle "-8" ne correspond a rien
dans la fonction getwindowlong ce -8 c'est le 2d argument
en gros
handleparent=getwindowlong handle,-8)'handle est le pointeur de la fenêtre supposée enfant

là a mon avis tu tape dans le vide avec ce setwindowlong et qui sait peut être meme annule le setwindowpos sur certaines config

@carlos je teste ton truc et reviens
 

Dranreb

XLDnaute Barbatruc
Non, j'avais juste oublié de mettre hWnd en 1ère position dans mon message #29 comme c'est bien dans la Sub UserForm_Activate.
Toi dans ta question #27 tu avais bien oublié de préciser le 0 en 3ème position …
 
Dernière édition:

carlos

XLDnaute Impliqué
Supporter XLD
@carlos heu...... une question :tu tourne sur quelle version d'excel
1668250777233.png
 

Dranreb

XLDnaute Barbatruc
Non j’essaye de faire en sorte qu'il n'ait plus de fenêtre parente du tout.
VB:
Private Sub UserForm_Activate()
   Dim Avant As Long, Après As Long
   hWnd = GetForegroundWindow
   SetWindowPos hWnd, -2, 0, 0, 0, 0, &H43 ' Au dessus seulement des fenêtres qui ne sont pas en -1 mais sous celles ci.
   Avant = GetWindowLong(hWnd, -8)
   SetWindowLong hWnd, -8, 0 ' Pour le rendre indépendant de toute autre fenêtre.
   Après = GetWindowLong(hWnd, -8)
   MsgBox "GetWindowLong(" & hWnd & ", -8) :" _
      & vbLf & "Avant SetWindowLong " & hWnd & ", -8, 0 : = " & Avant _
      & vbLf & "Après SetWindowLong " & hWnd & ", -8, 0 : = " & Après
   End Sub
Affiche bien
1668252154387.png
 

patricktoulon

XLDnaute Barbatruc
oui 2019 alors tes déclarations n’étaient pas bonnes

je vous propose d'essayer ceci

  1. on est dans l'activate alors j'utilise getactivewindow pour le handle du userform
  2. j'ai ajouté l'api getdesktopwindow pour choper le handle du bureau
  3. j'ai ajouté l'api setparent pour affilier l'userform non pas a l'application mais le desktop
  4. j'ai virer le setwindowlong je pense pas que ca ai une utilité
  5. j'ai ajouté la gestion des event workbook dans le userform
bon nous y voilà

le userform va devenir enfant du desktop

1°je gere l'event du workbook.windowsresize pour que si je minimise l'application (la fentre classeur du userform ) celui ci reste et ne bouge pas

2°avec le changement de parent je n'ai plus le scintillement (userform qui disparait et réapparait) quand je change de classeur sans geler l’écran

j'ai testé dans le fichier de marco
VB:
Option Explicit
#If VBA7 Then
    #If Win64 Then
        'certaines api se déclare différemment en 32 ou 64 dans VBA7 ou  VBA7.01
        'ici c'est bon c'est pas le cas
    #Else
        'donc on met tout dans VBA7 tout court
        Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
        Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal Hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
        Private Declare PtrSafe Function SetParent Lib "user32" (ByVal hWndChild As LongPtr, ByVal hWndNewParent As LongPtr) As LongPtr
        Private Declare PtrSafe Function GetDesktopWindow Lib "user32" () As LongPtr
    #End If
#Else 'si  Excel  32 inferieur  à 2010
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Private Declare Function GetDesktopWindow Lib "user32" () As Long
#End If

#If Win64 Or VBA7 Then
    Dim Hwnd As LongPtr, HwndP As LongPtr
#Else
    Dim Hwnd As Long, HwndP As Long
#End If
Public WithEvents wbk As Workbook    'object classeur géré dans le userform
Private Sub UserForm_Activate()
    Set wbk = ThisWorkbook
    Hwnd = GetActiveWindow
    HwndP = GetDesktopWindow
    SetParent Hwnd, HwndP
    SetWindowPos Hwnd, -1, 0, 0, 0, 0, &H43    ' Pour le forcer à rester affiché.
End Sub

'même si tu réduis la fenêtre excel du classeur ou se trouve le userform il reste afficher et en firstplan

Private Sub wbk_WindowResize(ByVal Wn As Window)
    SetWindowPos Hwnd, -1, 0, 0, 0, 0, &H43    ' Pour le forcer à rester affiché même si on reduit l'application Excel
End Sub

testé sur 2013 32 en VBA7

@Dranreb je ragrde ce que tu m'a montré
 

patricktoulon

XLDnaute Barbatruc
Non j’essaye de faire en sorte qu'il n'ait plus de fenêtre parente du tout.
VB:
Private Sub UserForm_Activate()
   Dim Avant As Long, Après As Long
   hWnd = GetForegroundWindow
   SetWindowPos hWnd, -2, 0, 0, 0, 0, &H43 ' Au dessus seulement des fenêtres qui ne sont pas en -1 mais sous celles ci.
   Avant = GetWindowLong(hWnd, -8)
   SetWindowLong hWnd, -8, 0 ' Pour le rendre indépendant de toute autre fenêtre.
   Après = GetWindowLong(hWnd, -8)
   MsgBox "GetWindowLong(" & hWnd & ", -8) :" _
      & vbLf & "Avant SetWindowLong " & hWnd & ", -8, 0 : = " & Avant _
      & vbLf & "Après SetWindowLong " & hWnd & ", -8, 0 : = " & Après
   End Sub
Affiche bien
Regarde la pièce jointe 1155092
re
ben c'est évident c'est ce que je te dis en fait tu annule tout ce qui a été fait avant c'est pas ce que tu crois

Avant = GetWindowLong(hWnd, -8)'là tu capte le parent ok peut être je l'avoue je connaissais pas

SetWindowLong hWnd, -8, 0' Pour le rendre indépendant de toute autre fenêtre.

non la tu supprime tout les attribut getwindowlong du handle puisque tu fait sauter le gw_styled'origine du userform et éventuellement le gwl_style(si modif) qui peut être soit -16 ou soit -20

Après = GetWindowLong(hWnd, -8)' ben c'est normal que ça te donne 0

il te suffit de faire un test simple
on met les 3 boutons dans la barre de titre avant
setwindowlong hwnd, &h94C08080
et de refaire ton -8 après
ben tu perd les boutons
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bon ben autant pour moi il semberait que tu ai raison (bien que j'en soit pas sur)
je viens de tester avec getparent

une fenêtre a toujours un parent sinon elle n'a plus de structure gw_style

elle ne peut pas exister si elle n'est pas au minimum enfant du getdesktopwindow

mais bon le msgbox renvoie bien 0 je te l'accorde

VB:
Option Explicit
#If VBA7 Then
    #If Win64 Then
        'certaines api se déclare différemment en 32 ou 64 dans VBA7 ou  VBA7.01
        'ici c'est bon c'est pas le cas
    #Else
        'donc on met tout dans VBA7 tout court
        Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
        Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
        Private Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
        Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #End If
#Else    'si  Excel  32 inferieur  à 2010
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#End If

#If Win64 Or VBA7 Then
    Dim hwnd As LongPtr, HwndP As LongPtr
#Else
    Dim hwnd As Long, HwndP As Long
#End If

Private Sub UserForm_Activate()
    Dim Avant As Long, Après As Long
    'hwnd = GetForegroundWindow
    hwnd = GetActiveWindow
    SetWindowPos hwnd, -2, 0, 0, 0, 0, &H43    ' Au dessus seulement des fenêtres qui ne sont pas en -1 mais sous celles ci.
    'Avant = GetWindowLong(hwnd, -8)
    Avant = GetParent(hwnd)
    SetWindowLong hwnd, -8, 0    ' Pour le rendre indépendant de toute autre fenêtre.
    'Après = GetWindowLong(hwnd, -8)
    Après = GetParent(hwnd)

    MsgBox "GetWindowLong(" & hwnd & ", -8) :" _
         & vbLf & "Avant SetWindowLong " & hwnd & ", -8, 0 : = " & Avant _
         & vbLf & "Après SetWindowLong " & hwnd & ", -8, 0 : = " & Après
End Sub
 

Discussions similaires

Réponses
2
Affichages
288
Réponses
3
Affichages
521
Compte Supprimé 979
C