C# 最小化的程序如何侦听,但仍然允许键盘事件?

C# 最小化的程序如何侦听,但仍然允许键盘事件?,c#,winforms,keyboard-events,keyboard-hook,winforms-interop,C#,Winforms,Keyboard Events,Keyboard Hook,Winforms Interop,我们的目标是使应用程序最小化,可以响应键盘按下。 键盘按键仍然能够影响其他焦点应用程序 我发现在最小化的应用程序中检测键盘按下的唯一方法, 是使用低级键盘挂钩: using System; using System.Diagnostics; using System.Windows.Forms; using System.Runtime.InteropServices; class InterceptKeys { private const int WH_KEYBOARD_LL = 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 CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

    [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);
}
这是可行的,但它可以防止按键对其他焦点窗口产生任何影响。我希望Minizied应用程序能够监听这些键盘按键,但不要让hook成为唯一知道按键的程序

如何在允许其他应用程序查看这些键盘事件的同时侦听键盘事件


我想可能有允许
LowLevelKeyboardProc
执行此操作的设置,但我没有找到任何设置

那么你想写一个键盘记录器?我可以从代码中看出,你在学习本教程时正在写一个键盘记录器,你是否尝试过比较windows xp/7/8/10的不同安全模式,因为我认为这就是你会发现问题的地方,由于那篇文章已经有4年了,所以这套代码在数百个示例中随处可见。我只想制作一个热键,它可以使应用程序不处于焦点/最小化状态。说得好。可能是与安全相关的。我认为是这样,因为8/10改变了每个应用程序的很多安全范围等。如果你能发布你正在使用的win版本,可能会更有帮助