Блокировка ввода с клавиатуры на внешнее приложение - PullRequest
0 голосов
/ 31 мая 2018

Я создаю программу-бот, которая открывает внешнее приложение и выполняет ряд клавиатурных команд.К сожалению, пользователь может нажать кнопку на клавиатуре во время загрузки и вывести ее из последовательности.Есть ли способ отключить клавиатуру только для этого приложения?Единственное, что я нашел, это 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);
    }

РЕДАКТИРОВАТЬ: Таким образом, я нашел решение, которое работало лучше, чем я просил.Я не отвечаю на свой собственный вопрос, потому что я не блокировал просто внешнее приложение;Мне удалось заблокировать все команды мыши и клавиатуры на компьютере.

То, что я сделал, щелкнуло правой кнопкой мыши на Пространстве имен в Solution в Solution Explorer и выбрало Add> New Item.Добавьте файл манифеста приложения.Нажмите на недавно созданный файл app.manifest.Прочитайте зеленый, который говорит, чтобы заменить требуемыйExecutionLevel и заменить текущий на «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 голосов
/ 31 мая 2018

Я нашел хорошую тему для этого предметного теста, если он вам подходит: Как перехватить все события клавиатуры и предотвратить потерю фокуса в приложении WinForms? (проверить возврат -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);
}
...