Focus... [Résolu]

Signaler
Messages postés
85
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2010
-
Messages postés
85
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2010
-
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

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
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#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
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#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Ce n'est pas plutôt sur le DllImport que ça coince ?
Si oui, rajoute "using System.Runtime.InteropServices"

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
ça doit être faisable en envoyant un message correspondant au raccourcis clavier ctrl+v à la fenetre word en question

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
85
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2010

Bah oui ca doit être faisable mais comment ?

(Je dis word mais ca doit pouvoir fonctionner sur n'importe quelle application)
Messages postés
85
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2010

Merci beaucoup, j'essayerai ca ce soir ou demain.
Messages postés
85
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2010

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.
Messages postés
85
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2010

En fait ca coince aussi sur le structlayout et le field offset
Messages postés
85
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2010

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.