SetWindowsHookEx 忽略来自 MS Word 的钩子
Posted
技术标签:
【中文标题】SetWindowsHookEx 忽略来自 MS Word 的钩子【英文标题】:SetWindowsHookEx ignoring hooks from 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 被忽略?
谢谢
【问题讨论】:
【参考方案1】:我有一个类似的问题,但唯一的解决方案(也是一个糟糕的解决方案)似乎是:
创建一个单独的进程 使用共享内存或其他一些简单的通信方法来通知 Word 中运行的 DLL/VSTO。(其他大卫)- 如果您有更好的解决方案,您能否对此做出回应,就像我在上面概述的那样,虽然它会起作用 - 非常糟糕。我希望有一个更好的解释来解释为什么 Word 会阻止源自应用程序的按键。
【讨论】:
嗨,这对我有用。我在 Word 的 COM 插件中看不到按键,但如果我将钩子移动到完全不同的进程,我会看到 Word 按键。谢谢! 嗨,我还没有找到任何其他解决方案,我仍然不知道为什么 word 会阻止它自己的钩子。然而,当时,我决定选择不同的方法,因此我放弃了从插件监控按键的想法。 另一条评论。我曾经在 Word 中使用计时器来检查光标的位置(如果它改变了,那么用户正在输入)。类似于:_doc.ActiveWindow.Selection.Range.End/Start(注意,您不能直接这样做,因为您需要获取每个句柄并在之后立即处理它们)。无论如何,这种方法的一个问题是,如果您每 1-2 秒检查一次以上,Word 将返回相同的位置。即使位置变了!不可靠。以上是关于SetWindowsHookEx 忽略来自 MS Word 的钩子的主要内容,如果未能解决你的问题,请参考以下文章
SetWindowsHookEx WH_KEYBOARD_LL 问题锁屏
为啥必须将 SetWindowsHookEx 与 Windows 消息队列一起使用