c # - Håndter applikationens EVENT\_OBJECT\_CREATE & EVENT\_OBJECT\_DESTROY begivenheder

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at opfange event\_object\_create og event\_object\_destroy begivenheder gennem følgende kode:


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;
      }
    }
  }

}


Indvendig main metode


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);
}
}


Min kode ovenfor fanger begivenheden, når jeg manuelt lukker min ansøgning (Spotify) og udskriver en kombination af inside create case og inside destroy case, men når jeg restart min applikation ikke udskriver noget i konsollen.


Så, hvordan sørger jeg for, at mit program løbende lytter efter create & destroy begivenheder fyret fra Application(Spotify) og er ovennævnte tilgang korrekt tilnærmelse.


Her er min ConsoleOutput. [13]


EDIT-1


Så jeg ændrede idProcess paramater for at lytte til begivenheder fra hele processen. Men mit program udskriver nu kun inside create case, når jeg starter min applikation, udskriver det intet, når jeg manuelt lukker det.

Bedste reference


Hvad der sandsynligvis sker her er, at når du genstarter mål appen (Spotify), får den et nyt proces-id - så din kode, der stadig lytter til det gamle proces-id - ignorerer det.


Du kan ikke ændre PID du lytter til begivenheder fra, så du har stort set to valg:



  • lyt til begivenheder fra alle processer, hele tiden eller

  • lyt til begivenheder fra en bestemt proces, og når den dør, lyt til at skabe begivenheder fra alle processer, kontroller for at se om nogen, hvis nogen af ​​de Opret begivenheder er til en top-level HWND, der s af den proces du er interesseret i - og så lyt til den ene. (Pas på, da der er en potentiel løbstilstand her, efter at du har fået ødelagt begivenheden, der fortæller dig, at den gamle forekomst er forsvundet, kunne en ny instans få oprettet, før du begynder at lytte til begivenheder fra alle processer, så du skal gøre en fejning af alle top-level HWNDs, når du begynder at lytte til at være på den sikre side.)



Hvis dette kun er et værktøj til personlig brug, kan det simpeltste altid være at lytte til begivenheder fra alle processer - men lyt kun på de få typer begivenheder, du er interesseret i, og se om der faktisk er nogen præstationsproblemer . Hvis ikke, og det går fint uden nogen tilsyneladende indvirkning på systemets ydeevne, er du færdig!


(For en mere professionel tilgang kan du måske måle, hvor mange overskudsmeddelelser du får, at du ignorerer og otehrwise få flere data for at afgøre, om det potentielt kunne være et præstationsproblem eller ej. Opret begivenheder, der sker ikke alt det ofte, når brugergrænsefladen er i steady state, så det kan ikke være alt, hvad der er et problem - men du kan få en flurry af dem, når en app åbnes.)