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 39 40 41 42 43 44 45 46
   | Private Sub construit_et_envoi_message(ByVal comm() As String)
        Dim fenPP As IntPtr = GetForegroundWindow() 'handle de la fenêtre au premier plan
        Dim id As Integer = 0
        GetWindowThreadProcessId(fenPP, id) ' id du process auquel la fenêtre appartient
        Dim processus As Process = Process.GetProcessById(id) ' process recherché
        affiche_log("appli: " & processus.ProcessName, False, 0)
        Try
 
            Dim gestruct As GESTUREINFO
            gestruct.cbSize = Val(comm(3))
            gestruct.dwFlags = Val(comm(4))
            gestruct.dwID = Val(comm(5))
            gestruct.hwndTarget = fenPP
            Dim pt As POINTS
            pt.x = Val(comm(7)) : pt.y = Val(comm(8))
            gestruct.ptsLocation = pt
            gestruct.dwInstanceID = Val(comm(9))
            gestruct.dwSequenceID = Val(comm(10))
            gestruct.ullArguments = Val(comm(11))
            gestruct.cbExtraArgs = Val(comm(12))
 
            Dim tmp_struct_ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(gestruct)) ' réserver une zone mémoire non managé
            Marshal.StructureToPtr(gestruct, tmp_struct_ptr, True) ' copier les données de la structure
            If tmp_struct_ptr <> 0 Then
                Dim process_hdle As IntPtr = processus.Handle ' handle natif du process
                Dim my_struct_ptr As IntPtr = VirtualAllocEx(process_hdle, IntPtr.Zero, CUInt(Marshal.SizeOf(GetType(GESTUREINFO))), AllocationType.Commit, MemoryProtection.ReadWrite) ' zone mémoire dans le thread de l'appli visée
                If my_struct_ptr <> 0 Then
                    Dim result As IntPtr = WriteProcessMemory(process_hdle, my_struct_ptr, tmp_struct_ptr, Marshal.SizeOf(gestruct), IntPtr.Zero) ' copier le bloc non managé
                    If result <> 0 Then
                        Dim w_param As IntPtr = Val(comm(2))
                        affiche_log("processus.handle: " & processus.Handle.ToString, False, 0)
                        Dim mess As UInteger = Val(comm(1)) ' numéro du message &H119 dans le cas de WM_GESTURE
                        Dim sm_res As IntPtr = PostMessage(fenPP , mess, w_param, my_struct_ptr) ' envoyer le message
                        If sm_res = IntPtr.Zero Then
                            affiche_log("erreur: " & Marshal.GetLastWin32Error().ToString, False, 0) ' si sm_res = 0, rechercher le numéro d'erreur
                        Else
                            affiche_log("message envoyé ", False, 0)
                        End If
                    End If
                End If
            End If
            Marshal.FreeHGlobal(tmp_struct_ptr)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub | 
Partager