Avatar
hanse
Člen
Avatar
hanse:

Zdravím, momentálně už delší dobu hledám event, který se spustí pokaždé, když se ve windows spustí libovolný proces (doufám, že je to takle srozumitelně napsané, moc se nevyznám v české terminologii) - mělo by se ideálně jednat o system event (kvůli trigger v suspended app ve W8).

 
Odpovědět 22.2.2014 22:42
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na hanse
Jan Vargovský:
http://www.codeproject.com/Articles/12138/Process-Information-and-Notifications-using-WMI
 
Nahoru Odpovědět 22.2.2014 22:45
Avatar
hanse
Člen
Avatar
Odpovídá na Jan Vargovský
hanse:

Díky, bohužel to neřeší můj problém, takže menší upřesnění: spustí se jakýkoliv, i předem nedefinovaný, proces (tzn. do předu neznám, který proces se spustí - vím pouze, že vzroste/se změní v určité chvíli počet procesů ve windows)

 
Nahoru Odpovědět 22.2.2014 23:40
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na hanse
Jan Vargovský:
public class ProcessChecker
    {
        public event Action<string> OnProcessChange;

        private Process[] processes;
        private Timer timer;

        public ProcessChecker(int interval)
        {
            processes = Process.GetProcesses();
            timer = new Timer
            {
                Interval = interval
            };
            timer.Tick += (o, e) =>
            {
                var allNewProcesses = Process.GetProcesses();

                var newProcesses = allNewProcesses.Select(s => s.ProcessName).Except(processes.Select(s => s.ProcessName)).ToList();

                processes = allNewProcesses;

                foreach (string p in newProcesses)
                    OnProcessChange(p);
            };
            timer.Start();
        }
    }

Užití:

ProcessChecker processChecker = new ProcessChecker(1000);
processChecker.OnProcessChange += (p) =>
{
    Debug.WriteLine(p);
};

Netestoval jsem to nějak moc, ale fungovalo to. Kdyžtak můžeš kouknout po nečem systémovém.

Editováno 23.2.2014 0:44
 
Nahoru Odpovědět 23.2.2014 0:43
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na hanse
Jan Vargovský:

Ještě jsem to troku improvnul:

public class ProcessChecker
    {
        private class ProcessComparer : IEqualityComparer<Process>
        {
            public bool Equals(Process x, Process y)
            {
                return x.ProcessName == y.ProcessName && x.Id == y.Id;
            }

            public int GetHashCode(Process obj)
            {
                return obj.ProcessName.GetHashCode() ^ obj.Id.GetHashCode();
            }
        }

        public event Action<Process> OnProcessChange;

        private Process[] processes;
        private Timer timer;

        public ProcessChecker(int interval)
        {
            processes = Process.GetProcesses();
            timer = new Timer
            {
                Interval = interval
            };
            timer.Tick += (o, e) =>
            {
                var allNewProcesses = Process.GetProcesses();

                var newProcesses = allNewProcesses.Except(processes, new ProcessComparer()).ToList();

                processes = allNewProcesses;

                foreach (var p in newProcesses)
                    OnProcessChange(p);
            };
            timer.Start();
        }
    }

Dostaneš přímo celý proces a už si s ním dělej co chceš.

ProcessChecker processChecker = new ProcessChecker(1000);
            processChecker.OnProcessChange += (p) =>
            {
                Debug.WriteLine(p.ProcessName);
            };
        }

Snad to je konečně co jsi chtěl :)

 
Nahoru Odpovědět  +1 23.2.2014 0:57
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Jan Vargovský
hanpari:

Ahoj,
pokud bys měl čas a chuť, nemohl bys to ještě jednou "improvnout" a zakomentovat to? Přiznám se, že jsem se dokonale ztratil. :)

Kdybych měl parafrázovat Kocoura z Červeného trpaslíka, tak jsem tomu rozuměl po to "Ještě jsem to trochu improvnul."

 
Nahoru Odpovědět 23.2.2014 6:22
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

Tady to máš:

