从任何进程获取密钥

2023-11-30

我在网上看到了很多解决方案,但没有一个完全符合我的要求。当我的应用程序在后台运行时,在给定进程(不是我的控制台应用程序)中按下任何键的最佳/最简单方法是什么。我不需要修改器或任何东西。


如果您不太关心按下哪个进程,最简单的方法是调用获取异步键状态。但它的局限性很大,因为它不挂钩键盘并且需要您连续调用它。我认为最好的方法是挂钩键盘。

Using 设置WindowsHookEx实际上,您可以显式指定与挂钩过程关联的线程的标识符,以便您可以挂钩特定进程的键(请参阅dwThreadId).

这是一个您可以使用的类(最初在 Microsoft 博客上找到,但目前我似乎找不到作者姓名!)

public delegate IntPtr KeyboardProcess(int nCode, IntPtr wParam, IntPtr lParam);

public sealed class KeyboardHook
{
    public static event EventHandler<KeyPressedEventArgs> KeyPressed;
    private const int WH_KEYBOARD = 13;
    private const int WM_KEYDOWN = 0x0100;
    private static KeyboardProcess keyboardProc = HookCallback;
    private static IntPtr hookID = IntPtr.Zero;

    public static void CreateHook()
    {
        hookID = SetHook(keyboardProc);
    }

    public static void DisposeHook()
    {
        UnhookWindowsHookEx(hookID);
    }

    private static IntPtr SetHook(KeyboardProcess keyboardProc)
    {
        using (Process currentProcess = Process.GetCurrentProcess())
        using (ProcessModule currentProcessModule = currentProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD, keyboardProc, GetModuleHandle(currentProcessModule.ModuleName), 0);
        }
    }

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);

            if (KeyPressed != null)
                KeyPressed(null, new KeyPressedEventArgs((Keys)vkCode));
        }
        return CallNextHookEx(hookID, nCode, wParam, lParam);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, KeyboardProcess lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

}

public class KeyPressedEventArgs : EventArgs
{
    public Keys KeyCode { get; set; }
    public KeyPressedEventArgs(Keys Key)
    {
        KeyCode = Key;
    }
}

通过控制台应用程序实施:

class Program
{
    static void Main(string[] args)
    {
        KeyboardHook.CreateHook();
        KeyboardHook.KeyPressed += KeyboardHook_KeyPressed;
        Application.Run();
        KeyboardHook.DisposeHook();
    }

