IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Neaktivní uživatel:22.2.2014 22:42

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
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:22.2.2014 22:45
http://www.codeproject.com/Articles/12138/Process-Information-and-Notifications-using-WMI
 
Nahoru Odpovědět
22.2.2014 22:45
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:22.2.2014 23:40

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
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:23.2.2014 0:43
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ý
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:23.2.2014 0:57

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
23.2.2014 0:57
Avatar
hanpari
Člen
Avatar
Odpovídá na Jan Vargovský
hanpari:23.2.2014 6:22

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:23.2.2014 7:41

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
23.2.2014 7:41
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na hanpari
Zdeněk Pavlátka:23.2.2014 7:42

Zapoměl jsem na odpověď :[ .

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

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
Odpovídá na hanpari
Zdeněk Pavlátka:23.2.2014 8:41

Není zač.

Nahoru Odpovědět
23.2.2014 8:41
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:23.2.2014 9:37

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
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Nymsa:23.2.2014 9:46

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
Odpovídá na Petr Nymsa
Neaktivní uživatel:23.2.2014 9:58

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
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Nymsa:23.2.2014 10:00

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
23.2.2014 10:00
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Neaktivní uživatel:23.2.2014 10:24

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
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Nymsa:23.2.2014 10:27

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
23.2.2014 10:27
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:23.2.2014 14:13

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.