阻止键盘输入到外部应用程序

时间:2018-05-31 13:56:52

标签: c# keyboard bots

我正在创建一个bot程序,它打开一个外部应用程序并执行一系列键盘命令。不幸的是,用户可以在僵硬时按下键盘按钮并使其不按顺序。有没有办法只为该应用程序禁用键盘?我发现的唯一的东西是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);
    }

1 个答案:

答案 0 :(得分:0)

如果适合你,我会找到一个关于该主题测试的好主题: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);
}