Lancer un exe et le redimensionner [Résolu]

Messages postés
6
Date d'inscription
mardi 16 décembre 2014
Dernière intervention
16 décembre 2014
- 16 déc. 2014 à 16:48 - Dernière réponse :
Messages postés
6
Date d'inscription
mardi 16 décembre 2014
Dernière intervention
16 décembre 2014
- 16 déc. 2014 à 20:49
Bonjour,

A partir d'une form en vb.net, je souhaite lancer un programme en .exe (notepad++ par exemple) et le redimensionner.

J'ai essayé le code ci-dessous, le notepad++ se lance bien mais je n'arrive pas à le redimensionner.


Imports System.Runtime.InteropServices

Public Class Form1

Private Property hwnd As Long
Private Property ProcessPID As Object
Private Property ProcessHwnd As Object

Public Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim p As Process
p = Process.Start("C:\Program Files (x86)\Notepad++\notepad++.exe")
SetWindowPos(p.Handle, IntPtr.Zero, 0, 0, 400, 300, 0)
End Sub

End Class


Merci de votre aide
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
5531
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 16 déc. 2014 à 20:44
1
Merci
j'ai oublié dans la copie ceci:

Imports System.Runtime.InteropServices
Imports System.Threading


Ce qui donne ceci qui fonctionne très bien:

Imports System.Runtime.InteropServices
Imports System.Threading

Public Class Form1
    <DllImport("user32.dll")> _
    Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
    End Function
    <DllImport("user32.dll")> _
    Shared Function SetWindowText(ByVal hwnd As IntPtr, ByVal windowName As String) As Boolean
    End Function
 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim process As New Process()
        process.StartInfo.FileName = "notepad.exe"
        process.Start()
        Thread.Sleep(100)
        SetWindowPos(process.MainWindowHandle, IntPtr.Zero, 0, 0, 400, 300, 0)
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Dim process As New Process()
        process.StartInfo.FileName = "notepad.exe"
        process.Start()
        Thread.Sleep(100)
        SetWindowText(process.MainWindowHandle, "Fancy Notepad")
    End Sub
End Class

Merci cs_Le Pivert 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cs_Le Pivert
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 16/12/2014 à 17:13
0
Merci
Bonjour,
Je ne suis pas vb.nettiste, mais je dirais qu'il ne fauu pas confondre le handle d'un processus avec celui de la fenêtre ouverte par le dit processus, puisque c'est une fenêtre (et non un processus) que tu veux redimensionner.
C'est très probablement ton p.handle qu'il te faut modifier.
Ne serait-ce pas plutôt p.mainwindowhandle ?

PS : il serait peut-être par ailleurs assez prudent de faire en sorte, avant d'extraire le handle de cette fenêtre, qu'elle ait eu le temps d'être affichée

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
6
Date d'inscription
mardi 16 décembre 2014
Dernière intervention
16 décembre 2014
- 16 déc. 2014 à 17:17
j'ai essayé avec le p.MainWindowHandle mais ça ne change rien.
Et si j'affiche le p.MainWindowHandle j'ai toujours zéro.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 déc. 2014 à 17:21
0
Merci
C'est peut-être dû à ce dont je t'ai parlé plus haut (relire mon post scriptum).
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 déc. 2014 à 18:55
0
Merci
Dit autrement (ce ne serait pas mal du tout) :
Ton problème n'est autre que celui de la détermination du handle d'une fenêtre (et pas d'un processus).
Si tu ne parviens par exemple pas à rendre cette fenêtre "fille" de ton appli (ce qui nécessite bien évidemment la détermination de son handle, tu ne parviendras pas non plus à à en modifier les dimensions ni/ou la position.
Et le titre de ta discussion aurait probablement dû être plutot : Comment extraire le handle de la fenêtre d'une application ouverte via le lancement d'un processus ?
Je reste absolument persuadé de ce que tes difficultés réelles résultent du fait que tu cherches à extraire le handle d'une fenêtre qui n'est pas encore créée (voir ce que j'en ai dit plus haut), seul le processus qui doit ouvrir cette fenêtre ayant été "lancé" ...
Commenter la réponse de ucfoutu
Messages postés
5531
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 16 déc. 2014 à 19:21
0
Merci
Bonjour,

Essaie ceci:

Public Class Form1
    <DllImport("user32.dll")> _
    Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
    End Function
    <DllImport("user32.dll")> _
    Shared Function SetWindowText(ByVal hwnd As IntPtr, ByVal windowName As String) As Boolean
    End Function
 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim process As New Process()
        process.StartInfo.FileName = "notepad.exe"
        process.Start()
        Thread.Sleep(100)
        SetWindowPos(process.MainWindowHandle, IntPtr.Zero, 0, 0, 400, 300, 0)
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Dim process As New Process()
        process.StartInfo.FileName = "notepad.exe"
        process.Start()
        Thread.Sleep(100)
        SetWindowText(process.MainWindowHandle, "Fancy Notepad")
    End Sub
End Class

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 déc. 2014 à 19:33
Ou encore (mais je ne serais pas surpris de ce que VB.Net, que je ne connais pas, offre du "plus mieux") : ===>>> boucler tant que le handle = 0 (en prévoyant une sortie de boucle si trop longtemps = 0, par exemple).
Commenter la réponse de cs_Le Pivert
Messages postés
6
Date d'inscription
mardi 16 décembre 2014
Dernière intervention
16 décembre 2014
- 16 déc. 2014 à 19:48
0
Merci
J'ai essayé ton code Le Pivert.
Les redimensionnement du notepad ne marche pas mais par contre ça écrit bien "Fancy Notepad" dans le titre de la fenêtre.
C'est la fonction setWindowsPos qui ne marcherait pas ?
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 déc. 2014 à 19:57
Le titre donné à une fenêtre est applicable bien avant l'évènement Paint (ou son équivalent en VB.Net) de la dite fenêtre ...
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 déc. 2014 à 20:02
Par contre, le click du bouton button2 semble bel et bien, lui, extraire le handle souhaité ...
Commenter la réponse de stepd
Messages postés
6
Date d'inscription
mardi 16 décembre 2014
Dernière intervention
16 décembre 2014
- 16 déc. 2014 à 20:22
0
Merci
J'ai rajouté un sleep de 30 secondes et ça ne redimensionne toujours pas la fenêtre.
Est-ce que ce ne serait pas un paramètre d'appel à SetWindowsPos qui ne serait pas bon ?
Commenter la réponse de stepd
Messages postés
6
Date d'inscription
mardi 16 décembre 2014
Dernière intervention
16 décembre 2014
- 16 déc. 2014 à 20:49
0
Merci
ça marche, super.
Merci Le Pivert ! et merci à toi aussi ucfoutu
Commenter la réponse de stepd

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.