Boutons dans TOUTES les barres de titres

oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010 - 28 févr. 2008 à 13:41
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010 - 3 avril 2008 à 09:08
Bonjour

Je développe actuellement un logiciel de multi-écrans virtuels et j'aimerais ajouter des fonctionnalités aux fenêtres windows à l'aide de boutons qui viendraient s'ajouter dans les barres de titre. (dans le style de ce que fait Ultramon par exemple avec deux boutons supplémentaires dans les barres de titre)

La difficulté étant ici de rajouter ce bouton sur toutes les fenêtres et non sur la seule fenêtre de mon appli.

Auriez-vous, s'il vous plait, des pistes, infos, ou codes là-dessus ?

Merci d'avance.

9 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 févr. 2008 à 22:44
salut,
regarde dans les sources de DarkSidious (il me semble), tu devrais en trouver une concernant l'ajout d'un bouton en barre de titre pour icônifier les fenêtres

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
29 févr. 2008 à 06:14
Merci je vais regarder ça !
Jusque là, je n'ai trouvé que des sources pour ajouter un bouton dans la form de l'appli, mais pas dans la fenetre de son choix. (ou toutes)
0
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
31 mars 2008 à 11:08
hello

Je relance le sujet ...
j'ai bien avancé en reprenant les sources dont PCPT parlait.
Ca marche très bien pour la barre du programme mais beaucoup moins avec une fenetre quelconque.

Avec le code suivant j'arrive parfaitement à gérer le bouton et à le "coller" à l'intérieur n'importe quelle fenêtre, mais pas dans la barre de titre.
Ici le bouton est collé dans le coin gauche supérieur de la fenêtre (donc juste sous la barre de titre)
(je sais, le code n'est pas clean, mais c'est du test.)

Public Sub InstallBouton()
    Dim FormRect As Rect
    sonparent = 656502 '3474518 'laFrm.hwnd
    Call GetWindowRect(sonparent, FormRect)
 
    ButtonHwnd& = CreateWindowEx(0&, "Button", "*", &H40000000, FormRect.Right - FormRect.Left - 22, 0, 14, 14, sonparent, 0&, App.hInstance, 0&)
     Call ShowWindow(ButtonHwnd&, 1)
    WHook = SetWindowsHookEx(4, AddressOf HookProc, 0, App.ThreadID)
    Call SetWindowLong(ButtonHwnd&, GWL_EXSTYLE, &H80)
        Call SetParent(ButtonHwnd&, sonparent)
End Sub

Public Sub DesinstallBouton()
    Call UnhookWindowsHookEx(WHook)
    Call SetParent(ButtonHwnd&, Form1.hWnd)
End Sub

Private Function HookProc&(ByVal nCode&, ByVal wParam&, Inf As CWPSTRUCT)
    Dim FormRect As Rect
    Static LastParam&

    If Inf.hWnd = ButtonHwnd& Then
        If Inf.Message = &H82 Then 'destroy
          Form1.Label1.Caption = "Suppression bouton"
          Call DesinstallBouton
        End If
        If Inf.Message = 243 Then 'click
         Form1.Label1.Caption = "Appui sur le bouton"
        End If
    End If

      If Inf.hWnd = sonparent Then        If Inf.Message WM_NCPAINT Or Inf.Message WM_MOVE Then
          Call GetWindowRect(sonparent, FormRect)
          Call SetWindowPos(ButtonHwnd&, 0, 0, 0, 17, 14, SWP_FRAMECHANGED)
        Else
 
        End If
      End If
End Function

le hic c'est que je n'arrive pas à intercepter les messages pour une fenêtre quelconque, et du coup, pas moyen de repositionner le bouton si la fenêtre est déplacée.
ici, le message WM_NCPAINT ou WM_MOVE n'est jamais traité.
Normal, vous me direz car j'ai mis App.ThreadID quand j'ai crée le hook. Mais je n'arrive pas à utiliser un autre ThreadID que celui-ci.
Faire un getparent de la variable "sonparent" (qui ne veut rien dire), renvoie 0.

