【问题标题】:SetWindowsHookEx ignoring hooks from MS WordSetWindowsHookEx 忽略来自 MS Word 的钩子
【发布时间】:2014-07-30 22:23:06
【问题描述】:

当用户在我的加载项中输入 Word 时,我试图捕捉事件并且我有以下代码

delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
const int WH_KEYBOARD_LL = 13;
const int WM_KEYDOWN = 256;
static IntPtr hook;
static void Main()
{
    HookProc hp = new HookProc(HookCallback);
    hook = SetWindowsHookEx( WH_KEYBOARD_LL, hp, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0 );
    //UnhookWindowsHookEx( hook );
    //GC.KeepAlive( hp );
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        int pointerCode = Marshal.ReadInt32(lParam);
        string pressedKey = ((Keys)pointerCode).ToString();
        var thread = new Thread(() => { MessageBox.Show(pressedKey); });
        thread.Start();
    }
    return CallNextHookEx(hook, nCode, wParam, lParam);
}

通常,当我键入任何应用程序时,它都会起作用,除了运行加载项的 MS Word 实例。任何想法为什么 Word 被忽略?

谢谢

【问题讨论】:

    标签: setwindowshookex


    【解决方案1】:

    我有一个类似的问题,但唯一的解决方案(也是一个糟糕的解决方案)似乎是:

    • 创建一个单独的进程
    • 使用共享内存或其他一些简单的通信方法来通知 Word 中运行的 DLL/VSTO。

    (其他大卫)- 如果您有更好的解决方案,您能否对此做出回应,就像我在上面概述的那样,虽然它会起作用 - 非常糟糕。我希望有一个更好的解释来解释为什么 Word 会阻止源自应用程序的按键。

    【讨论】:

    • 嗨,这对我有用。我在 Word 的 COM 插件中看不到按键,但如果我将钩子移动到完全不同的进程,我会看到 Word 按键。谢谢!
    • 嗨,我还没有找到任何其他解决方案,我仍然不知道为什么 word 会阻止它自己的钩子。然而,当时,我决定选择不同的方法,因此我放弃了从插件监控按键的想法。
    • 另一条评论。我曾经在 Word 中使用计时器来检查光标的位置(如果它改变了,那么用户正在输入)。类似于:_doc.ActiveWindow.Selection.Range.End/Start(注意,您不能直接这样做,因为您需要获取每个句柄并在之后立即处理它们)。无论如何,这种方法的一个问题是,如果您每 1-2 秒检查一次以上,Word 将返回相同的位置。即使位置变了!不可靠。
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多