Coller le presse papierdans l'application active. [Résolu]

KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 14 oct. 2011 à 18:53 - Dernière réponse :  Utilisateur anonyme
- 16 oct. 2011 à 09:53
Bonsoir,

Chaque jours j'écris les mêmes message et pour des raisons de pratique j'ai décidé de me créer un petit programme d'insertion de texte rapide, un peu comme clavier+.
J'ai donc créé 12 textbox dans lesquelles j'entre le texte voulu, et j'ai créer des raccourci allant de F1 à F12 qui copie dans le presse papier la contenance du textbox (et ceux même si mon prog n'as pas le focus)
Jusqu'ici tout va bien.
Mon problème vient donc au moment de coller le texte dans la fenetre active.
J'ai parcouru X forum, ou j'y est vu quelque solutions que je n'ai pas reussi à adapter.
Voici les méthodes que j'ai testé :

SendKeys.Send("^v")'pour simuler un copier coller mais ne fonctionne pas

SendKeys.Send(Clipboard.GetText)

Si je fais
Msgbox(Clipboard.GetText)

Je vois bien ce que je viens de sauvegarder dans le presse papier
Quelqu'un pourrai t-il m'aider à simuler le coller ou à trouver une autre méthode ?
Voici mon code complet : (vb.net)
Public Class Form1
    'enumération définissant l'état des touches CTRL, SHIFT, ALT et WIN

    Enum FsModifiers
        None = 0 'aucune touche
        Alt = 1
        Control = 2
        Shift = 4
        Windows = 8
        Alt_Ctrl = 3
        Alt_Shift = 5
        Alt_Windows = 9
        Ctrl_Shift = 6
        Ctrl_Windows = 10
        Shift_Windows = 12
        No_Repeat = 16384 'indisponible sous Vista/XP/2000
    End Enum
    'Déclaration des API
    'handle = handle de la fenêtre qui gérera le raccourci
    'id = identifiant qu'on se choisit pour notre hotkey
    'fsModifier : un type FsModifiers (enum)
    'vk : le code clé correspondant à la touche
    Declare Auto Function RegisterHotKey Lib "user32.dll" (ByVal handle As IntPtr, ByVal id As Integer, ByVal fsModifier As FsModifiers, ByVal vk As Keys) As Boolean

    'handle : handle de l'application qui gère le raccourci
    'id : l'identifiant du raccourci
    Declare Auto Function UnregisterHotKey Lib "user32.dll" (ByVal handle As IntPtr, ByVal id As Integer) As Integer

    'on définit deux raccourcis :
    Private Const HOTKEY_ID1 As Integer = 571584 'numéros aléatoires
    Private Const HOTKEY_ID2 As Integer = 752452
    Private Const HOTKEY_ID3 As Integer = 644587
    Private Const HOTKEY_ID4 As Integer = 644588
    Private Const HOTKEY_ID5 As Integer = 644589
    Private Const HOTKEY_ID6 As Integer = 644510
    Private Const HOTKEY_ID7 As Integer = 644511
    Private Const HOTKEY_ID8 As Integer = 644512
    Private Const HOTKEY_ID9 As Integer = 644513
    Private Const HOTKEY_ID10 As Integer = 644514
    Private Const HOTKEY_ID11 As Integer = 644515
    Private Const HOTKEY_ID12 As Integer = 644516

    'la constante WM_HOTKEY fournir par Microsoft
    Private Const WM_HOTKEY As Integer = 786

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'dès le lancement on définit nos deux hotkeys : ALT+F1 et Alt+F2
        RegisterHotKey(Me.Handle, HOTKEY_ID1, FsModifiers.Alt, Keys.F1)
        RegisterHotKey(Me.Handle, HOTKEY_ID2, FsModifiers.Alt, Keys.F2)
        RegisterHotKey(Me.Handle, HOTKEY_ID3, FsModifiers.Alt, Keys.F3)
        RegisterHotKey(Me.Handle, HOTKEY_ID4, FsModifiers.Alt, Keys.F4)
        RegisterHotKey(Me.Handle, HOTKEY_ID5, FsModifiers.Alt, Keys.F5)
        RegisterHotKey(Me.Handle, HOTKEY_ID6, FsModifiers.Alt, Keys.F6)
        RegisterHotKey(Me.Handle, HOTKEY_ID7, FsModifiers.Alt, Keys.F7)
        RegisterHotKey(Me.Handle, HOTKEY_ID8, FsModifiers.Alt, Keys.F8)
        RegisterHotKey(Me.Handle, HOTKEY_ID9, FsModifiers.Alt, Keys.F9)
        RegisterHotKey(Me.Handle, HOTKEY_ID10, FsModifiers.Alt, Keys.F10)
        RegisterHotKey(Me.Handle, HOTKEY_ID11, FsModifiers.Alt, Keys.F11)
        RegisterHotKey(Me.Handle, HOTKEY_ID12, FsModifiers.Alt, Keys.F12)
    End Sub

    'WndProc nous permettra de traiter les messages windows

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Select Case m.Msg 'on va tester le message reçu à chaque appel de cette fonction
            Case WM_HOTKEY 'si il s'agit du message WM_HOTKEY (si l'utilisateur a appuyé sur Alt+F1)
                If m.WParam = HOTKEY_ID1 Then  'on cherche quelle hotkey a déclenché l'évènement
                    Clipboard.SetDataObject(TextBox1.Text, True)
                    MsgBox(Clipboard.GetText)
                    SendKeys.Send(Clipboard.GetText)
                    Clipboard.GetText()
                ElseIf m.WParam = HOTKEY_ID2 Then
                    MsgBox("F2")
                ElseIf m.WParam = HOTKEY_ID3 Then
                    MsgBox("F3")
                ElseIf m.WParam = HOTKEY_ID4 Then
                    MsgBox("F4")
                ElseIf m.WParam = HOTKEY_ID5 Then
                    MsgBox("F5")
                ElseIf m.WParam = HOTKEY_ID6 Then
                    MsgBox("F6")
                ElseIf m.WParam = HOTKEY_ID7 Then
                    MsgBox("F7")
                ElseIf m.WParam = HOTKEY_ID8 Then
                    MsgBox("F8")
                ElseIf m.WParam = HOTKEY_ID9 Then
                    MsgBox("F9")
                ElseIf m.WParam = HOTKEY_ID10 Then
                    MsgBox("F10")
                ElseIf m.WParam = HOTKEY_ID11 Then
                    MsgBox("F11")
                ElseIf m.WParam = HOTKEY_ID12 Then
                    MsgBox("F12")
                End If
        End Select
        MyBase.WndProc(m)
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        UnregisterHotKey(Me.Handle, HOTKEY_ID1)
        UnregisterHotKey(Me.Handle, HOTKEY_ID2)
    End Sub


End Class


Merci d'avance.
Afficher la suite 

Votre réponse

26 réponses

Utilisateur anonyme - 15 oct. 2011 à 19:12
+3
Utile
J'ai utilisé GetAsyncKeyState pour l'exemple.
A tester avec un timer.
Met un point d'arrêt pour trouver les numéros des touches :
Imports System.Runtime.InteropServices

Public Class Form1
    <DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
    Public Shared Function GetAsyncKeyState(ByVal virtualKeyCode As Integer) As Short
    End Function

    Private Declare Auto Function GetForegroundWindow Lib "user32.dll" () As IntPtr

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = 1000
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim x As Keys
        For x = 0 To 226
            If GetAsyncKeyState(x) <> 0 Then
                'touche F4 (mettre un point d'arrêt pour connaître les numéros des touches)
                If x = 115 Then
                    'place le contenu du textbox dans le presse-papier
                    Clipboard.SetText(TextBox1.Text)
                    'handle process actif
                    Dim HandleActif As IntPtr = GetForegroundWindow()
                    'on énumère les processus
                    For Each p As Process In Process.GetProcesses
                        'si le process correspont
                        If p.MainWindowHandle.Equals(HandleActif) Then
                            'on l'active quand même
                            AppActivate(p.Id)
                            'on envoie la combinaison de touches
                            SendKeys.Send("^V")
                        End If
                    Next
                End If
            End If
        Next
    End Sub
