【问题标题】:Error with pinvoke function getKeyBoardLayout()pinvoke 函数 getKeyBoardLayout() 出错
【发布时间】:2011-03-29 13:38:57
【问题描述】:

我正在尝试编写一个基本的后台键盘记录器...键盘扫描代码和状态通过 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;
    }

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,它解决了我的问题。现在代码看起来更简单了:uint tid = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero); IntPtr layout = GetKeyboardLayout(tid); return layout;
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多