背景:私はHoloLensのUnityを使用して作業しようとしているキーボードスキャンコード(EnumからKeyCodes
ではない)を必要とするライブラリを持っています。ユニバーサルWindowsプラットフォームで動作するようにWH_KEYBOARD_LLを取得する方法
私がこれまでに発見したのC#からのスキャンコードを取得する唯一の方法は、SetWindowsHookEx
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
ドキュメントhttps://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
提案方法によってWH_KEYBOARD_LL
ためのフックを登録することでのPInvokeて、Windowsのフックシステムを使用することですこのように呼び出すことです。
IntPtr hHook;
using (Process process = Process.GetCurrentProcess())
using (ProcessModule module = process.MainModule)
{
IntPtr hModule = GetModuleHandle(module.ModuleName);
hHook = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, hook, hModule, 0);
}
http://www.pinvoke.net/default.aspx/user32.setwindowshookexを参照してください。
このビルドをPC上でうまく動作しますが、SetWindowsHookEx
のドキュメントでUWPのための備考が私を混乱さ:
Windowsストアアプリの開発をのdwThreadIdがゼロの場合は、ウィンドウのフック DLLがインをロードされませんWindowsストアのAppプロセス用のプロセスと、 UIAccessプロセス(アクセシビリティツール)のいずれかによってインストールされていない限り、Windowsランタイムブローカープロセス をインストールする必要があります。ときこの動作は、フックDLLとターゲット アプリケーションプロセス間のアーキテクチャの不一致があるとき 例えば、何が起こるかに似ている WH_JOURNALPLAYBACK WH_JOURNALRECORD WH_KEYBOARD WH_KEYBOARD_LL WH_MOUSE WH_MOUSE_LL:通知は これらのフックのためのインストーラのスレッドに配信されますフックDLLは32ビットで、 アプリケーションは64ビットを処理します。
UWPでdwThreadId
を指定する必要があります。それ以外の場合は動作しません。
ERROR_GLOBAL_ONLY_HOOK
1429 (0x595)
This hook procedure can only be set globally.
が有効hookID作成しますが、再び何のイベントが到着しないNULLにGetModuleHandle(NULL)
とdwThreadId
からhMod
の設定:私は(再びのPInvoke経由)GetCurrentThreadId()
を使用しない場合でも、私は、エラーコードを取得します。
は、それ以来、私は、モジュールのハンドルを取得する方法を探してみましたが、UWPに取り組んでいますどのような方法を見つけられませんでした:
Process.GetCurrentProcess
はコンパイルされません、GetType().Module.Name
を逃すMarshal.GetHINSTANCE
を逃します紛失(GetModuleHandle
)
他に何を試すことができますか?