【问题标题】:Bypass keyboard,mouse input and let SendInput pass绕过键盘、鼠标输入,让 SendInput 通过
【发布时间】:2010-12-21 02:09:57
【问题描述】:

我正在为程序制作用户可定义的键宏。 (这些宏仅限于该程序。)

我正在使用 TApplicationEvents 来记录关键消息。然后使用 SendInput 播放它们。但我需要禁用鼠标和键盘,以免中断播放。

我无法使用 JournalPlaybackProc 和 JournalRecordProc,因为它们受 UAC、Vista 和 Win7 中的 UIPI 约束。

是否有一种简单的方法可以在仍然使用 SendInput 的同时阻止鼠标和键盘输入。 (一种不需要提升权限的方式。)

我还需要一个停止播放的转义键。

编辑: TControl.Perform 不起作用,因为它忽略了热键。

我曾想过在 WM_KEY 消息中使用保留的半字节(第 25-28 位),但在 windows 文档中它说它是保留的并且不使用。会有什么后果。

【问题讨论】:

    标签: delphi winapi windows-7 windows-vista delphi-7


    【解决方案1】:

    如果您希望“人工输入”仅限于您自己的应用程序,我不会使用 SendInput。如果您使用 TApplicationEvents.OnMessage 来记录消息,我会在播放宏时添加一个“if not(PlayingBack) then”检查 OnMessage 并使用 Form1.Perform

    【讨论】:

    • 这是个好主意。但这有一个问题——它不跨越多种形式。前任。如果一个按钮打开一个新表单,然后它在该新表单中执行某些操作。我在想,也许有可能以某种方式获取活动表单,然后将输入重定向到那里。
    • 我想我找到了我需要的其他东西Screen.ActiveForm...(明天我会测试...)
    • 热键下你明白什么?
    • 关于Screen.ActiveForm,你还应该看看Controls单元中定义的FindControl函数,你应该可以从OnMessage事件处理程序中使用它。
    • 我指的是由 Windows 处理的任何热键(例如菜单快捷方式)。因为它不会将这些放到 Windows 消息队列中,所以它不会处理这些。
    【解决方案2】:

    我一直使用 AutoIT 的 DLL 来发送按键以及阻止键盘和鼠标。

    有一件事就是 AutoIT 不能阻止 Ctrl+Alt+Del 键。

    Do check it out.

    HTH

    【讨论】:

    • 这是一个非常有趣的链接。谢谢!
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2011-12-09
    相关资源
    最近更新 更多