Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 当Unity不使用时,在Unity中捕获按键';没有输入焦点_Unity3d_Focus_Keypress - Fatal编程技术网

Unity3d 当Unity不使用时,在Unity中捕获按键';没有输入焦点

Unity3d 当Unity不使用时,在Unity中捕获按键';没有输入焦点,unity3d,focus,keypress,Unity3d,Focus,Keypress,我需要Unity来捕捉所有按键,即使Unity没有焦点 我尝试使用: Input.KeyPress() 但这似乎只有在Unity关注用户输入的情况下才有效。当它没有焦点时,我需要它工作,例如当我正在查看/使用另一个Windows程序时 PS:我已经打开了“玩家首选项”中的“后台运行”选项。这是完全可能的!尽管如此,仅使用内置于Unity3D中的工具是无法做到这一点的。您必须使用本机库来实现这一点 下面的示例使用钩子类型的WH_键盘钩子钩子钩子链,该钩子类型对应于消息级键盘钩子。您可以阅读有关S

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

我尝试使用:

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


PS:我已经打开了“玩家首选项”中的“后台运行”选项。

这是完全可能的!尽管如此,仅使用内置于Unity3D中的工具是无法做到这一点的。您必须使用本机库来实现这一点

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

您可以检查挂接此类消息类型时接收到的参数(
WH\u-KEYBOARD
)[此处][2]

使用UnityEngine;
使用制度;
使用系统集合;
使用System.Runtime.InteropServices;
公共类:单一行为
{
[DllImport(“user32”)]
受保护的静态外部IntPtr SetWindowsHookEx(
HookType代码、HookProc func、IntPtr hInstance、int threadID);
[DllImport(“user32”)]
受保护的静态外部int unhookwindowshookx(
IntPtr(hhook);
[DllImport(“user32”)]
受保护的静态外部int CallNextHookEx(
IntPtr hhook、int code、IntPtr wParam、IntPtr lParam);
//钩子类型。要钩子键盘,我们只需要WHU键盘
受保护的枚举类型:int
{
WH_JOURNALRECORD=0,
WH_JOURNALPLAYBACK=1,
WH_键盘=2,
WH_GETMESSAGE=3,
WH_CALLWNDPROC=4,
WH_CBT=5,
WH_SYSMSGFILTER=6,
WH_鼠标=7,
WH_硬件=8,
WH_DEBUG=9,
WH_外壳=10,
WH_FOREGROUNDIDLE=11,
WH_CALLWNDPROCRET=12,
WH_KEYBOARD_LL=13,
WH_鼠标\u LL=14
}
受保护的IntPtr m_hhook=IntPtr.Zero;
受保护的HookType m_HookType=HookType.WH_键盘;
受保护的委托int HookProc(int代码、IntPtr wParam、IntPtr lParam);
//我们装上钩子,抓住钩子把手。
//把手需要解开。
受保护的bool安装(HookProc cbFunc)
{
如果(m_hhook==IntPtr.Zero)
m_hhook=setWindowshookx(
m_hookType,
cbFunc,
IntPtr.Zero,
(int)AppDomain.GetCurrentThreadId());
如果(m_hhook==IntPtr.Zero)
返回false;
返回true;
}
受保护的无效卸载()
{
如果(m_hhook!=IntPtr.Zero)
{
unhookwindowshookx(m_hhook);
m_hhook=IntPtr.Zero;
}
}
受保护的int-CoreHookProc(int代码、IntPtr-wParam、IntPtr-lParam)
{
如果(代码<0)
返回CallNextHookEx(m_hhook,code,wParam,lParam);
调试日志(
“hook code=“+code.ToString()+
“lparam=“+lparam.ToString()”
“wparam=“+wparam.ToString());
//屈服于链条上的下一个钩子
返回CallNextHookEx(m_hhook,code,wParam,lParam);
}
//用于初始化
void Start()
{
Log(“安装钩子”);
安装(CoreHookProc);
}
无效可禁用()
{
Log(“卸载挂钩”);
卸载();
}
}
这个例子来自[这个博客][3]

这种挂钩方式只能在Windows系统上使用。如果您需要在OSX或Linux上创建一个单独的钩子,那么您需要在该操作系统中以本机方式进行

我不能发布超过1个链接,因为我在这方面缺乏声誉。我希望其中一个mods会相应地编辑我的帖子

 [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

我已经根据@boris makogonyuk的答案组装了一个Unity包,并对可用性进行了一些改进。 该软件包可在GitHub上获得(MIT许可证):

您可以按如下方式使用它:

包含包名称空间

使用UnityRawInput;
初始化输入服务以开始处理本机输入消息

RawKeyInput.Start();
可选地,您可以指定在应用程序未处于焦点时是否应处理输入消息(默认情况下禁用)

var workInBackground=true;
RawKeyInput.Start(工作背景);
为输入事件添加侦听器

RawKeyInput.OnKeyUp+=HandleKeyUp;
RawKeyInput.OnKeyDown+=HandleKeyDown;
私有无效HandleKeyUp(RawKey){…}
私有无效HandleKeyDown(RawKey){…}
您还可以检查当前是否按下了特定键

if(rawkeyinport.IsKeyDown(key)){…}
您可以随时停止服务

RawKeyInput.Stop();
当您不再需要侦听器时,不要忘记删除它们

private void OnDisable()
{
RawKeyInput.OnKeyUp-=HandleKeyUp;
RawKeyInput.OnKeyDown-=HandleKeyDown;
}