Articles of 键盘钩

JNA键盘钩在Windows中

我已经在Windows上安装了一个JNA代码来安装键盘钩子(使用JNA的例子)。 代码编译和一切,我得到安装的钩子(我成功处理钩),我也可以卸载钩成功。 但是,当我按下键盘上的任何键时,回叫将永远不会被调用。 这里是我的代码(大部分是从JNA例子中获得的types定义,直接到我的部分去“main”) import com.sun.jna.IntegerType; import com.sun.jna.Pointer; import com.sun.jna.PointerType; import com.sun.jna.Structure; import com.sun.jna.FromNativeContext; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; import com.sun.jna.win32.StdCallLibrary; import com.sun.jna.win32.StdCallLibrary.StdCallCallback; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.Library; import com.sun.jna.win32.W32APITypeMapper; import com.sun.jna.win32.W32APIFunctionMapper; import java.util.Map; import java.util.HashMap; public class HelloWorld { static Map UNICODE_OPTIONS = new HashMap() { { put("type-mapper", W32APITypeMapper.UNICODE); put("function-mapper", W32APIFunctionMapper.UNICODE); } }; public […]

在键盘挂钩ToAscii / ToUnicode销毁死锁

看起来,如果在全局WH_KEYBOARD_LL挂钩中调用ToAscii()或ToUnicode() ,并且按下死锁,它将被“销毁”。 例如,假设您已经在Windows中将您的input语言configuration为西class牙语,并且您希望在程序中input重音字母á 。 通常情况下,按下单引号键(死键),然后按字母“a”,然后在屏幕上按预期显示重音符号。 但是,如果在低级键盘钩子函数中调用ToAscii()或ToUnicode() ,则这不起作用。 看来这个死钥匙被毁了,所以屏幕上没有任何重音字母。 取消对上述function的调用解决了这个问题…但不幸的是,我需要能够调用这些function。 我google了一会儿,虽然很多人似乎有这个问题,没有提供好的解决scheme。 任何帮助将非常感激! 编辑:我打电话ToAscii()将虚拟键代码和我的LowLevelKeyboardProc挂钩函数中收到的扫描代码转换为将在屏幕上显示为用户所产生的字符。 我尝试过MapVirtualKey(kbHookData->vkCode, 2) ,但这不像ToAscii()那样“完整”。 例如,如果按Shift + 2,则会得到“2”,而不是“@”(或Shift + 2将为用户的键盘布局/语言生成的任何内容)。 ToAscii()是完美的…直到一个ToAscii()被按下。 编辑2:这是钩子函数,删除了不相关的信息: LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) { LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam; BYTE keyboard_state[256]; if (code < 0) { return CallNextHookEx(keyHook, code, wParam, lParam); } WORD wCharacter = 0; GetKeyboardState(&keyboard_state); int ta […]

是否有可能检测到Windows的低级键盘挂钩已被自动断开连接?

我正在使用一个使用键盘钩子的程序。 但是,当运行程序的PC稍微超载时,会导致Windows从程序中断开连接,导致它不再响应按键。 有没有办法通过使用不同的架构,可能涉及到一个pipe道,来防止这个问题,甚至更好地提出一种解决完全相同问题的不同方法?

如何使用LowLevelKeyboardHook挂钩Win + Tab

简而言之:在Win + Tab之后阻塞Win会使Windows认为Win仍然下降,因此例如用Win键按下S将会打开search界面,而不是只input“s”…直到用户按下再次赢 。 不阻止它意味着Windows开始菜单将显示。 我遇到了一个难题 使用LowLevelKeyboardHook使用Alt + Tab ,或使用RegisterHotKey Win + Some Ubounded Key ,我没有任何困难。 只有使用LowLevelKeyboardHook的Win键LowLevelKeyboardHook 。 在下面的例子中,当Win + Tab组合被检测到时,我接pipeWin Win事件。 这导致每一个下面的按键行为就像Win键仍然closures一样。 private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode != HC_ACTION) return CallNextHookEx(_hookID, nCode, wParam, lParam); var keyInfo = (Kbdllhookstruct)Marshal.PtrToStructure(lParam, typeof(Kbdllhookstruct)); if (keyInfo.VkCode == VK_LWIN) { if (wParam == […]

使用WH_KEYBOARD的SetWindowsHookEx不适用于我,我错了什么?

#include <iostream> #include <fstream> #define _WIN32_WINNT 0x501 #include <windows.h> using namespace std; HHOOK hKeyboardHook = 0; LRESULT CALLBACK KeyboardCallback(int code,WPARAM wParam,LPARAM lParam) { cout << "a key was pressed" << endl; ofstream myfile; myfile.open ("hookcheck.txt", ios::ate | ios::app); myfile << "a key was pressed\n"; myfile.close(); return CallNextHookEx(hKeyboardHook,code,wParam,lParam); } int main() { HWND consoleWindow = GetConsoleWindow(); […]