处理应用程序';s EVENT_OBJECT_CREATE&;EVENT_OJECT_DESTROY事件

本文关键字:EVENT amp OJECT 事件 CREATE DESTROY OBJECT 处理 应用程序 | 更新日期: 2023-09-27 18:28:23

我正试图通过以下代码截获event_object_createevent_object_destroy事件:

class NameChangeTracker
{
private const uint EVENT_OBJECT_CREATE = 0x00008000;
private const uint EVENT_OBJECT_DESTROY = 0x00008001;
private const uint WINEVENT_OUTOFCONTEXT = 0;
//DLL imports
private static WinEventDelegate procDelegate = new WinEventDelegate(NameChangeTracker.WinEventProc);
private delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
private static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
  if(idObject==0 && idChild==0)
  {
    if(hwnd.ToInt32() == getspotify().ToInt32())
    {
      switch(eventType)
      {
        case EVENT_OBJECT_CREATE:
        Console.WriteLine("inside create case"); 
        break;
        case EVENT_OBJECT_DESTROY:
        Console.WriteLine("inside destroy case"); 
        break;
      }
    }
  }
}

内部main方法

public static void Main()
{
   NameChangeTracker tracker = new NameChangeTracker();
   IntPtr hwnd = tracker.getspotify(); // returns hwnd using "FindWindow()" method.
   int num = tracker.getprocessid(hwnd); //returns processid using "GetWindowThreadProcessId()" method.
   IntPtr hWinEventHook = SetWinEventHook(0x00008000,0x00008001,IntPtr.Zero, procDelegate, 0, 0, 0);
   Message msg = new Message();
   while(GetMessage(ref msg,hwnd,0,0))
   UnhookWinEvent(hWinEventHook);
}
}

当我手动关闭应用程序(Spotify)并打印inside create caseinside destroy case的组合时,上面的代码捕获了事件,但当我restart我的应用程序时,它在控制台中不打印任何内容。

那么,我如何确保我的程序持续侦听从Application(Spotify)触发的create & destroy事件,以及上述方法是否正确。

这是我的控制台输出。

编辑-1

因此,我更改了idProcess参数以侦听来自所有进程的事件。但我的程序现在只在我启动应用程序时打印inside create case,而在我手动关闭它时不打印任何内容。

处理应用程序';s EVENT_OBJECT_CREATE&;EVENT_OJECT_DESTROY事件

这里可能发生的情况是,当你重新启动目标应用程序(Spotify)时,它会得到一个新的进程ID,所以你的代码仍然在监听旧的进程ID。

您无法更改正在侦听事件的PID,因此您基本上有两个选择:

  • 始终侦听来自所有进程或的事件

  • 监听来自特定进程的事件,当它终止时,监听从所有进程创建事件,检查是否有任何create事件(如果有)是针对来自您关心的进程的顶级HWND的,然后只监听该事件。(请小心,因为这里存在潜在的竞争条件;在您收到告诉旧实例已经消失的destroy事件后,在您开始侦听来自所有进程的事件之前,可能会创建一个新实例,因此为了安全起见,您应该在开始侦听后扫描所有顶级HWND。)

如果这只是一个个人使用的实用程序,那么最简单的方法可能是始终只听取来自所有进程的事件,但仍然只听取您关心的少数类型的事件,然后查看是否真的存在任何性能问题。如果没有,并且它运行良好,对系统性能没有任何明显影响,那就完了!

(对于更专业的方法,你可能想测量你收到的被忽略的剩余消息的数量,然后获得更多的数据来确定这是否可能是性能问题。当UI处于稳态时,创建事件并不经常发生,所以这可能不是什么问题,但当打开应用程序时,你可以得到一系列的事件。)。)