Restaurer fenêtre sendmessage [Résolu]

Cpcdos 428 Messages postés samedi 11 juillet 2009Date d'inscription 28 octobre 2016 Dernière intervention - 28 août 2010 à 11:31 - Dernière réponse : Chouchensb 64 Messages postés jeudi 3 mars 2005Date d'inscription 2 septembre 2010 Dernière intervention
- 28 août 2010 à 18:55
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 ?
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Chouchensb 64 Messages postés jeudi 3 mars 2005Date d'inscription 2 septembre 2010 Dernière intervention - 28 août 2010 à 11:58
3
Merci
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

Merci Chouchensb 3

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de Chouchensb
Meilleure réponse
Chouchensb 64 Messages postés jeudi 3 mars 2005Date d'inscription 2 septembre 2010 Dernière intervention - 28 août 2010 à 14:46
3
Merci
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)

Merci Chouchensb 3

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de Chouchensb
Cpcdos 428 Messages postés samedi 11 juillet 2009Date d'inscription 28 octobre 2016 Dernière intervention - 28 août 2010 à 12:04
0
Merci
Franchement Mercii Chouchensb tu m'aide beaucoup dans mes recherches !!!

je cherche quelquechose et hop direct la réponse

Mercii
Commenter la réponse de Cpcdos
Chouchensb 64 Messages postés jeudi 3 mars 2005Date d'inscription 2 septembre 2010 Dernière intervention - 28 août 2010 à 12:11
0
Merci
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 !
Commenter la réponse de Chouchensb
Cpcdos 428 Messages postés samedi 11 juillet 2009Date d'inscription 28 octobre 2016 Dernière intervention - 28 août 2010 à 12:15
0
Merci
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

Commenter la réponse de Cpcdos
Cpcdos 428 Messages postés samedi 11 juillet 2009Date d'inscription 28 octobre 2016 Dernière intervention - 28 août 2010 à 13:59
0
Merci
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 ?
Commenter la réponse de Cpcdos
Cpcdos 428 Messages postés samedi 11 juillet 2009Date d'inscription 28 octobre 2016 Dernière intervention - 28 août 2010 à 14:50
0
Merci
Franchement té un super gars !! Mercii ca marche juste un " , 0 " en moins et WM_SYSCOMMAND en plus ca fonctionne mercii encore !! ^^
Commenter la réponse de Cpcdos
Chouchensb 64 Messages postés jeudi 3 mars 2005Date d'inscription 2 septembre 2010 Dernière intervention - 28 août 2010 à 14:56
0
Merci
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
Commenter la réponse de Chouchensb
Cpcdos 428 Messages postés samedi 11 juillet 2009Date d'inscription 28 octobre 2016 Dernière intervention - 28 août 2010 à 14:59
0
Merci
et pour le " sleep() " a la fin , il se place comment ?? (dans ton sujet de paint)
Commenter la réponse de Cpcdos
Chouchensb 64 Messages postés jeudi 3 mars 2005Date d'inscription 2 septembre 2010 Dernière intervention - 28 août 2010 à 18:55
0
Merci
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.
Commenter la réponse de Chouchensb

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.