IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Erreur pInvokestackImbalance sur SendMessage


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Erreur pInvokestackImbalance sur SendMessage
    Bonjour,

    voilà j’aurais besoins d'utiliser la fonction API SendMessage, toutefois j'ai de gros souci je sort en erreur à chaque fois.

    je précise que je suis sous Seven 32b.

    ci-dessous mon code (pour test)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
        'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal WMSG As Long, ByVal wParam As Long, ByVal lParam As String) As Long
        Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal WMSG As Long, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long
        Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean
        Private Const EM_REPLACESEL = &HC2
        Declare Auto Function BringWindowToTop Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean
        Private Const WM_COPY = &H301
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            Dim startInfo As New ProcessStartInfo("notepad.exe")
            Dim notepad As Process = Process.Start(startInfo)
            System.Threading.Thread.Sleep(100)
     
            Dim lpszParentClass As String = notepad.ProcessName
            Dim lpszParentWindow As String = notepad.MainWindowTitle
            Dim lpszClass As String = "Edit"
     
            Dim ParenthWnd As New IntPtr(0)
            Dim hWnd As New IntPtr(0)
     
            ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow)
     
            SendMessage(ParenthWnd, 100, &H43, 0)
            SendMessage(ParenthWnd, WM_COPY, IntPtr.Zero, IntPtr.Zero)
    que ce soit sur l'un ou l'autre j'ai cette erreur récurrente
    pInvokestackImbalance

    dans l'attente de vous lire, cordialement

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir neojeff,

    Si tu souhaites travailler avec ton titre de fenêtre pour récupérer son Handle alors faut mettre le vrai titre de fenêtre et pas celui que tu trouves dans les exemples sur des sites anglophones !

    Donc pour récupérer le Handle de la fenêtre Notepad :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Public Class Form1
     
       Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
     
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      Dim ParenthWnd As IntPtr = FindWindow("Notepad", "Nouveau document texte.txt - Bloc-notes")
    End Sub
     
    End Class

    Pour fermer la fenêtre Notepad :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Imports System.Runtime.InteropServices
     
    Public Class Form1
     
        <DllImport("User32.dll")> _
        Public Shared Function SendMessage(hWnd As IntPtr, uMsg%, wParam%, lParam$) As Integer
        End Function
     
        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
     
        Public Const WM_SYSCOMMAND As Integer = 274
        Public Const SC_CLOSE As Integer = 61536
     
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      Dim ParenthWnd As IntPtr = FindWindow("Notepad", "Nouveau document texte.txt - Bloc-notes")
         If Not ParenthWnd.Equals(IntPtr.Zero) Then
                SendMessage(ParenthWnd, WM_SYSCOMMAND, SC_CLOSE, 0)
      End If
    End Sub
     
    End Class

    Pour écrire dans la fenêtre Notepad ouverte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Imports System.Runtime.InteropServices
     
    Public Class Form1
     
        <DllImport("User32.dll")> _
        Public Shared Function SendMessage(hWnd As IntPtr, uMsg%, wParam%, lParam$) As Integer
        End Function
     
        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
     
        <DllImport("user32.dll")> _
        Public Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass$, lpszWindow$) As IntPtr
        End Function
     
        Public Const WM_SETTEXT = 12
     
     
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim lpszParentClass As String = "Notepad"
            Dim lpszParentWindow As String = "Nouveau document texte.txt - Bloc-notes"
            Dim lpszClass As String = "Edit"
     
            Dim ParenthWnd As New IntPtr(0)
            Dim hWnd As New IntPtr(0)
     
            ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow)
     
            If Not ParenthWnd.Equals(IntPtr.Zero) Then
                hWnd = FindWindowEx(ParenthWnd, hWnd, lpszClass, "")
                If Not hWnd.Equals(IntPtr.Zero) Then
                    SendMessage(hWnd, WM_SETTEXT, 0, "Ceci est 1 test !")
                End If
            End If
    End Sub
     
     
    End Class

    Comment savoir que est le nom de la classe d'une fenêtre ou bien la zone d'édition, le titre exact de la fenêtre, ...etc.... :

    Moi personnellement j'utilise AutoIt WindowInfo (Editeur du logiciel gratuit : Scite) un outil permet de survoler une fenêtre ouverte afin de connaitre ses informations !




    Tu peux lire aussi ce sujet : http://www.developpez.net/forums/d12...e/#post7054982


    Plus d'infos sur PInvoke : http://www.pinvoke.net/default.aspx/user32.findwindow



    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Bonsoir Wallace1,

    Oui, mais c'est déja ce que je fait, grace à ProcessStartInfo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim startInfo As New ProcessStartInfo("notepad.exe")
    Dim notepad As Process = Process.Start(startInfo)
     
    Dim lpszParentClass As String = notepad.ProcessName
    Dim lpszParentWindow As String = notepad.MainWindowTitle
    Cette partie fonctionne aussi, je récupére bien le handle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow)
    Je ferais toutefois des essais demain avec le code que tu ma fournie, en te remerciant, JF

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    La méthode que tu utilises qui vise à rechercher un processus Notepad en cours d'exécution a ses limites !!!!

    Si 2 instances de Notepad sont en cours alors laquelle ton programme choisis ???
    Je dirais sans doute le 1er dans la liste sinon il te faut parcourir les processus Notepad et retourner le titre de fenêtre qui t'intéresse.

    C'est pourquoi la fonction API "FindWindow" est bien plus intéressante car tu définies obligatoirement le 2ème argument qui est le titre de fenêtre afin de retourner son Handle.



    Voilà à mon humble avis la solution vers laquelle tu dois te tourner.

    A+

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Effectivement, oui je comprend mieux, je fais un essai des demain et te tiens informé.

    En te remerciant, JF

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Bonjour wallace1,

    J'ai effectué tous mes tests et cela fonctionne à merveille, j'ai aussi télécharger AutoIt WindowInfo qui est vraiment très utile comme outil.


    Merci de ton aide précieuse, cordialement JF

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/05/2015, 16h04
  2. Erreur 145 sur table mysql
    Par ramses83 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2007, 21h09
  3. [Kylix] erreur time.sur kylix avec redhat 9.0
    Par sumco dans le forum EDI
    Réponses: 4
    Dernier message: 20/05/2004, 15h13
  4. Réponses: 9
    Dernier message: 27/04/2004, 11h01
  5. [VB6] Erreur 9 sur redim preserve
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/10/2002, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo