Lancer un exe et le redimensionner [Résolu]

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

12 réponses

Répondre au sujet
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 16 déc. 2014 à 20:44
+1
Utile
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

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Le Pivert
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 16/12/2014 à 17:13
0
Utile
1
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
stepd 6 Messages postés mardi 16 décembre 2014Date d'inscription 16 décembre 2014 Dernière intervention - 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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 16 déc. 2014 à 17:21
0
Utile
C'est peut-être dû à ce dont je t'ai parlé plus haut (relire mon post scriptum).
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 16 déc. 2014 à 18:55
0
Utile
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
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 16 déc. 2014 à 19:21
0
Utile
1
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

ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 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
stepd 6 Messages postés mardi 16 décembre 2014Date d'inscription 16 décembre 2014 Dernière intervention - 16 déc. 2014 à 19:48
0
Utile
2
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 ?
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 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 ...
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 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
stepd 6 Messages postés mardi 16 décembre 2014Date d'inscription 16 décembre 2014 Dernière intervention - 16 déc. 2014 à 20:22
0
Utile
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
stepd 6 Messages postés mardi 16 décembre 2014Date d'inscription 16 décembre 2014 Dernière intervention - 16 déc. 2014 à 20:49
0
Utile
ç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.