2012-03-19 2 views
0

Я пытаюсь перехватить event_object_create и event_object_destroy события через следующий код:ручка приложения 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, но когда I restart мое приложение ничего не печатает в con единственный.

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

вот мой ConsoleOutput.

EDIT-1

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

ответ

3

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

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

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

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

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

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

+0

Итак, где я должен введите код, который гарантирует, что моя программа всегда прослушивает события из всех процессов. – RanRag

+0

@Noob: быстрое считывание параметров в [SetWinEventProc] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373640 (v = vs.85) .aspx) скажет вам ответ на этот вопрос. – BrendanMcK

+0

Я изменил 'idProcess' на' 0', чтобы прослушать все процессы. Проверьте мои изменения. – RanRag

Смежные вопросы