Обработайте события приложения EVENT_OBJECT_CREATE & EVENT_OBJECT_DESTROY - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь перехватить event_object_create и event_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 case и inside destroy case, но когда я restart мое приложение, оно ничего не печатает в консоли.

Итак, как мне убедиться, что мое приложениеПрограмма непрерывно прослушивает create & destroy события, запущенные с Application(Spotify), и является правильным подходом, описанным выше.

Вот мой ConsoleOutput .

EDIT-1

Итак, я изменил параметр idProcess, чтобы прослушивать события из всего процесса.Но моя программа теперь печатает только inside create case, когда я запускаю свое приложение, она ничего не печатает, когда я закрываю его вручную.

1 Ответ

3 голосов
/ 19 марта 2012

Скорее всего, здесь происходит то, что при перезапуске целевого приложения (Spotify) оно получает новый идентификатор процесса, поэтому ваш код, который все еще прослушивает старый идентификатор процесса, игнорирует его.

Вы не можете изменить PID, с которого слушаете события, поэтому у вас есть два варианта:

  • все время прослушивать события из всех процессов или

  • прослушивает события из определенного процесса, а когда он умирает, прослушивает создание событий из всех процессов, проверяя, есть ли какие-либо из событий Create для верхнего уровня HWND, это из процесса, который вам небезразличен, а затем слушайте только этот. (Будьте осторожны, так как здесь есть потенциальное состояние гонки; после того, как вы получите событие уничтожения, которое сообщает вам, что старый экземпляр исчез, новый экземпляр может быть создан до того, как вы начнете прослушивать события из всех процессов, поэтому вы должны выполнить проверку всех высокоуровневых HWND после того, как вы начнете слушать, чтобы быть в безопасности.)

Если это всего лишь утилита для личного использования, самой простой вещью может быть всегда просто прослушивать события из всех процессов - но при этом слушать только те несколько типов событий, которые вас интересуют, а затем посмотреть, есть ли на самом деле какая-либо производительность проблемы. Если нет, и он работает нормально, без какого-либо видимого влияния на производительность системы, все готово!

(Для более профессионального подхода вам может потребоваться измерить количество получаемых вами лишних сообщений, которые вы игнорируете, и, наоборот, получить больше данных, чтобы определить, может ли это быть проблемой производительности или нет. случается все это часто, когда пользовательский интерфейс находится в устойчивом состоянии, так что это может быть не единственной проблемой - но вы можете получить их шквал, когда приложение открыто.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...