pinvoke 函数 getKeyBoardLayout() 出错
我正在尝试编写一个基本的后台键盘记录器...键盘扫描代码和状态通过 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;
}
I'm trying to write a basic background keylogger... Keyboard scanCodes and States are converted via pinvoke functions ToAsciiEx or ToUnicodeEx. These function have an argument for KeyboardLayout. I have a function (see below) for getting the current (active windows) keyboard layout. But this functions always returns 0. Error code is 6 (ERROR_INVALID_HANDLE).
Any sugessions ?
thx for answers
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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您正在将进程 ID 传递给该函数。它需要一个线程 ID。 GetWindowThreadProcessId() 的返回值。您使用 Marshal.GetLastWin32Error() 的方式也是错误的,您应该仅在 API 函数返回失败代码时使用它。
You are passing a process ID to the function. It requires a thread ID. The return value of GetWindowThreadProcessId(). The way you use Marshal.GetLastWin32Error() is wrong too, you should only use it when an API function returned a failure code.