C'est un peu confus, mais si quelqu'un a une idée, je suis preneur.
 Merci !!!
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 mars 2008 à 12:49
si tu veux qu'on teste, çà serait pas mal de copier les types et api ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
31 mars 2008 à 14:48
Merci de ta réponse.
Je remets tout proprement et je rajoute un findwindow sur une fenêtre calculatrice (calculator sur mon pc)
D'ailleurs en rajoutant ce findwindow, je m'aperçois que je n'ai pas la place d'afficher mon contrôle supplémentaire sur une fenêtre notepad. (avec le menu, les scrollbars et la zone de texte, il ne reste plus de place)
Il me faut donc vraiment trouver un moyen de placer ce bouton dans la barre de titre et faire en sorte que le bouton se repositionne automatiquement.

voici donc le code complet : (dans un module)
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As Rect) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) 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 SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook&) As Long
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function SetActiveWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hWnd As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Type Rect
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Type CWPSTRUCT
    lParam As Long
    wParam As Long
    Message As Long
    hWnd As Long
End Type
Const WM_LBUTTONDOWN = &H201
Const WM_MOVE = &H3
Const WM_SETCURSOR = &H20
Const WM_NCPAINT = &H85
Const WM_COMMAND = &H111
Const SWP_FRAMECHANGED = &H20
Const GWL_EXSTYLE = -20
Private WHook&
Private ButtonHwnd As Long
Public laFrm As Form
Dim sonparent As Long

Public Sub InstallBouton()
    Dim FormRect As Rect
    sonparent = FindWindow(vbNullString, "Calculator")
    If sonparent = 0 Then End
    
    ButtonHwnd& = CreateWindowEx(0&, "BUTTON", "*", &H40000000, FormRect.Right - FormRect.Left - 22, 0, 14, 14, sonparent, 0&, App.hInstance, 0&)
    Call ShowWindow(ButtonHwnd&, 1)
    WHook = SetWindowsHookEx(4, AddressOf HookProc, 0, App.ThreadID)
    If WHook = 0 Then
      MsgBox "err"
      End
    End If
    
    Call SetWindowLong(ButtonHwnd&, GWL_EXSTYLE, &H80)
    Call SetParent(ButtonHwnd&, sonparent)
End Sub

Public Sub DesinstallBouton()
    Call UnhookWindowsHookEx(WHook)
    Call SetParent(ButtonHwnd&, Form1.hWnd)
End Sub

Private Function HookProc&(ByVal nCode&, ByVal wParam&, Inf As CWPSTRUCT)
    Dim FormRect As Rect
    Static LastParam&

    If Inf.hWnd = ButtonHwnd& Then
        If Inf.Message = &H82 Then 'destroy
          'Form1.Label1.Caption = "Suppression bouton"
          Call DesinstallBouton
        End If
        If Inf.Message = 243 Then 'click
         Form1.Label1.Caption = "Appui sur le bouton"
         'Call DesinstallBouton
        End If
    End If

      If Inf.hWnd = sonparent Then        If Inf.Message WM_NCPAINT Or Inf.Message WM_MOVE Then
          Call GetWindowRect(sonparent, FormRect)
          Call SetWindowPos(ButtonHwnd&, 0, 0, 0, 17, 14, SWP_FRAMECHANGED)
        Else
 
        End If
      End If
End Function

il y a aussi une form tout simple avec qui appelle le bazar :

Private Sub Form_Load()
InstallBouton
End Sub

Private Sub Form_Unload(Cancel As Integer)
DesinstallBouton
End Sub

Merci d'avance. Un sacré casse-tête pour moi.
0
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
2 avril 2008 à 16:15
personne ne peut m'aider ?
ou c'est mon explication qui n'est pas claire :-)
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 avril 2008 à 19:00
salut,

pas eu le temps... je jette un oeil dans la soirée (sans promesse )
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 avril 2008 à 21:48
re,

après quelques tests, j'arrive à poser le bouton sur la fenêtre CALC ou autre, ou libre (pas de Parent) mais pas non plus directement dans la barre de titre (sauf la form de l'appli)

j'ai pas trop le temps en ce moment donc j'vais pas pouvoir t'aider des masses

essaye de faire un tour sur http://www.planet-source-code.com , il y a peut-être un code adéquat...

et pour le subclassing complet (pas que dans le thread de l'appli) tu peux regarder cette source
bon courage
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
3 avril 2008 à 09:08
Merci.
Je vais continuer à chercher.
Je suis étonné que le sujet n'ait jamais été abordé ! (enfin il me semble)
0
Rejoignez-nous