Question

J'essaie d'écrire un keylogger d'arrière-plan de base ... Les scancodes de clavier et les états sont convertis via des fonctions Pinvoke Toasciiex ou TouniCodeEx. Ces fonctions ont un argument pour le clavier. J'ai une fonction (voir ci-dessous) pour obtenir la disposition du clavier actuelle (Windows active). Mais cette fonction renvoie toujours 0. Le code d'erreur est 6 (error_invalid_handle).

Des sugesses?

merci pour les réponses

    static public IntPtr getActiveKeyBoardLayout() 
    {             
        int handle = 0;
        handle = GetForegroundWindow();

        IntPtr i = new IntPtr(handle);
        HandleRef hr = new HandleRef(wrapper, i);
        int pid;
        GetWindowThreadProcessId(hr, out pid);

        IntPtr layout = GetKeyboardLayout(pid);

        int er = Marshal.GetLastWin32Error();
        if (er > 0)
        {
            System.Console.Out.WriteLine("error " + er.ToString());
        }

        return layout;
    }
Était-ce utile?

La solution

Vous passez un ID de processus à la fonction. Il nécessite un ID de fil. La valeur de retour de getwindowthreadProcessId (). La façon dont vous utilisez Marshal.getLastWin32Error () est erronée aussi, vous devriez seulement Utilisez-le lorsqu'une fonction API a renvoyé un code de défaillance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top