我无法在提升的 Windows 应用程序中全局挂钩键盘

Posted

技术标签:

【中文标题】我无法在提升的 Windows 应用程序中全局挂钩键盘【英文标题】:I cannot hook the keyboard globally in elevated Windows applications 【发布时间】:2020-10-17 15:24:02 【问题描述】:

我正在创建一个剪贴板监视器,它将捕获剪贴板中的更改,然后将剪贴板仅转换为纯文本。因此,这很好用,但我真的无法弄清楚为什么我的应用程序在提升的应用程序(例如管理员命令提示符或任务管理器。它只是简单地忽略了我的按键!?

我曾尝试通过这篇文章“手动”使用键盘,How to stop further processing global hotkeys in C#,但现在我正在尝试另一个名为 globalmousekeyhook、https://github.com/gmamaladze/globalmousekeyhook 的项目 我在两种解决方案中都遇到了同样的问题。

我的问题是,“我如何才能从已提升的应用程序中挂钩并让组合键 ALT+H 在我的应用程序中可见”?它似乎在其他任何地方都可以正常工作。

这段代码或多或少来自globalmousekeyhook的示例代码:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Gma.System.MouseKeyHook;

namespace WindowsFormsApp1


    public partial class Form1 : Form
    

        public Form1()
        
            InitializeComponent();

            // Define the global hotkey combination
            var altH = Combination.FromString("Alt+H");

            // 2. Define actions
            Action actionAltH = () =>  Console.WriteLine("You Pressed ALT+H"); ;

            // 3. Assign actions to key combinations
            var assignment = new Dictionary<Combination, Action>
            
                altH, actionAltH
            ;

            // 4. Install listener
            Hook.GlobalEvents().OnCombination(assignment);
        
    

我的应用程序没有提升 - 它只是在启动时正常运行。

我在这里缺少什么?谁能指出我正确的方向? :-)

【问题讨论】:

阻止这个工作是发明 UAC 提升的确切原因。 ???这是在其他类似的剪贴板管理器中工作的,具有完全相同的热键设置,所以我一定做错了什么,但我不知道是什么。 “我的应用程序没有提升”。好吧,那么您如何期望它挂钩提升的应用程序?您不能将提升的应用程序与未提升的应用程序挂钩,否则未经授权的用户可以观看管理员在同一台计算机中键入的任何内容。这是非常不安全的。 【参考方案1】:

Hans Passant 的评论是正确的!

UAC 提升是为了防止键盘记录而发明的。 因此,没有提升权限的应用程序不能挂钩到提升的应用程序是正确的。

如果您以提升的权限运行您的应用程序,它将工作。

如果您只是想挂钩一些热键,您可以注册系统范围的热键。请参阅此article at code project (VB.net)。

您可以在code project article 中找到适用于 Winform 和 WPF 的 C# 示例。也可以看看这篇 C# 文章的 cmets。

【讨论】:

好的,这可能是正确的,但是其他 sil´milar 应用程序怎么可能做到这一点呢?例如。 ClipboardFusion 是一个剪贴板管理器,它不能以提升的权限运行 - 它的热键在提升的应用程序中工作。如果你是对的,这怎么可能呢? 我已经测试了 ClipboardFusion 管理器,它不使用 KeyLogging!在剪贴板管理器的设置中,您只能定义热键。正如您正确编写的那样,Hotkeys 正在提升的应用程序中工作。但是 Hotkeys 并不意味着 KeyLogging!也许这个Link 将有助于定义您自己的热键 我也将链接添加到我的答案中。 您引用的页面没有显示 C# 代码,所以我实现了一个类似的项目,fluxbytes.com/csharp/… 但仍然具有完全相同的行为 - 它无法检测到全局热键,例如提升的命令提示符。当我按下SHIFT+a 时,它只会在命令提示符中显示A。有没有办法在提升的应用程序中检测热键,所以我查看我以前的剪贴板条目(这是我需要热键的)? @Beauvis 你是对的。该示例位于 VB.net 中。我在答案中添加了一个 C# 示例。或许你可以在this project找到一些提示。

以上是关于我无法在提升的 Windows 应用程序中全局挂钩键盘的主要内容,如果未能解决你的问题,请参考以下文章

全局挂钩在 Visual C++ 中不起作用

什么会导致 Windows 取消挂钩低级别(全局)键盘挂钩?

我可以使用全局系统挂钩来捕获单击了哪个文件吗?

是否可以从 .NET 的全局键盘挂钩中确定当前用户

全局键盘挂钩

MFC 全局键盘挂钩