Restaurer fenêtre sendmessage

[Résolu]
Signaler
Messages postés
425
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
28 octobre 2016
-
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
-
pour (exemple) réduire et restaurer la calculatrice windows avec le handle : 2033168

module :

[i]Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Public Const WM_SYSCOMMAND As Long = &H112
Public Const SC_SIZE As Long = &HF000&
Public Const SC_MINIMIZE As Long = &HF020&
Public Const SC_MAXIMIZE As Long = &HF030&/i

form :

[i]Private Sub Form_Load()
'mimiser calculatrice windows
SendMessage 2033168, WM_SYSCOMMAND, SC_SIZE Or SC_MINIMIZE, 0/i <(pour mimiser)

[i]'agrandir calculatrice windows
SendMessage 2033168}, WM_SYSCOMMAND, SC_SIZE Or SC_MAXIMIZE, 0/i <(pour restaurer en grand)
End Sub

Mais le truk il y a t'il au autre truk que SC_MAXIMIZE car ca le restaure mais agrandi !
je veux pas car il y a des programmes qui est sencé pas être agrandi mais ca agrandi
même pour la calculatrice windows

il a t-il autre que SC_MAXIMIZE pour restaurer une fenêtre sans l'agrandire ?

10 réponses

Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Rebonjour CpcDos, je vois que tu ne perds pas de temps !

Ce que tu cherches, c'est SC_RESTORE = &HF120&. Il faut aller dans l'aide de Microsoft:
http://msdn.microsoft.com/en-us/library/ms646360(VS.85).aspx

Tu peux aussi aller jeter un coup d'oeil sur le lien suivant, c'est bourré d'exemples:
http://files.codes-sources.com/fichier.aspx?id=35981&f=Form1.frm


PAR CONTRE, écrire: 'SendMessage 2033168, WM_SYSCOMMAND, SC_SIZE Or SC_MINIMIZE, 0', c'est pas bon du tout !!! Ton handle est atribué dynamiquement et change donc à chaque fois que tu relances la calculatrice. Il faut rajouter du code pour le trouver...

J'étais en train de te pondre un exemple pour ton message précédent (en VBA sous Excel, je travaille là dessus), mais je suis tombé sur un hic: ça marche très bien pour la calculatrice, très bien pour notepad, mais pas du tout pour Paint !!!! ET là, je ne comprends pas...

Je vais poster un message dessus, peut-être que quelqu'un saura me répondre.



-------- PROGRAMME VBA EXCEL ----------------


Option Explicit

'On déclare les API
Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function SendDlgItemMessage Lib "User32.dll" Alias "SendDlgItemMessageA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'On déclare les constantes utilisées dans les API (un petit tour sur google avec "Private Const ****** As Long =" permet de vite trouver leurs valeurs !)
Private Const GW_HWNDNEXT As Long = &H2
Private Const WM_SIZE As Long = &H5
Private Const WM_CLOSE As Long = &H10
Private Const SC_SIZE As Long = &HF000

Private Const WM_SYSCOMMAND As Long = &H112
Private Const SC_MINIMIZE As Long = &HF020&
Private Const SC_MAXIMIZE As Long = &HF030&
Private Const SC_RESTORE As Long = &HF120&



'Ca c'est le programme pour Paint qui ne marche pas ?!

Sub Paint_program()

Dim pidPaint As Long
Dim hWndPaint1 As Long
Dim hWndPaint2 As Long
Dim hWndPaint3 As Long

'On ouvre Paint et on en profite pour récupérer son process ID
pidPaint = Shell("mspaint.exe", vbNormalFocus)
'On récupère le handle de la fenêtre ouverte à partir du pid (à partir d'un code fourni par Microsoft: 'http://support.microsoft.com/kb/242308)
hWndPaint1 = GetWinHandle(pidPaint)
'On peut aussi le récupérer à partir du titre de la fenêtre, mais il faut le titre complet et exact
hWndPaint2 = FindWindow(vbNullString, "Sans titre - Paint") 'Ce code marche parce qu'on a le titre exact
'hWndPaint = FindWindow(vbNullString, "Sans titre Paint") 'FindWindow va renvoyer 0, car il y a une faute dans le texte
'Dernière méthode: on peut récupérer à partir de la classe la fenêtre ( à déterminer avec spy++ ou Winspector par exmple)
hWndPaint3 = FindWindow("MSPaintApp", vbNullString)

'Petit message
MsgBox "Infos coming from the Shell" & vbCrLf & "PID: " & Hex(pidPaint) & vbCrLf & "Windows handle: " & Hex(hWndPaint1) _
& vbCrLf & vbCrLf & "hWnd from text: " & Hex(hWndPaint2) _
& vbCrLf & vbCrLf & "hWnd from classname: " & Hex(hWndPaint3)

