Lancer un exe et le redimensionner

Résolu
stepd Messages postés 6 Date d'inscription mardi 16 décembre 2014 Statut Membre Dernière intervention 16 décembre 2014 - 16 déc. 2014 à 16:48
stepd Messages postés 6 Date d'inscription mardi 16 décembre 2014 Statut Membre 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

8 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
16 déc. 2014 à 20:44
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

1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 16/12/2014 à 17:13
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
0
stepd Messages postés 6 Date d'inscription mardi 16 décembre 2014 Statut Membre 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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2014 à 17:21
C'est peut-être dû à ce dont je t'ai parlé plus haut (relire mon post scriptum).
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2014 à 18:55
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é" ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
16 déc. 2014 à 19:21
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

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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).
0
stepd Messages postés 6 Date d'inscription mardi 16 décembre 2014 Statut Membre Dernière intervention 16 décembre 2014
16 déc. 2014 à 19:48
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 ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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 ...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2014 à 20:02
Par contre, le click du bouton button2 semble bel et bien, lui, extraire le handle souhaité ...
0
stepd Messages postés 6 Date d'inscription mardi 16 décembre 2014 Statut Membre Dernière intervention 16 décembre 2014
16 déc. 2014 à 20:22
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 ?
0
stepd Messages postés 6 Date d'inscription mardi 16 décembre 2014 Statut Membre Dernière intervention 16 décembre 2014
16 déc. 2014 à 20:49
ça marche, super.
Merci Le Pivert ! et merci à toi aussi ucfoutu
0
Rejoignez-nous