Я пытаюсь установить крючок с низким уровнем клавиатуры в приложении Metro из классического консольного приложения. Моя проблема заключается в том, что приложения для метро не могут быть связаны с глобальными перехватами. Так что я пытаюсь прикрепить крючок к конкретному потоку, но я его не нахожу.Получение идентификатора потока Metro App для клавиатурыHook
Пока это то, что у меня есть:
private IntPtr SetHook(LowLevelKeyboardProc proc, ProcessModule tabModule)
{
Debug.WriteLine("INFO HOOK : Setting hook " + tabModule.ModuleName.ToString());
var result = SetWindowsHookEx(WH_KEYBOARD, proc, GetModuleHandle(tabModule.ModuleName), 0);
Debug.WriteLine("INFO BACK : Hook handle = " + result);
return result;
}
Проблема заключается в том, что в функции SetWindowsHookEx, то 0 означает глобальный хук, который я должен заменить нити ID. Когда я пытаюсь получить идентификатор потока thtough это:
ProcessThreadCollection threadList = processList[0].Threads;
Debug.WriteLine("Threads = " + threadList.Count);
foreach (ProcessThread thread in threadList)
Debug.WriteLine("Thread = " + thread.Id);
Я получаю отсчет 40 нитей с (конечно) списка.
Мой вопрос: какой поток я могу использовать в качестве последнего параметра SetWindowsHookEx для подключения ввода клавиатуры из приложения Windows Store.
Спасибо!
Спасибо за ответ, но нет, когда я установил его в WH_KEYBOARD_LL, крючок не поймает входы приложений метро. Документировано в MSDN: «Разработка приложений для Windows Store Если dwThreadId равен нулю, то DLL-файлы с окнами не загружаются в процессе процессов приложений Windows Store и процесс посредника Windows Runtime, если они не установлены ни процессами UIAccess (доступность инструменты). Уведомление доставляется в поток установщика для этих крючков: –