pinvoke函数getKeyBoardLayout()出错

时间:2011-03-29 13:38:58

标签: c# pinvoke keyboard-events keyboard-layout keylogger

我正在尝试编写一个基本的背景键盘记录器...键盘scanCodes和States通过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 个答案:

答案 0 :(得分:1)

您正在将进程ID传递给该函数。它需要一个线程ID。 GetWindowThreadProcessId()的返回值。使用Marshal.GetLastWin32Error()的方式也是错误的,当API函数返回失败代码时,使用它。