挂钩前景窗口

Posted

技术标签:

【中文标题】挂钩前景窗口【英文标题】:Hook foreground window 【发布时间】:2011-12-03 13:46:21 【问题描述】:

如何钩住前台窗口?

目前我正在尝试

using (Process processTmp = Process.GetCurrentProcess())

  using (ProcessModule module = processTmp.MainModule)
  
    IntPtr hModule = Win32.GetModuleHandle(module.ModuleName);
    uint threadid = Win32.GetWindowThreadProcessId(Win32.GetForegroundWindow(), IntPtr.Zero);

    //WH_CALLWNDPROC = 4
    m_HookId = Win32.SetWindowsHookEx(4, m_HookProcedure, hModule, threadid); 
    if (m_HookId == IntPtr.Zero)
    
      int tmp =
        Marshal.GetLastWin32Error();
    
  

但 m_HookID 始终为 IntPtr.Zero 并出现错误 1428 - 无法在没有模块句柄的情况下设置非本地挂钩 (ERROR_HOOK_NEEDS_HMOD)。 所以看来hModule有问题。

有什么建议吗? Tnx。

【问题讨论】:

你的第一个问题是你试图用托管代码注入一个钩子。这会将 CLR 注入到每个进程中,这可能会产生问题,因为一个进程不能承载两个冲突的 CLR 版本。如果您要挂钩的任何进程也使用托管代码,则可能存在冲突。 【参考方案1】:

您不能将托管程序集注入到进程中。需要使用 C、C++ 或 Delphi 等语言编写的本机 DLL。 This project 作为您需要的 DLL 的来源可能很有用。

【讨论】:

以上是关于挂钩前景窗口的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 8 上设置前景窗口

mspa怎样将热到区作为前景

windows判断窗口是否置顶设置取消置顶设置前景

Focusky教程 | 前景设置功

setForegroundWindow 的使用方法有哪些?

WPF:ContentPresenter 根据样式的位置意外更改前景