End Class
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 14 oct. 2011 à 18:56
0
Utile
On peut pas éditer ?
Je voulais rajouter, ne faite pas attention à ceci, c'est mes test actuel (pour pas les perdres)
If m.WParam = HOTKEY_ID1 Then  'on cherche quelle hotkey a déclenché l'évènement
                    Clipboard.SetDataObject(TextBox1.Text, True)
                    MsgBox(Clipboard.GetText)
                    SendKeys.Send(Clipboard.GetText)
                    Clipboard.GetText()
Commenter la réponse de KcHeY
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 oct. 2011 à 07:42
0
Utile
Bonjour,

Le problème semble être que, étant- dans l'"autre fenêtre", tu perds les évènements de la première et ton sendkeys n'est donc pas effectué.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Utilisateur anonyme - 15 oct. 2011 à 10:59
0
Utile
Bonjour,

Il y a bien plus simple heureusement.
A tester avec le bloc-notes ouvert:

'place le contenu du textbox dans le presse-papier
Clipboard.SetText(TextBox1.Text)
'on cherche le process "notepad" 
For Each p As Process In Process.GetProcessesByName("notepad")
    'on l'active
    AppActivate(p.Id)
    'on envoie la combinaison de touches
    SendKeys.Send("^V")
Next


Bonne journée.
Commenter la réponse de Utilisateur anonyme
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 17:34
0
Utile
Hello,

