Coller le presse papierdans l'application active.

Résolu
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012 - 14 oct. 2011 à 18:53
 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.

26 réponses

Utilisateur anonyme
15 oct. 2011 à 19:12
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
3
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
14 oct. 2011 à 18:56
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()
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 oct. 2011 à 07:42
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
0
Utilisateur anonyme
15 oct. 2011 à 10:59
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.
0

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

Posez votre question
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 17:34
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.
0
Utilisateur anonyme
15 oct. 2011 à 17:56
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
0
Utilisateur anonyme
15 oct. 2011 à 17:59
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.
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 18:27
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.
0
Utilisateur anonyme
15 oct. 2011 à 18:35
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
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 18:43
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
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 19:24
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.
0
Utilisateur anonyme
15 oct. 2011 à 20:17
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).
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 oct. 2011 à 20:24
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
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 20:32
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 oct. 2011 à 20:32
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 oct. 2011 à 20:35
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
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 20:35
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.
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 20:37
Non ça fait 3
0
Utilisateur anonyme
15 oct. 2011 à 20:39
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.
0
KcHeY Messages postés 261 Date d'inscription dimanche 23 mai 2004 Statut Membre Dernière intervention 22 septembre 2012
15 oct. 2011 à 20:42
à 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.
0
Rejoignez-nous