'On réduit la fenêtre
SendMessage hWndPaint1, WM_SYSCOMMAND, SC_MINIMIZE, 0
MsgBox "Fenêtre réduite"
'On maximise la fenêtre
SendMessage hWndPaint1, WM_SYSCOMMAND, SC_MAXIMIZE, 0
MsgBox "Fenêtre agrandie"
'On restaure la taille initiale de la fenêtre
SendMessage hWndPaint1, WM_SYSCOMMAND, SC_RESTORE, 0
MsgBox "Fenêtre restaurée"
'On ferme la fenêtre
SendMessage hWndPaint1, WM_CLOSE, 0, 0
MsgBox "Programme fermé"

End Sub

'Ca c'est le programme pour Notepad qui fonctionne !

Sub Notepad_program()

Dim pidNotepad As Long
Dim hWndNotepad1 As Long
Dim hWndNotepad2 As Long
Dim hWndNotepad3 As Long

'On ouvre Paint et on en profite pour récupérer son process ID
pidNotepad = Shell("notepad", vbNormalFocus)
'On récupère le handle de la fenêtre ouverte à partir du pid (à partir d'un code fourni par Microsoft: 'http://support.microsoft.com/kb/242308)
hWndNotepad1 = GetWinHandle(pidNotepad)
'On peut aussi le récupérer à partir du titre de la fenêtre, mais il faut le titre complet et exact
hWndNotepad2 = FindWindow(vbNullString, "Sans titre - Bloc-notes") 'Ce code marche parce qu'on a le titre exact
'hWndPaint = FindWindow(vbNullString, "Sans titre Bloc-notes") 'FindWindow va renvoyer 0, car il y a une faute dans le texte
'Dernière méthode: on peut récupérer à partir de la classe la fenêtre ( à déterminer avec spy++ ou Winspector par exmple)
hWndNotepad3 = FindWindow("Notepad", vbNullString)

'Petit message
MsgBox "Infos coming from the Shell" & vbCrLf & "PID: " & Hex(pidNotepad) & vbCrLf & "Windows handle: " & Hex(hWndNotepad1) _
& vbCrLf & vbCrLf & "hWnd from text: " & Hex(hWndNotepad2) _
& vbCrLf & vbCrLf & "hWnd from classname: " & Hex(hWndNotepad3)

'On réduit la fenêtre
SendMessage hWndNotepad1, WM_SYSCOMMAND, SC_MINIMIZE, 0
MsgBox "Fenêtre réduite"
'On maximise la fenêtre
SendMessage hWndNotepad1, WM_SYSCOMMAND, SC_MAXIMIZE, 0
MsgBox "Fenêtre agrandie"
'On restaure la taille initiale de la fenêtre
SendMessage hWndNotepad1, WM_SYSCOMMAND, SC_RESTORE, 0
MsgBox "Fenêtre restaurée"
'On ferme la fenêtre
SendMessage hWndNotepad1, WM_CLOSE, 0, 0
MsgBox "Programme fermé"

End Sub

'Ca c'est le programme pour la calculatrice windows marche aussi !

Sub Calc_program()

Dim pidCalc As Long
Dim hWndCalc1 As Long
Dim hWndCalc2 As Long
Dim hWndCalc3 As Long

'On ouvre Calc et on en profite pour récupérer son process ID
pidCalc = Shell("calc.exe", vbNormalFocus)
'On récupère le handle de la fenêtre ouverte à partir du pid (à partir d'un code fourni par Microsoft: 'http://support.microsoft.com/kb/242308)
hWndCalc1 = GetWinHandle(pidCalc)
'On peut aussi le récupérer à partir du titre de la fenêtre, mais il faut le titre complet et exact
hWndCalc2 = FindWindow(vbNullString, "Calculatrice") 'Ce code marche parce qu'on a le titre exact
'hWndCalc = FindWindow(vbNullString, "Calculatric") 'FindWindow va renvoyer 0, car il y a une faute dans le texte
'Dernière méthode: on peut récupérer à partir de la classe la fenêtre ( à déterminer avec spy++ ou Winspector par exmple)
hWndCalc3 = FindWindow("SciCalc", vbNullString)

'Petit message
MsgBox "Infos coming from the Shell" & vbCrLf & "PID: " & Hex(pidCalc) & vbCrLf & "Windows handle: " & Hex(hWndCalc1) _
& vbCrLf & vbCrLf & "hWnd from text: " & Hex(hWndCalc2) _
& vbCrLf & vbCrLf & "hWnd from classname: " & Hex(hWndCalc3)