Merci pour vos réponses !
Le problème c'est que l'application qui reçois le coller ne sera pas forcement notepad.
N'est-il pas possible d'effectuer cette même action mais dans le programme qui à le focus ?

Cordialement.
Commenter la réponse de KcHeY
Utilisateur anonyme - 15 oct. 2011 à 17:56
0
Utile
Dans ce cas, tu peux utiliser GetForegroundWindow :
Public Class Form1
    Private Declare Auto Function GetForegroundWindow Lib "user32.dll" () As IntPtr

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'place le contenu du textbox dans le presse-papier
        Clipboard.SetText(TextBox1.Text)
        'handle process actif
        Dim HandleActif As IntPtr = GetForegroundWindow()
        'on énumère les processus
        For Each p As Process In Process.GetProcesses
            'si le process correspont
            If p.MainWindowHandle.Equals(HandleActif) Then
                'on l'active quand même
                AppActivate(p.Id)
                'on envoie la combinaison de touches
                SendKeys.Send("^V")
            End If
        Next
    End Sub
End Class
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 15 oct. 2011 à 17:59
0
Utile
Me le code ci-dessus dans un timer, sinon l'exemple ne fonctionnera pas puisque ta fenêtre active est ton application elle-même.
Commenter la réponse de Utilisateur anonyme
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 18:27
0
Utile
Merci bien je vais tester ça de ce pas!
En revanche mon application n'as pas le focus, les raccourci fonctionne même si mon prog n'as pas le focus.
Commenter la réponse de KcHeY
Utilisateur anonyme - 15 oct. 2011 à 18:35
0
Utile
Ce que j'ai voulu dire c'est que je n'aurais pas du mettre l'exemple de code dans le Form_Load pour le test
Commenter la réponse de Utilisateur anonyme
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 18:43
0
Utile
Re,

Apparement ça ne fonctionne pas, ou je m'y suis mal pris ?

