Articles of 键盘钩子

监听键盘事件而不消耗X11 – 键盘挂钩

我尝试编写一个程序,在Ubuntu(KDE)中按下键盘消息来发送每个键的名称; 而不会干扰程序中正常的键盘操作(只是通知键名)。 这是我的程序: #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> using namespace std; void SendPressKeyEvent(Display *display, XKeyEvent xkey) { Window current_focus_window; int current_focus_revert; XGetInputFocus(display, &current_focus_window, &current_focus_revert); xkey.type = KeyPress; xkey.display = display; xkey.window = current_focus_window; xkey.root = DefaultRootWindow(display); xkey.subwindow = None; xkey.time = 1000 * time(0); xkey.x = 0; xkey.y = 0; […]

我可以更改用户的键盘input吗?

我发现这个键盘钩子代码,我试图稍微修改我的目的: http : //blogs.msdn.com/toub/archive/2006/05/03/589423.aspx 作为一个概述,我想让用户按下一个按键,说'E',并让键盘返回一个不同的字符'Z',以适应任何应用程序的焦点。 我现在改变的相关方法如下所示: private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { //The truely typed character: int vkCode = Marshal.ReadInt32(lParam); Console.WriteLine((Keys)vkCode); KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); replacementKey.vkCode = 90; // char 'Z' Marshal.StructureToPtr(replacementKey, lParam, false); //Now changed to my set character vkCode […]

全局键盘钩子与C ++

我已经看到很多有关钩子的教程和文章,但是我不太明白。 主要是因为每个例子使用不同的解决scheme。 我知道我将不得不实施一些能够保持活力的东西。 通常这是一种循环。 Q1:如果这个循环在callback函数的某个类中,是否会阻止线程执行它们? 我知道这将需要一段时间,但我会高度赞赏一些很好解释的全球键盘钩子的例子。 或者简单地把我和一些可执行的例子联系起来。 (相信我,我一直试图谷歌过去几个小时)。 谢谢

键盘挂钩改变键的行为

我正在创build一个安装键盘钩子的程序来捕获所有键并显示一些与它们相关的文本。 但是,我遇到了一个障碍,这是一些键更改行为,当安装钩。 我会看到发布一个小的,但完整的testing程序,但现在我只是描述了这个问题。 这个问题展现在Windows 7 64位,.NET 4.0(一个C#程序)上。 我认为这些都不重要。 我的钩子通过SetWindowsHookEx自行安装,然后处理在系统中处理的所有密钥。 如果钩子方法简单地返回,或者对键的最小处理(我将发布什么改变了一秒钟的行为),则键盘按照预期在程序中起作用。 但是,如果我从User32.dll中调用这个函数ToAscii ,找出我的键盘上的OemTilde或类似的键,那么任何“覆盖下一个键”的键将停止运行。 我不知道这样的键的正确名称,但是两个撇号types,“和” , as well as 〜 and ¨,都不起作用。 例如,如果我点击~然后是N ,则显示如下: 没有安装键盘挂钩: 随着键盘挂钩安装:n(通知no〜以上) 有谁知道为什么发生这种情况,我怎么能解决这个问题? 现在我只好在其他程序中正确处理密钥,即使这意味着我将无法在自己的程序中正确检测到正确的密钥序列。 一些更多的信息: 如果我将ToAscii函数作为钩子方法的一部分,则会出现不同的问题。 像¨键是处理两次,即。 如果我打了¨一次,记事本收到两个¨¨字符,现在打N只是加了N 但是,如果我使用BeginInvoke来处理单独的线程上的键,键盘钩子方法返回后,第一个问题发生。 我的程序可能有点特别: 我不使用键盘状态(即我传递的“键状态”256字节数组只是满了0) 我不在乎死钥匙(在我的程序不会处理它们的意义上,我只关心他们,我不希望我的程序使它们对系统的其他部分无用) 就这样,我的代码最终看起来如下: private bool IsDeadKey(uint key) { return ((Hook.Interop.MapVirtualKey(key, 2) & 2147483648) == 2147483648); } void _Hook_KeyDown_Async(KeyDownEventArgs e) { var inBuffer = […]

Word Addin本地键盘挂钩

我正在尝试创build一个带有自动更正function的MS Word插件。 下面的代码块取自这里 。 然而,它捕捉来自任何应用程序的所有关键事件。 我知道这是正常的,因为在这一行: SetWindowsHookEx(WH_KEYBOARD_LL, procedure, GetModuleHandle(module.ModuleName), 0); 最后一个参数是线程ID,当它等于0表示一个全局钩子。 但是,当我尝试将其更改为: SetWindowsHookEx(WH_KEYBOARD_LL, procedure, GetModuleHandle(module.ModuleName), AppDomain.GetCurrentThreadId()); 它没有捕获任何东西。 而不是AppDomain.GetCurrentThreadId() ,我也尝试了process.Threads[0].Id或GetCurrentThreadId()从 [DllImport("Kernel32.Dll")] public static extern uint GetCurrentThreadId(); 他们都返回相同的ID和0以外的任何值不起作用。 我该怎么办? public partial class ThisAddIn { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static IntPtr hookId = IntPtr.Zero; private delegate IntPtr HookProcedure(int nCode, […]

如何使用SetWindowsHookEx和WH_KEYBOARD钩住外部进程

我想挂钩例如记事本没有成功。 做一个全局钩子似乎工作正常。 在XP SP2上testing。 编辑:修正的代码现在工作。 MyDLL代码 #include <windows.h> #include <iostream> #include <stdio.h> HINSTANCE hinst; #pragma data_seg(".shared") HHOOK hhk; #pragma data_seg() //#pragma comment(linker, "/SECTION:.shared,RWS") compiler error in VC++ 2008 express LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam,LPARAM lParam) { if (code < 0) { return CallNextHookEx(0, code, wParam, lParam); } Beep(1000, 20); return CallNextHookEx(hhk, code, wParam, lParam); […]

我的应用程序如何findWindows消息的发件人?

我有一个应用程序在库中使用键盘钩子程序。 在一个消息的钩子wParam是255,我们认为是“(保留/ OEMClear)”。 我想找出这个消息的来源,因为它会导致我的应用程序在图书馆崩溃,并且鉴于它不应该发生,这将是很好的识别它。 信息只能在一台PC上重复出现 – 其他电脑根本看不到信息。 那么,有没有办法跟踪发送到窗口的消息的来源,或者系统上的所有消息?

全局键盘挂钩c

我想写一个全局的键盘钩不允许任务切换。当我GOOGLE了,我发现了很多代码在c#,cpp(和delphi),但我需要一些关于钩子的基本概念(将是最好的,如果例子是在C )。所以,请好好build议资源,链接可以帮助我从C的angular度来理解事物。 PS:我发现了一个很好的工作示例 (适用于winXP和旧版本),但是当我尝试编译代码时,它给了我: 我试着search所有头文件中的“IDC_”常量(MinGW gcc安装和开发者提供的缺省值),但没有运气…如果有人能够编译代码并使其运行,请帮助我。我没有在这里上传源代码,因为有一些头文件的依赖关系,在这种情况下,我不得不在这里发布所有的代码。 winXP是目标环境,但如果我得到它也运行Win7会更好。