当前位置: 首页 > 面试题库 >

无需重点即可捕获击键

闻人花蜂
2023-03-14
问题内容

例如,使用winamp(至少在Windows上),您可以在后台以winamp播放全屏游戏,并使用媒体按钮*控制声音。Winamp不需要聚焦,可以使游戏继续全屏显示。

我更喜欢用Java编写此代码,但这可能行不通(在Java afaik中很难捕获没有重点的击键),因此任何C#解决方案也都可以。

因此,基本问题是:如何在没有重点的情况下捕获击键?

*)我相信“后退/前进/停止/邮件/搜索/收藏夹/网站/主页”按钮称为媒体按钮,但欢迎使用更好的名称:)。


问题答案:

低级Windows挂钩是一种实现方法。这是一篇文章,这里是来自MSDN的更多信息。

这是该代码的局部视图:

    private IntPtr LowLevelKeyboardHook(int nCode, WindowsMessages wParam, [In] KBDLLHOOKSTRUCT lParam)
    {
        bool callNext = true;

        bool isKeyDown = (wParam == WindowsMessages.KEYDOWN || wParam == WindowsMessages.SYSKEYDOWN);
        bool isKeyUp = (wParam == WindowsMessages.KEYUP || wParam == WindowsMessages.SYSKEYUP);

        if ((nCode >= 0) && (isKeyDown || isKeyUp))
        {
            // the virtual key codes and the winforms Keys have the same enumeration
            // so we can freely cast back and forth between them
            Keys key = (Keys)lParam.vkCode;

            // Do your other processing here...
        }

        // if any handler returned false, trap the message
        return (callNext) ? User32.CallNextHookEx(_mainHook, nCode, wParam, lParam) : _nullNext;
    }


    /// <summary>
    /// Registers the user's LowLevelKeyboardProc with the system in order to
    /// intercept any keyboard events before processed in the regular fashion.
    /// This can be used to log all keyboard events or ignore them.
    /// </summary>
    /// <param name="hook">Callback function to call whenever a keyboard event occurs.</param>
    /// <returns>The IntPtr assigned by the Windows's sytem that defines the callback.</returns>
    private IntPtr RegisterLowLevelHook(LowLevelKeyboardProc hook)
    {
        IntPtr handle = IntPtr.Zero;

        using (Process currentProcess = Process.GetCurrentProcess())
        using (ProcessModule currentModule = currentProcess.MainModule)
        {
            IntPtr module = Kernel32.GetModuleHandle(currentModule.ModuleName);
            handle = User32.SetWindowsHookEx(HookType.KEYBOARD_LL, hook, module, 0);
        }

        return handle;
    }

    /// <summary>
    /// Unregisters a previously registered callback from the low-level chain.
    /// </summary>
    /// <param name="hook">IntPtr previously assigned to the low-level chain.
    /// Users should have stored the value given by 
    /// <see cref="Drs.Interop.Win32.LowLevelKeyboard.RegisterLowLevelHook"/>,
    /// and use that value as the parameter into this function.</param>
    /// <returns>True if the hook was removed, false otherwise.</returns>
    private bool UnregisterLowLevelHook(IntPtr hook)
    {
        return User32.UnhookWindowsHookEx(hook);
    }

只需实现所需的所有P / Invoke声明,它就可以工作。我在应用程序中使用了这种方法,并且效果很好。



 类似资料:
  • 问题内容: Python中是否有某种方法可以捕获事件而不将所有代码放入-语句中? 如果用户按下 +,我想干净地退出而没有任何痕迹 。 问题答案: 是的,您可以使用模块signal安装中断处理程序,并使用threading.Event永远等待:

  • 问题内容: 我想在应用程序中连接到wifi网络。 码: 但是问题是我不知道。如何获取WiFi网络的SSID ? 问题答案: 如果您想获得所有可用的wifi: 如果要连接wifi ssid: 如果您想添加新的wifi设置,我已在下面编写了演示应用程序:

  • 问题内容: 如何捕获iframe周围的div上的click或mousedown事件。我尝试将函数附加到div上的click事件,但是由于iframe从未将事件泡到周围的div上,因此永远不会调用该函数。有没有一种方法可以捕获div上的事件,然后将其传播到iframe进行默认操作? 问题答案: 如果点击在iframe区域中,则iframe上下文会处理click事件,它不会冒泡到iframe父级。因此

  • 我正在我的 SPA 应用程序中实现 Auth0,其中一个要求是拥有一个自定义 UI,这也意味着我无法使用重定向到 Auth0 的通用登录页面。 在阅读了Auth0网站后,我发现了资源所有者授权类型,这似乎解决了我直接使用Auth0 API处理登录的问题。 使用这种授予类型有什么缺点吗??(我读到这不是很推荐,但我想听听关于这一点的意见) 此外,这种资助类型还有其他选择吗??我是说,如果Biz不想要

  • 问题内容: 我有一个用Java编写的控制台程序,该程序可以响应单键按下,但是用户不按Enter。 我正在打乒乓球,所以需要上下键来移动蝙蝠的东西。 欢迎使用其他方法!(除了制作GUI外) -编辑: 我将只在UNIX系统(OSX和Linux)上运行程序,因此我可以通过以下方式将终端置于“原始”模式: 当我在运行程序之前在控制台中键入该命令时,它将起作用!但是我需要Java自动执行此操作,因此我尝试了

  • 问题内容: 我正在尝试用我的程序解决一个奇怪的问题。该程序创建了一系列GUI和JTable,使用户能够生成XML文件。这些表之一是用于创建“语句”的。除了要说的是数据存储在多个2D数组中,这些2D数组又存储在哈希映射中之外,我将不做详细介绍。 这是发生了什么。当用户进入Statement屏幕时,将使用2D数组中的内容生成JTable。此数据填充用户能够修改的单元格。这些单元格之一(也是最重要的)是