oommeeggaa3d
Messages postés97Date d'inscriptiondimanche 24 avril 2005StatutMembreDernière intervention 3 septembre 2010
-
28 févr. 2008 à 13:41
oommeeggaa3d
Messages postés97Date d'inscriptiondimanche 24 avril 2005StatutMembreDerniè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 ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
oommeeggaa3d
Messages postés97Date d'inscriptiondimanche 24 avril 2005StatutMembreDerniè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)
oommeeggaa3d
Messages postés97Date d'inscriptiondimanche 24 avril 2005StatutMembreDerniè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)
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 !!!
oommeeggaa3d
Messages postés97Date d'inscriptiondimanche 24 avril 2005StatutMembreDerniè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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
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