Ошибка с функцией pinvoke getKeyBoardLayout()

Я пытаюсь написать базовый фоновый кейлоггер... ScanCodes и состояния клавиатуры преобразуются с помощью функций 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;
    }

person ijavid    schedule 29.03.2011    source источник


Ответы (1)


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

person Hans Passant    schedule 29.03.2011
comment
спасибо за ваш ответ, это решило мою проблему. теперь код выглядит проще: uint tid = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero); IntPtr layout = GetKeyboardLayout(tid); return layout; - person ijavid; 31.03.2011