public class ProcessChecker
    // třída pro kontrolu procesů
{
    private class ProcessComparer : IEqualityComparer<Process>
        // podtřída pro jejich porovnávání
    {
        public bool Equals(Process x, Process y)
            // porovnávající metoda
        {
            return x.ProcessName == y.ProcessName && x.Id == y.Id;
                // samotné porovnání (rovnají se jména i ID
        }

        public int GetHashCode(Process obj)
            // získání zahashovaného řetězce
        {
            return obj.ProcessName.GetHashCode() ^ obj.Id.GetHashCode();
                // name XOR id
        }
    }

    public event Action<Process> OnProcessChange; // událoct změny

    private Process[] processes; // pole procesů
    private Timer timer;         // použitý časovač

    public ProcessChecker(int interval)     // konstruktor
    {
        processes = Process.GetProcesses(); // získání procesů
        timer = new Timer   //vytvoření časovače s předaným intervalem
        {
            Interval = interval
        };
        timer.Tick += (o, e) => // reakce na událost Tick časovače
        {
            var allNewProcesses = Process.GetProcesses();
                // nové procesy

            var newProcesses = allNewProcesses.Except(processes, new ProcessComparer()).ToList();
                // list procesů, které jsou navíc oproti původním

            processes = allNewProcesses;
                // z nových se stanou staré pro další kontroly

            foreach (var p in newProcesses)
                OnProcessChange(p);
                // volání funkce zaregistrované pro událost pro každý nový proces
        };
        timer.Start(); // start timeru
    }
}
ProcessChecker processChecker = new ProcessChecker(1000);
    // instance s timeoutem časovače 1000
        processChecker.OnProcessChange += (p) =>   // reakce na událost
        {
            Debug.WriteLine(p.ProcessName);        // zpracování (to co chceš dělat)
        };
    }

snad to takhle stačí.

Nahoru Odpovědět  +1 23.2.2014 7:41
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na hanpari
Zdeněk Pavlátka:

Zapoměl jsem na odpověď :[ .

Nahoru Odpovědět 23.2.2014 7:42
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
hanpari:

Díky moc, teď tomu líp rozumím. Je to opravdu mnohem srozumitelnější.

 
Nahoru Odpovědět 23.2.2014 8:41
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 23.2.2014 8:41
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
hanse
Člen
Avatar
Odpovídá na Jan Vargovský
hanse:

Díky, ale obávám se, že nikoliv - možnosti událostí ve W8.1 (kde jich je naštěstí už víc, než jen ve W8) v suspended režimu jsou značně omezené, a nejen timer, ale i další workaroundy, které fungují normálně na desktopu, se naneštěstí ukazují neúčinné, případně nespolehlivé nebo absolutně nevhodné (například vyžadující neustálé připojení k internetu :` )
http://msdn.microsoft.com/…h977059.aspx

 
Nahoru Odpovědět 23.2.2014 9:37
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na hanse
Petr Nymsa:

K čemu to ve Win 8.1 potřebuješ ? Rozhraní je právě udělané tak, aby aplikace bez vědomí uživatele nedělala něco co by neměla. Nezasahovala přímo do systému apod aniž by o tom uživatel nevěděl.

Nahoru Odpovědět 23.2.2014 9:46
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
hanse
Člen
Avatar
Odpovídá na Petr Nymsa
hanse:

Pro vytvoření Windows Store app a momentálně (veřejně) blíže nespecifikovaná usnadnění pro uživatele (netvrdím, že se jedná o něco převratného, ale podobnou app sem ve storu neviděl - dost možná to stejně bude úplný propadák) :)

Editováno 23.2.2014 9:58
 
Nahoru Odpovědět 23.2.2014 9:58
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na hanse
Petr Nymsa:

Proč přesně potřebuješ právě zjišťovat procesy ? Win 8.1 Modern UI je stejně jako Windows Phone uzavřené prostředí. Na 1. stranu možná mínus ze strany vývoje z druhé strany obrovské plus pro uživatele -> aplikace nebudou dělat neplechy.

Nahoru Odpovědět  +1 23.2.2014 10:00
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
hanse
Člen
Avatar
Odpovídá na Petr Nymsa
hanse:

Jak jsem již psal, blíže to specifikovat momentálně nebudu. A chci je zjišťovat právě proto, že mám zařízení s W8.1 i Windows Phone - je dost možné, že by takovou app (skoro) nikdo jiný nevyužil, případně od části zamýšlené funkcionality upustím kvůli složitosti pro běžného uživatele (vč. té zahrnující zjišťování procesů). Každopádně čím více se touto otázkou zabývám, mě to také začlo zajímat čistě ze zvědavosti z pohledu programátora, zda je něco takového vůbec možné (což je - bohužel z pohledu běžného užití nepoužitelné/nev­hodné).

Editováno 23.2.2014 10:25
 
Nahoru Odpovědět 23.2.2014 10:24
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na hanse
Petr Nymsa:

Mě spíš jde o to že se snažíš třeba o něco a vlastně to i píšeš co je pro uživatele zbytečné. A přijmi fakt že W8.1 i WP jsou systémy ve výoji, jsou celkem uzavřené a poskytují především funkcionalitu pro uživatele ne pro nějaké hrabání a testování :)

Nahoru Odpovědět  +1 23.2.2014 10:27
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na hanse
Jan Vargovský:

Tak potom si najdi něco na úrovni OS.

 
Nahoru Odpovědět 23.2.2014 14:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.