gpt4 book ai didi

unity-game-engine - 当 Unity 没有输入焦点时捕获 Unity 中的按键

转载 作者:行者123 更新时间:2023-12-02 16:02:55 27 4
gpt4 key购买 nike

我需要 Unity 来捕获所有按键,即使 Unity 没有焦点。

我尝试过使用:

Input.KeyPress()

但这似乎只有在 Unity 拥有用户输入焦点的情况下才有效。我需要它在没有焦点时工作,例如当我正在查看/使用另一个 Windows 程序时。

PS:我已经在播放器首选项中打开了“后台运行”选项。

最佳答案

这完全有可能!尽管如此,仅使用 Unity3D 内置的工具是无法做到这一点的。您必须使用 native 库才能做到这一点。

下面的示例使用钩子(Hook)类型 WH_KEYBOARD 来钩子(Hook)链,该钩子(Hook)对应于消息级键盘钩子(Hook)。您可以在 [此处][1] 阅读有关 SetWindowsHookEx 和不同类型的更多信息。

您可以检查在 Hook 此类消息类型 (WH_KEYBOARD) 时收到的参数[此处][2]

using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;

public class KBHooks : MonoBehaviour
{
[DllImport("user32")]
protected static extern IntPtr SetWindowsHookEx(
HookType code, HookProc func, IntPtr hInstance, int threadID);

[DllImport("user32")]
protected static extern int UnhookWindowsHookEx(
IntPtr hhook);

[DllImport("user32")]
protected static extern int CallNextHookEx(
IntPtr hhook, int code, IntPtr wParam, IntPtr lParam);

// Hook types. To hook the keyboard we only need WH_KEYBOARD
protected enum HookType : int
{
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
}

protected IntPtr m_hhook = IntPtr.Zero;
protected HookType m_hookType = HookType.WH_KEYBOARD;

protected delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);

//We install the hook and hold on to the hook handle.
//The handle will be need to unhook.
protected bool Install(HookProc cbFunc)
{
if (m_hhook == IntPtr.Zero)
m_hhook = SetWindowsHookEx(
m_hookType,
cbFunc,
IntPtr.Zero,
(int)AppDomain.GetCurrentThreadId());

if (m_hhook == IntPtr.Zero)
return false;

return true;
}

protected void Uninstall()
{
if (m_hhook != IntPtr.Zero)
{
UnhookWindowsHookEx(m_hhook);
m_hhook = IntPtr.Zero;
}
}

protected int CoreHookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code < 0)
return CallNextHookEx(m_hhook, code, wParam, lParam);

Debug.Log(
"hook code =" + code.ToString() +
" lparam=" + lParam.ToString() +
" wparam=" + wParam.ToString());

// Yield to the next hook in the chain
return CallNextHookEx(m_hhook, code, wParam, lParam);
}

// Use this for initialization
void Start()
{
Debug.Log("install hook");
Install(CoreHookProc);
}

void OnDisable()
{
Debug.Log("Uninstall hook");
Uninstall();
}

}

此示例来自[此博客][3]。

这种 Hook 方式适用于 Windows 系统。如果您需要在 OS X 或 Linux 上创建单独的钩子(Hook),则需要在该操作系统中以 native 方式执行此操作。

我不能发布超过 1 个链接,因为我在 SO 上缺乏声誉。我希望其中一位管理员能够相应地编辑我的帖子。

 [1]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
[2]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644984(v=vs.85).aspx
[3]: http://phardera.blogspot.com.es/2010/12/windows-hooks-in-unity3d.html

关于unity-game-engine - 当 Unity 没有输入焦点时捕获 Unity 中的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36339561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com