c# - 检测外部进程的窗口是否闪烁

标签 c# windows winforms hook kernel32

如何检测我无法控制的进程何时由于其中的某些通知而闪烁。我只见过专注于您可以控制的应用程序的解决方案。就我而言,可能有多个该进程同时处于事件状态,并且只有其中一个可能会闪烁。

这是我的尝试:

using (Process process = Process.GetProcesses().FirstOrDefault(p => p.ProcessName.ToLower() == "..."))
using (ProcessModule module = process.MainModule)
{

    var a = GetModuleHandleEx(0x00000004, module.ModuleName, out var hModule);
    var hHook = SetWindowsHookEx(HookType.WH_SHELL, (code, param, lParam) =>
    {
        //test
        return IntPtr.Zero;
    }, hModule, 0);
}

其中DLL导入如下:

public enum HookType : int
{
    WH_JOURNALRECORD = 0,
    WH_JOURNALPLAYBACK = 1,
    WH_KEYBOARD = 2,
    WH_GETMESSAGE = 3,
    WH_CALLWNDPROC = 4,
    WH_CBT = 5,
    WH_SYSMSGFILTER = 6,
    WH_MOUSE = 7,
    WH_HARDWARE = 8,
    WH_DEBUG = 9,
    WH_SHELL = 10,
    WH_FOREGROUNDIDLE = 11,
    WH_CALLWNDPROCRET = 12,
    WH_KEYBOARD_LL = 13,
    WH_MOUSE_LL = 14
}

delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool GetModuleHandleEx(UInt32 dwFlags, string lpModuleName, out IntPtr phModule);

这里的问题是 GetModuleHandleEx 没有成功返回正确的句柄,可能是因为我没有该进程是外部的,并且我没有将其加载到我的进程中(这不是可能)。

我使用的是 win 10 64 位,我的目标进程也是 64 位。

最佳答案

除了 WH_KEYBOARD_LLWH_MOUSE_LL 低级 Hook 之外,不可能在 .net Framework 中实现全局 Hook 。其他类型的全局 Hook 应声明为 C 样式,.NET Framework 不支持这种方式。

作为一种解决方法,可以在 native (非托管)DLL 中实现全局 Hook ,并将回调(委托(delegate))传输到每次收到所需消息时调用的函数。 因此,即使您修复了调用 GetModuleHandleEx() 的问题,您也只会收到与当前应用程序相关的 WH_SHELL 消息。

关于c# - 检测外部进程的窗口是否闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59555068/

相关文章:

c++ - 事件窗口更改时收到通知

c# - 可能到 "spin off"几个 GUI 线程? (不在 Application.Run 处停止系统)

c# - WPF MessageBox 看起来没有样式,而 WindowsForms MessageBox 看起来不错

c# - 无限垂直滚动

c# - 页面选项卡加载速度太慢 - Umbraco 6

c# - 如何在Docker中运行.NET Core 3.1.3 x86 App

windows - 为什么 slim reader/writer 独占锁的性能优于共享锁?

c# - EF Core - EntityTypeBuilder 一对多关系?

c# - 检查对象是否已存在于集合中

windows - (UWP) 从 Assets 文件夹获取 xml 文件