OpenEvent von anderem Prozess



  • Hallo!

    Ich möchte prüfen, ob der Chrome Browser aktiv ist. Hierfür öffne ich einfach ein Event. Existiert das Event, gehe ich davon aus, dass Chrome aktiv ist. Im ProzessExplorer konnte ich zwei Named Events finden:

    \KernelObjects\MaximumCommitCondition
    \BaseNamedObjects\c:!program file(x86)!google!chrome!application!chrome.exe

    Aber leider bekomme ich kein Handle zurück. Was ist an folgendem Code falsch?

    bool IsChromeActive() {
      std::wstring event_name(L"c:!program file(x86)!google!chrome!application!chrome.exe");
      return OpenEventW(SYNCHRONIZE, FALSE, event_name.c_str() != NULL;
    }
    

    Schon mal Danke im Voraus.
    T.



  • Hi

    Da würde ich aber CreateToolhelp32Snapshot() benutzen und mit Process32First() und Process32Next() nachsehen, ob eine chrome.exe läuft (Keine Sorge - die APIs laufen auch auf 64-bit 😉 ).
    Falls du ausreichend Rechte hast, können dir OpenProcess() und QueryFullProcessImageName() auch den vollständigen Pfad sagen.
    Events und andere Objekte von Fremdprozessen zu öffnen kann den Betrieb der Software stören und sollte vermieden werden, es sei denn deren Schnittstellen-Doku verlangt es so.

    Der Erzeuger eines Kernel-Objektes kann außerdem festlegen, wer darauf zugreifen darf. Es ist daher nicht sicher, dass du das Event mit SYNCHRONIZE überhaupt öffnen darfst.

    Hast du aber die nötigen Rechte, so erzeugst du mit "return OpenEventW(SYNCHRONIZE, FALSE, event_name.c_str()) != NULL;" einen Resource Leak.
    Wenn du Objekte öffnest, müsste es zumindest so aussehen

    HANDLE h = OpenEvent(...);
    if(h != NULL)
    {
        CloseHandle(h);
        return true;
    } 
    else
    {
        return false;
    }
    

    cu


Anmelden zum Antworten