本日はunity枠です。
UnityでWindows向けのデスクトップアプリを作成する際は、通常は違うアプリケーションが選択されているときなどのバックグラウンドにある状態ではアプリケーションが停止するようになっています。
バックグラウンドでも処理を実行するためにはPlayerSettingsからRun In Backgroundにチェックを入れます。

これによってアプリケーションにフォーカスが当たっていないときでも処理が実行されますが、例えばキー入力などの操作に関してはフォーカスしていない場合検知できません。
フォーカスされていない場合でもキー入力を行うためにはWindowsのAPIを使用してグローバルホックをする必要があります。DllImportを使用することでWindowsAPIを呼び出すことができます。
グローバルホックをUnityで使用するためには次のような実装を行います。
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
・・・
// Windows APIから関数をインポート
[DllImport("user32.dll")]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll")]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
// デリゲートの宣言
public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
// キーボードフックのインスタンス
private static IntPtr _hookID = IntPtr.Zero;
private static HookProc _proc;
// フックのインストール
public void InstallHook()
{
_proc = HookCallback;
_hookID = SetWindowsHookEx(13, _proc, IntPtr.Zero, 0); // WH_KEYBOARD_LL (13)はキーボードフック
}
// フックのアンインストール
public void UninstallHook()
{
UnhookWindowsHookEx(_hookID);
}
// キーボードの入力をキャッチするコールバック関数
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
// ここでキー入力を処理
Console.WriteLine("Key Pressed");
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
これによってどのような状況でもキー入力を受け取ることができますが、Windows限定の実装になります。
本日は以上です。