2016-03-31 45 views
2

Unityにフォーカスがない場合でも、すべてのキー入力をキャプチャするにはUnityが必要です。Unityに入力フォーカスがないときにUnityでキー入力をキャプチャする

私が使用することを試みた:

Input.KeyPress() 

しかし、これはUnityは、ユーザの入力のフォーカスを持っている場合にのみ動作するようです。別のWindowsプログラムを見ている/作業しているときなど、フォーカスがないときには動作する必要があります。

PS:プレイヤーの設定で既に「Run in Background」オプションを有効にしています。

+0

良い質問.... – Fattie

答えて

2

これは完全に可能です! Unity3Dに組み込まれているツールだけを使用することでそれを行う方法はありませんが、これを行うには、ネイティブライブラリを使用する必要があります。

以下の例では、メッセージレベルのキーボードフックに対応するフックタイプのWH_KEYBOARDでフックチェーンをフックしています。 SetWindowsHookExとさまざまな種類の[here] [1]で詳細を読むことができます。 [ここ]

あなたはこのようなメッセージタイプ(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]。

フックする方法は、Windowsシステムでのみになります。 OS XまたはLinuxで別のフックを作成する必要がある場合は、そのオペレーティングシステムで本来の方法で実行する必要があります。

私はSOに評判が足りないので、1つ以上のリンクを投稿できません。私は改造者の1人がそれに応じて投稿を編集することを願っています。

[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 
関連する問題