    static void KeyboardHook_KeyPressed(object sender, KeyPressedEventArgs e)
    {
        Console.WriteLine(e.KeyCode.ToString());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从任何进程获取密钥 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 如何防止gcc优化破坏rep movsb代码? [复制]

    这个问题在这里已经有答案了 我尝试使用以下命令创建我的 memcpy 代码rep movsb操作说明 当禁用优化时 它可以完美地适应任何尺寸 但是 当我启用优化时 它无法按预期工作 问题 如何防止gcc优化破坏rep movsb代码 我的代
  • 使用 Ruby 驱动程序的 MongoDB Group

    我正在尝试带回一个包含用于描述博客文章的计数的年 月组合列表 我们的想法是 它们将像这样显示 2010 年 1 月 1 篇文章 2009 年 12 月 2 个职位 我已经设法使用 MongoDB JS shell 让它工作 并且它以有用的格
  • PHP-PDO从数据库获取元数据

    我想从带有 朋友 表的数据库中获取元数据 id name 1 Herbert 2 LG 3 Levins 这是我试图获取数据的代码
  • 如何正确手动重新创建 sklearn (python) 逻辑回归 Predict_proba 结果以进行多重分类

    如果我运行 4 个类的基本逻辑回归 我可以获得 Predict proba 数组 如何使用系数和截距手动计算概率 获得与 Predict proba 生成的相同答案的确切步骤是什么 网上似乎有很多关于此的问题和一些建议 这些建议要么不完整
  • Android 中不显示选项菜单

    我有这个代码来创建菜单 Override public boolean onCreateOptionsMenu Menu menu super onCreateOptionsMenu menu MenuInflater inflater g
  • 风格化文本以针对不同语言使用不同字体?

    有没有一种方法可以对 HTML 页面上的文本进行样式化 以便它针对不同的语言自动使用不同的字体 我的网站使用英语和阿拉伯语 我想根据显示的语言使用不同的字体 假设我有这样的一段 上一句是阿拉伯语 但这一句是英语 我希望阿拉伯语句子用 X 字
  • 当 SimpleXML 解析带有特殊字符的 XML 时会发生什么?

    我正在尝试用我的最终输出来解决这个问题 XML 提要看起来像这样
  • UIView动画

    我正在尝试制作动画UIView这里 它看起来像一个矩形 我只想将其转换为我的坐标 那么 我怎样才能让它动起来呢 我试图找到一些教程 但没有成功 在iOS 4中 UIView块动画方法是最简单的 UIView animateWithDurat
  • 什么是 JSTL 强制 Jars

    我是新人 刚刚开始学习Java 来自jstltag 我对jstl了解很多 我使用IDE eclipse mars 通过添加一个简单的jsp页面来创建一个动态Web项目 然后将war导出到tomcat 7的webapps文件夹中 我对jstl
  • Leaflet - 如何查找现有标记并删除标记?

    我已经开始使用传单作为开源地图 http leaflet cloudmade com 以下 jQuery 代码将允许在单击地图时在地图上创建标记 map on click onMapClick function onMapClick e v
  • 向表单验证添加错误不起作用?

    根据有关表单验证的语义 UI 文档 我可以手动添加错误 添加错误 错误 给定数组错误 将错误添加到表单中 我想使用此功能 因为我通过 AJAX 提交表单 进行服务器端验证 然后想要显示结果 我尝试了以下代码 my form form add
  • spring默认作用域是否是单例?

    你能解释一下为什么Spring要为如下所示的bean配置创建两个对象吗 因为默认情况下spring的默认作用域是单例的 Spring的配置在这里
  • 寻找具有 3 个 CGPoint 的角度

    在我的应用程序中 用户点击 3 次 点击的 3 个点将创建一个角度 它完美地绘制了角度 我试图计算第二次点击时的角度 但我认为我做错了 可能是数学错误 我还没有在微积分课上讨论这个问题 所以我将使用维基百科上的公式 http en wiki
  • 无法从派生类型的范围访问另一个实例的受保护成员

    In 这个答案对于这个问题 为什么我的对象无法访问公共基类中定义的另一个对象的受保护成员 可以读作 您只能从您自己的基类实例访问受保护的成员 要么我没有正确理解 要么关注 MCVE 在 coliru 上直播 证明它是错误的 struct B
  • Android 上是否有类似于 Windows Phone 7 上的全景或枢轴 UI 控件?

    有谁知道是否有一个适用于 Android 的 UI 小部件 类似于 Windows Phone 7 全景或枢轴控件 如果没有 是否有任何教程可以指导我走上实现自己的正确道路 任何帮助表示赞赏 谢谢 是的 我也对枢轴控件感兴趣 这是我找到的类
  • 避免 GRPC 服务器中的端口冲突

    我目前正在考虑 GRPC 来满足我的实时需求 我注意到在示例中我们明确要求绑定到服务器中的硬编码端口 我希望将服务器部署在像 Heroku 这样的 Stack 上 想象一下 我将端口设置为 9090 并且该端口当前正被另一个服务使用 这不会
  • R:每月汇总行数

    我制作了一个数据框 其中有一列包含日期和一列包含数值 我希望这个数据框按月进行分组 并汇总每个相应月份其他列中的所有数值 这是我的数据框示例 capture date Test1 Test2 Test3 2016 03 18 0 1 1 2
  • 如何在 Vue 2 中包含 css 文件

    我是 vue js 新手 正在尝试学习这个 我在我的系统中安装了全新版本的 vue webpack 我有一个 css js 和这个主题模板的图像 我想将其包含到 HTML 中 所以我尝试将其添加到index html但我可以在控制台中看到错
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 从任何进程获取密钥

    我在网上看到了很多解决方案 但没有一个完全符合我的要求 当我的应用程序在后台运行时 在给定进程 不是我的控制台应用程序 中按下任何键的最佳 最简单方法是什么 我不需要修改器或任何东西 如果您不太关心按下哪个进程 最简单的方法是调用获取异步键