【问题标题】:Getting Metro App's thread ID for a keyboardHook为键盘钩子获取 Metro App 的线程 ID
【发布时间】:2016-02-16 16:23:25
【问题描述】:

我正在尝试通过经典控制台应用程序在 Metro 应用程序上设置低级键盘挂钩。 我的问题是 Metro 应用程序无法与全局挂钩挂钩。 所以我试图将钩子附加到特定线程但我没有找到它。

现在这就是我所拥有的:

    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 替换的全局挂钩。 当我尝试通过以下方式获取线程 ID 时:

    ProcessThreadCollection threadList = processList[0].Threads;
    Debug.WriteLine("Threads = " + threadList.Count);
    foreach (ProcessThread thread in threadList)
        Debug.WriteLine("Thread = " + thread.Id);

(当然)列表中有 40 个线程。

我的问题是:我可以使用哪个线程作为 SetWindowsHookEx 最后一个参数来挂钩来自 Windows 应用商店应用程序的键盘输入。

谢谢!

【问题讨论】:

    标签: c# wpf windows-store-apps keyboard-hook setwindowshookex


    【解决方案1】:

    使用WH_KEYBOARD_LL 代替WH_KEYBOARDLowLevelKeyboardProc,您可以为包括另一个商店应用程序在内的所有进程挂接键盘。

    【讨论】:

    • 感谢您的回答,但不,当我将其设置为 WH_KEYBOARD_LL 时,挂钩不会捕获 Metro 应用程序的输入。它记录在 MSDN 中:“Windows 应用商店应用程序开发如果 dwThreadId 为零,则不会在 Windows 应用商店应用程序进程和 Windows 运行时代理进程的进程中加载​​窗口挂钩 DLL,除非它们由 UIAccess 进程(可访问性工具)安装. 通知在安装程序的线程中传递给这些钩子:"
    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多