Cpcdos
Messages postés425Date d'inscriptionsamedi 11 juillet 2009StatutMembreDernière intervention28 octobre 2016
-
28 août 2010 à 11:31
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010
-
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 ?
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)
'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)
'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)
' 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)
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 20101 28 août 2010 à 12:11
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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Cpcdos
Messages postés425Date d'inscriptionsamedi 11 juillet 2009StatutMembreDernière intervention28 octobre 20161 28 août 2010 à 12:15
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 ^^
Cpcdos
Messages postés425Date d'inscriptionsamedi 11 juillet 2009StatutMembreDernière intervention28 octobre 20161 28 août 2010 à 13:59
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 ! )
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 20101 28 août 2010 à 18:55
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.