'On réduit la fenêtre
SendMessage hWndCalc1, WM_SYSCOMMAND, SC_MINIMIZE, 0
MsgBox "Fenêtre réduite"
'On maximise la fenêtre
SendMessage hWndCalc1, WM_SYSCOMMAND, SC_MAXIMIZE, 0
MsgBox "Fenêtre agrandie"
'On restaure la taille initiale de la fenêtre
SendMessage hWndCalc1, WM_SYSCOMMAND, SC_RESTORE, 0
MsgBox "Fenêtre restaurée"
'On ferme la fenêtre
SendMessage hWndCalc1, WM_CLOSE, 0, 0
MsgBox "Programme fermé"

End Sub

'Code trouvé sur http://support.microsoft.com/kb/242308 -> utilisé pour la fonction GetWinHandle
Function ProcIDFromWnd(ByVal hwnd As Long) As Long

Dim idProc As Long

' Get PID for this HWnd
GetWindowThreadProcessId hwnd, idProc

' Return PID
ProcIDFromWnd = idProc

End Function

'Code trouvé sur http://support.microsoft.com/kb/242308 -> fonction utilisée pour récupérer le handle d'une fenêtre à partir du pid du programme qui l'a lancée
Function GetWinHandle(hInstance As Long) As Long

Dim tempHwnd As Long

' Grab the first window handle that Windows finds:
tempHwnd = FindWindow(vbNullString, vbNullString)

' Loop until you find a match or there are no more window handles:
Do Until tempHwnd = 0
' Check if no parent for this window
If GetParent(tempHwnd) = 0 Then
' Check for PID match
If hInstance = ProcIDFromWnd(tempHwnd) Then
' Return found handle
GetWinHandle = tempHwnd
' Exit search loop
Exit Do
End If
End If

' Get the next window handle
tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)

Loop

End Function
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
SC_RESTORE n'est pas un message, c'est un des paramètres possibles wParam du message WM_SYSCOMMAND :
http://msdn.microsoft.com/en-us/library/ms646360(VS.85).aspx

Il faut donc écrire:
PostMessage(hwnd, WM_SYSCOMMAND,SC_RESTORE, 0)
Messages postés
425
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
28 octobre 2016
1
Franchement Mercii Chouchensb tu m'aide beaucoup dans mes recherches !!!

je cherche quelquechose et hop direct la réponse

Mercii
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Ben on va dire que t'as de la chance que je sois en train de pondre du code avec les mêmes API que toi et que je galère moi aussi ;) C'est pas évident à utiliser tout ça !
Messages postés
425
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
28 octobre 2016
1
grv ^^ jé débuté l'informatique a 6 7 ans et j'ai commencé a programmer a 10 ans sur amstrad et pi DOS et Windows et l'a j'ai compris toutes les fonctions de windows (api) a 15 ans (aujourd'hui) !!
cé trop cool mercii encore ^^





Micosf01 Cpcdos sf01 Favier Sébastien 01

Messages postés
425
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
28 octobre 2016
1
Il y a un truk qui est zarb

Pour
Private Const SC_RESTORE As Long = &HF120&

plu loin ..

.. PostMessage(hwnd, SC_RESTORE, 0, 0)

quand j'execute ca pour restaurer une fenêtre , ca fé tous bizzar ,
la fenêtre s'affiche pas et j'ai le curseur pour positionner la fenêtre (une croix avec 4 flèches autour ' move ') qui saffiche et rien .. ( Ca ne le restaure pas ! )

ça marche chez vous ? c'est mon ordi ?
Messages postés
425
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
28 octobre 2016
1
Franchement té un super gars !! Mercii ca marche juste un " , 0 " en moins et WM_SYSCOMMAND en plus ca fonctionne mercii encore !! ^^
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
PS

Quand au bug avec Paint dans l'exemple VBA fourni plus haut, il s'afit d'un problème de timing:
http://www.vbfrance.com/forum/sujet-PROBLEME-HANDLE-PID-CODE-NE-FONCTIONNE-AVEC-PAINT_1464341.aspx
Messages postés
425
Date d'inscription
samedi 11 juillet 2009
Statut
Membre
Dernière intervention
28 octobre 2016
1
et pour le " sleep() " a la fin , il se place comment ?? (dans ton sujet de paint)
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Tu le mets juste après le "shell" qui lance le programme... histoire de laisser un peu de temps au programme pour démarrer avant de rechercher son handle avec FindWindow. C'est ce qui posait problème: je démarrais Paint, et de suite, avant même que Paint ait le temps de se lancer, je recherchait son handle.... Forcément, ça marchait pas très bien ! Notepad et la calculatrice windows devaient démarrer plus vite faut croire.