Private Declare Auto Function GetForegroundWindow Lib "user32.dll" () As IntPtr
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Select Case m.Msg 'on va tester le message reçu à chaque appel de cette fonction
            Case WM_HOTKEY 'si il s'agit du message WM_HOTKEY (si l'utilisateur a appuyé sur Alt+F1)
                If m.WParam = HOTKEY_ID1 Then  'on cherche quelle hotkey a déclenché l'évènement
                    'place le contenu du textbox dans le presse-papier
                    Clipboard.SetText(TextBox1.Text)
                    'handle process actif
                    Dim HandleActif As IntPtr = GetForegroundWindow()
                    'on énumère les processus
                    For Each p As Process In Process.GetProcesses
                        'si le process correspont
                        If p.MainWindowHandle.Equals(HandleActif) Then
                            'on l'active quand même
                            AppActivate(p.Id)
                            'on envoie la combinaison de touches
                            SendKeys.Send("^V")
                        End If
                    Next
Commenter la réponse de KcHeY
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 19:24
0
Utile
Ton code fonctionne mais pas dans toute les fenêtres.
Par exemple dans le textbox ou j'écris pour te répondre,ça ne fonctionne pas, ni dans une recherche google ou sur msn.
Commenter la réponse de KcHeY
Utilisateur anonyme - 15 oct. 2011 à 20:17
0
Utile
Par exemple sur internet explorer, la touche F4 est elle-même un raccourci clavier qui effectue une action (la zone de saisie perd le focus). C'est sûrement pour cette raison que SendKeys n'envoie pas la séquence (la zone de saisie n'ayant plus le focus).
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 oct. 2011 à 20:24
0
Utile
Bonsoir,

J'ai des difficultés à suivre vos "mouvements".
J'en ai beaucoup moins à en percevoir les différents dangers qu'ils peuvent induire.
Alors quoi : une fois l'appli (celle qui contient le timer) principale lancée, il suffirait d'ouvrir une autre appli, même celle non prévue, pour lui envoyer quelque-chose via un SendKeys !
Allons bon !
Mais rien de cela ne me parait ni sage, ni recommandable.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 20:32
0
Utile
Autant pour moi banana32 !
Merci tu as résolu mon problème :)
ucfoutu, je t'ai pas trop compris, tu veux dire que c'est dangereux pour moi ?
C'est moi qui rempli le textbox1 manuellement, c'est pour écrire à mes clients, au lieu a chaque fois d'écrire genre :
Merci pour votre achat votre commande à bien était expédié..... etc etc
je le numéro de suivi dans un textbox et tout le reste du texte s'écrira tout seul.
Thank you very much et goto résolu!
End sub
Commenter la réponse de KcHeY
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 oct. 2011 à 20:32
0
Utile
J'imagine même le pire : un mot de passe mis dans une textbox et destiné à la seule appli A, puis l'ouverture, par inadvertance, d'une autre appli qui, sur le net, par exemple, "recevra" avec joie ce mot-là !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 oct. 2011 à 20:35
0
Utile
Laisse, KcHeY ..

C'est probablement du au fait que je ne laisse en principe jamais rien au hasard et que je suis en général très schizophrène et pointilleux dans de nombreux domaines. (Il faut vite m'enfermer, je crois !)



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 20:35
0
Utile
Je ne me risquerai pas à écrire mes mots de passe quelque part
C'est pour remplir du texte sans trop d'importance.

Voici mes 4 textes possible :

Merci pour votre achat, votre commande à bien était expédié.
Vous pouvez suivre votre colis en ligne sur www.laposte.fr/csuivi
Votre numéro de suivi est le : "numéro de suivi"
Bonne réception et à bientôt sur BIIIIPPPP SENCURE.
Cordialement.

Merci pour votre achat, votre commande à bien était expédié.
Vous pouvez suivre votre colis en ligne sur www.laposte.fr/colissimo
Votre numéro de suivi est le : "numéro de suivi"
Bonne réception et à bientôt sur BIIIIPPPP SENCURE.
Cordialement.

Merci pour votre achat, votre commande à bien était expédié.
Vous la recevrez sous quelques jours.
Bonne réception et à bientôt sur BIIIIPPPP SENCURE.
Cordialement.
Commenter la réponse de KcHeY
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 20:37
0
Utile
Non ça fait 3
Commenter la réponse de KcHeY
Utilisateur anonyme - 15 oct. 2011 à 20:39
0
Utile
Bonsoir ucfoutu,

C'est pour cela que, dans mon premier exemple, je préférais identifier le bon process avant de lui envoyer la séquence de touches.

Bonne soirée à toi.
Commenter la réponse de Utilisateur anonyme
KcHeY 261 Messages postés dimanche 23 mai 2004Date d'inscription 22 septembre 2012 Dernière intervention - 15 oct. 2011 à 20:42
0
Utile
à noter que le programme serai lancé uniquement lors de mes envoi de mail / contact ou autre, il sera pas actif en permanence, et ne contiendra rien d'autre que du texte qui sera prédéfini, j'ecris vraiment toujours la même chose.

Bonne soirée à vous deux merci beaucoup.
Commenter la réponse de KcHeY

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.

Coller le presse papierdans l'application active. - page 2