Ошибка с функцией pinvoke getKeyBoardLayout () - PullRequest
1 голос
/ 29 марта 2011

Я пытаюсь написать базовый фоновый кейлоггер ... Сканирование клавиатурыКоды и состояния преобразуются с помощью функций pinvoke ToAsciiEx или ToUnicodeEx.Эти функции имеют аргумент для KeyboardLayout.У меня есть функция (см. Ниже) для получения текущей (активные окна) раскладки клавиатуры.Но эта функция всегда возвращает 0. Код ошибки - 6 (ERROR_INVALID_HANDLE).

Любые предложения?

Спасибо за ответы

    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;
    }

1 Ответ

1 голос
/ 29 марта 2011

Вы передаете идентификатор процесса в функцию.Требуется идентификатор потока.Возвращаемое значение GetWindowThreadProcessId ().То, как вы используете Marshal.GetLastWin32Error (), также неверно, вы должны только использовать его, когда функция API возвратила код ошибки.

...