【问题标题】:Blocking keyboard input to external application阻止外部应用程序的键盘输入
【发布时间】:2018-11-10 13:40:58
【问题描述】:

我正在创建一个机器人程序,它可以打开一个外部应用程序并执行一系列键盘命令。不幸的是,用户可以在 botting 时按下键盘按钮并使其乱序。有没有办法只为该应用程序禁用键盘?我唯一发现的是 BlockInput 不起作用:

[DllImport("user32.dll", EntryPoint = "BlockInput")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool BlockInput([MarshalAs(UnmanagedType.Bool)] bool fBlockIt);

    private void button_Click(object sender, EventArgs e)
    {
        BlockInput(true);
        //Open application and do macro
        BlockInput(false);
    }

编辑: 所以我找到了一个比我要求的更好的解决方案。我没有回答我自己的问题,因为我没有阻止外部应用程序;我能够阻止对计算机的所有鼠标和键盘命令。

我所做的是在解决方案资源管理器中右键单击解决方案下的命名空间,然后选择添加 > 新项目。添加应用程序清单文件。单击新创建的 app.manifest 文件。阅读绿色表示替换requestedExecutionLevel 并将当前的替换为“requireAdministrator”。将以下代码添加到程序中:

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool BlockInput(bool fBlockIt);

    private void button_Click(object sender, EventArgs e)
    {
        BlockInput(true);
        //Blocked code
        BlockInput(false);
    }

【问题讨论】:

    标签: c# keyboard bots


    【解决方案1】:

    如果它适合你,我会找到一个关于该主题测试的好主题:How to intercept all the keyboard events and prevent losing focus in a WinForms application?(测试回调中的返回 -1)。 链接代码:

    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    class InterceptKeys
    {
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;
    
    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }
    
    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }
    
    private delegate IntPtr LowLevelKeyboardProc(
        int nCode, IntPtr wParam, IntPtr lParam);
    
    private static IntPtr HookCallback(
        int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);
        }
        return -1;
    }
    
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
        LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
    
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    
    [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);
    }
    

    【讨论】:

    • 始终欢迎提供指向潜在解决方案的链接,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2012-02-04
    相关资源
    最近更新 更多