Focus...

Résolu
vxr888 Messages postés 85 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 27 novembre 2010 - 11 févr. 2005 à 10:34
vxr888 Messages postés 85 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 27 novembre 2010 - 22 févr. 2005 à 14:09
Salut à tous,

J'ai commencé à créer un application permettant d'entrer une chaîne de caractères prédéfinie là où on veut.

Ma chaîne de caractère se trouve dans une textbox.
J' ai par ailleurs réussi à la récupérer dans le presse-papiers (Clipboard).

Maintenant, il faudrait qu'elle se copie automatiquement (c'est-à-dire que je ne veux pas de clic droit - coller) à l'endroit où je place le focus.
Pas bien compliqué si c'était sans ce petit détail : elle doit pouvoir se copier en-dehors de l'application.
Par exemple, je mets le focus dans un document word et là, au bout d'un certain temps défini par le timer (le temps de mettre le focus à sa bonne place), ma chaîne se copie.

HELP ME, pleasssssssssse

9 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
14 févr. 2005 à 11:33
Pour des fenetres comme celles de visual et de notepad tu peux utiliser ce code :
SendKeys.Send("^V");
Ca envoie Ctrl+V a la fenetre active au moment de l'envoi.

Mais dans le cas de Word par exemple ça ne sera pas suffisant, il faudrais envoyer le message directement au controle de saisie de texte concerné.

Cocoricoooooooo !!!!
coq
MVP Visual C#
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
14 févr. 2005 à 17:13
Si tu cherches toujours : ce code devrait te permettre de déclencher le "coller" à la position du caret dans n'importe quelle appli.
Par contre si jamais tu es dans un menu de l'application au lieu d'etre sur une zone de saisie et qu'un element du menu a pour mnemo le 'v', tu peux avoir un comportement inatendu de l'appli.
Si tu trouve le moyen de vérifier que le focus dans l'appli visée est sur une zone de saisie, n'hésite pas à donner la solution ;-)

Les déclarations relatives aux APIs :
#region API: methodes

[DllImport("user32.dll")]
private static extern int SendInput(
int nInputs,
ref INPUT pInputs,
int cbSize
);

[DllImport("user32.dll")]
private static extern IntPtr GetMessageExtraInfo();

#endregion

#region API: constantes

private const uint INPUT_KEYBOARD = 1;
private const ushort VK_CONTROL = 0x11;
private const uint KEYEVENTF_KEYUP = 0x0002;

#endregion

#region API: structures

[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)]
public uint type;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public HARDWAREINPUT hi;
}

private struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}

private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}

private struct HARDWAREINPUT
{
public uint uMsg;
public ushort wParamL;
public ushort wParamH;
}

#endregion

Exemple d'utilisation :
Clipboard.SetDataObject(textBox_Texte.Text, true);

// attente de 5s pour avoir le temps de mettre
// le focus sur un controle de saisie dans
// une autre appli :-)
Thread.Sleep(5000);

int sizeofINPUT = Marshal.SizeOf(typeof(INPUT));

INPUT input = new INPUT();
input.type = INPUT_KEYBOARD;
input.ki.wScan = 0;
input.ki.time = 0;
input.ki.dwFlags = 0;
input.ki.dwExtraInfo = GetMessageExtraInfo();

// envoi de CTRL KEYDOWN
input.ki.dwFlags = 0; // KEYDOWN
input.ki.wVk = VK_CONTROL;
SendInput(1, ref input, sizeofINPUT);

// envoi de V KEYDOWN
input.ki.dwFlags = 0; // KEYDOWN
input.ki.wVk = (ushort)'V';
SendInput(1, ref input, sizeofINPUT);

// envoi de V KEYUP
input.ki.dwFlags = KEYEVENTF_KEYUP; // KEYUP
input.ki.wVk = (ushort)'V';
SendInput(1, ref input, sizeofINPUT);

// envoi de CTRL KEYUP
input.ki.dwFlags = KEYEVENTF_KEYUP; // KEYUP
input.ki.wVk = VK_CONTROL;
SendInput(1, ref input, sizeofINPUT);

SendInput Function
INPUT Structure
KEYBDINPUT Structure

Cocoricoooooooo !!!!
coq
MVP Visual C#
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 févr. 2005 à 12:48
Ce n'est pas plutôt sur le DllImport que ça coince ?
Si oui, rajoute "using System.Runtime.InteropServices"

Cocoricoooooooo !!!!
coq
MVP Visual C#
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 févr. 2005 à 23:08
ça doit être faisable en envoyant un message correspondant au raccourcis clavier ctrl+v à la fenetre word en question

Cocoricoooooooo !!!!
coq
MVP Visual C#

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

Posez votre question
vxr888 Messages postés 85 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 27 novembre 2010
14 févr. 2005 à 09:11
Bah oui ca doit être faisable mais comment ?

(Je dis word mais ca doit pouvoir fonctionner sur n'importe quelle application)
vxr888 Messages postés 85 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 27 novembre 2010
15 févr. 2005 à 10:14
Merci beaucoup, j'essayerai ca ce soir ou demain.
vxr888 Messages postés 85 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 27 novembre 2010
22 févr. 2005 à 11:49
La version 1 (sendkeys fonctionne à merveille)

La version 2 (API) me pose problème car Visual Studio ne veut apparemment
pas entendre parler de user32.dll !

Mais bon, vu que la version 1 fonctionne pour l'usage que je veux en faire y a aucun problème.

Encore Merci.
vxr888 Messages postés 85 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 27 novembre 2010
22 févr. 2005 à 14:00
En fait ca coince aussi sur le structlayout et le field offset
vxr888 Messages postés 85 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 27 novembre 2010
22 févr. 2005 à 14:09
Arf 3 fois le même message... pour rien !

Dsl j'ai des probs de connexion.

En effet en rajoutant "using System.Runtime.InteropServices" et bien entendu pour le
code "using System.Threading", ca fonctionne nickel.

Un grand merci.
Rejoignez-nous