NePo
Rugsėjis 22, 2006

Kuriam savo Task Manager

Šį kartą pabandysiu paaiškinti, kaip pasidaryti kažką panašaus į Task Manager. Iš karto perspėju tuos, kurie nei karto nėra pasileidę Visual Studio - nesivarginkite skaityti toliau.

Vis tik aš pabandysiu paaiškinti labai paprastai “Step by step”.
Taigi, pirmasis žingsnis - pasileisti Visual Studio, aš asmeniškai naudoju VS 2005, ir susikurti nauja c# kalbos windows application projektą.
Sukūrus tokį projektą mes gauname tik tuščią formą. Kokių elementų mums reikėtų? Aš išsirenku Button (Toolbox->Common Controls) bei DataGridView(Toolbox->Data) ir juos užsidedu ant formos.
Du kartus paspaudę ant Button jau galime rašyti kodą. Būdami gudrūs mes aišku susikurtume savo funkciją ir iškviestume ją šito mygtuko paspaudimo metu, bet šį kartą darykite kiekvienas pagal savo skonį.
Taigi dabar apie kodą. Windows Task Manager pagrindinė funkcija išvesti procesus, kaip mums tai padaryti? Pasirodo visai nesunku:

Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
}

Tiesa, šis kodas jums kol kas dar neveiks, nes dar reikia įsikelti porą papildomų bibliotekų. Taigi kodo failo viršuje įdėkime keletą bibliotekų:

using System.Diagnostics;
using System.Threading;

Anksčiau parašytas jums neduos rezultatų dar dėl vienos priežasties - mes turime ciklą, kuris nieko neatlieka. Tame cikle reiktų kažkaip atvaizduoti duomenis. Grįžkime prie savo formos lango. Pasižymėję DataGridView paspauskite dešinį ir pasirinkite Properties, atsiradusiame lange paspauskite ties Columns. Naujame lange Edit Columns susikurkime tiek stulpelių, kiek informacijos ketinate išvesti. Šiuo atveju aš sukursiu du: ID ir Process Name. Paspaudęs mygtuką Add iššokusiame lange Header Text aš pakeičiu į stulpelių pavadinimus, kuriuos noriu sukurti ir spaudžiu Ok. Sukūręs tiek laukų, kiek noriu, dar kartą spaudžiu Ok. Taigi, turim kažkokį vaizdą DataGridView, grįžkime prie anksčiau pradėto rašyti ciklo, į jį įterpkime vieną eilutę:

dataGridView1.Rows.Add(process.Id, process.ProcessName);

Sukompiliavę programą ir ją įvykdę pamatytume, jog turime procesų id ir pavadinimus, šaunu ar ne?
Ką dar galėtume sužinoti apie procesus?
process.PriorityClass.ToString(”G”) - gražina proceso prioriteto klasę. Galimas vienas iš keturių rezultatų: Idle, Normal, High, RealTime.
process.BasePriority - analogas PriorityClass, tik prioritetai pateikiami skaičiais nuo 0 iki 24
process.MinWorkingSet - minimalus atminties kiekis reikalingas proceso darbui bitais.
process.MaxWorkingSet - maksimalus leistinas atminties kiekis proceso darbui bitais.
process.StartTime - proceso paleidimo laikas.
process.TotalProcessorTime - laikas, kurį procesas praleido užimdamas CPU.
process.UserProcessorTime - laikas, kurį procesas praleido vykdydamas kodą programos viduje.
process.MainModule - pagrindinio proceso modulio pavadinimas.
process.Modules - visų modulių sąrašas, kuriuos procesas užkrovė.
process.PagedMemorySize - puslapiuotos atminties kiekis skirtas procesui.
process.HandleCount - valdyklių skaičius atidarytas proceso.
process.MainWindowTitle - jeigu procesas yra programa (pvz. Opera), tai galima sužinoti pagrindinio lango pavadinimą.
process.PeakPagedMemorySize - virtualios puslapiuotos atminties maksimalus kiekis panaudotas proceso.
process.MainWindowHandle - pagrindinio lango proceso valdiklis.
process.Responding - gražina true arba false reikšmę reiškiančią ar proceso vartotojo interfeisas nepakibo.
process.VirtualMemorySize - virtualios atminties kiekis išskirtas procesui.
process.WorkingSet - fizinės atminties kiekis išskirtas procesui.
Žodžiu, galimybių daug, ką norite įsidėti spręsti jums. Pastaba: tarp procesų yra vienas pavadintas Idle, kuris neturi daugelio kitiems procesams būdingų savybių, bet manau jūs nesunkiai sugalvosite patys kaip jo nerodyti.

Turbūt atkreipėte dėmesį, jog čia mes gavome visą procesų sąrašą, o ką daryti tuomet jeigu riekia informacijos tik apie vieną konkretų procesą? Pasirodo tai visai nesunku:

Process process = Process.GetProcessById(processId);

processId - int tipo kintamasis nurodantis proceso, kurio informaciją norime pasiimti, Id.

Pabandykime patobulinti turimą programą pridėdami dar vieną funkciją. Pirmiausia vėl grįžkime prie formos dizaino lango ir įsidėkime naują komponetą ContextMenuStrip (Toolbox->Menus&Toolbars). Pasižymėję tik ką įsidėtą komponentą matome iškritusį meniu, paspaudžiame ant jo ir įvedame pavadinimą “Kill”. Dabar turime meniu iš vieno lauko, du kartus paspaudę ant to lauko jau galėtume rašyti kodą, bet prieš tai dar reikia nurodyti kaip tas meniu bus iškviečiamas. Taigi, norėdami prikabinti meniu turime išsikviesti stulpelių redagavimo langą (dataGridView->Properties->Columns). Kiekvieno langelio stulpelio, kuriame norime, kad atsidarytų tas meniu, savybių lauke prie punkto ContextMenuStrip reikia pasirinkti mūsų sukurtą menių. Šiuo atveju aš prikabinsiu prie abiejų laukų, o jūs darykite kaip jums patogiau. Norėčiau atkreipti dėmesį, jog kabinu prie kiekvieno norimo stulpelio, o ne prie viso DataGridView.
Taigi, prisikabinome meniu, dabar jau galime rašyti kodą. Iš pavadinimo jau turbūt atspėjote, ką darys šita funkcija - žudys procesą. Tą padaryti mums reikia komandai nusiųsti proceso Id. Jeigu meniu būčiau prikabinęs tik prie stulpelio, kuriame yra proceso ID, tereiktų gauti CurrentCell ir ją paduoti komandai, tačiau šiuo atveju truputėlį sudėtingiau, nes mus reikia pirmiausia pasiimti eilutės koordinatę, stulpelio koordinatė visada bus 0 (arba tas kuriame jūs atvaizduojate ID). Taigi, kodas toks:

int rowCoo= dataGridView1.CurrentCell.RowIndex;
Int32 processId = Int32.Parse(dataGridView1[0, rowCoo].Value.ToString());
Process process = Process.GetProcessById(processId);
process.Kill();

Sukompiliuojam. Šaunu?
Pastaba: jeigu kelis kartus paspausite mygtuką, tai pastebėsite, jog procesų sąrašas dedamas į DataGridView apačią, todėl prieš išvedant sąrašą reiktų DataGridView išvalyti

dataGridView1.Rows.Clear();

Pastaba2: nėra apsaugos nuo paspaudimo ant tuščios celės.
Pastaba3: šį kartą neatsižvelgėme visiškai į programos dizainą, tik į praktinį jos sukūrimą.
Rodos, šį kartą viskas, jeigu manote, kad reiktų pridėti dar kokių nors funkcijų rašykit, prašykit, siūlykit.
P.S. Tą programą, kurią sukūrėme galite pasiimti iš čia.

Panašūs straipsniai


“Kuriam savo Task Manager” komentarų: 5

  1. Darbas su XML failais Pixel.lt

    […] PasteBin « Kuriam savo Task Manager […]

  2. Pažintis su WMI Pixel.lt

    […] Kodėl man prireikė WMI? Atsimenate, aš aiškinau kaip susikurti savo Task Manager ? Jeigu atidžiai skaitėte straipsnį galėjote pastebėti, kokių nuostabių galimybių suteikia Process klasė. Tačiau, jeigu būtumėte uždavę teisingus klausimus, pastebėtumėt jos trūkumus. Teisingi klausimai: […]

  3. » Laužom ir koduojam Archyvas » Pixel.lt

    […] Aš parašiau straipsnius apie C# kalbą: Kuriam savo Task Manager, Darbas su XML failais, Laukinių web servisų medžioklė ir Pažintis su WMI. Kiekvieno straipsnio pabaigoje duodavau atsisiųsti sukurtą programą, bet turbūt daugelį iš jūsų sunervindavo, jog neduodavau kodo ir projekto failų. Čia mano logika buvo tokia: kas norės tas iš .exe bylos išgaus tai, ko jam reikia, o kas nežino kaip tai padaryti, vadinasi nevertas. Šiame straipsnyje kaip tik noriu papasakoti, kaip iš .NET sukurto .exe failo pavogti kodą ir kaip nuo to apsisaugoti. Šiame straipsnyje bus daug paveiksliukų ir mažai teksto. […]

  4. » Process vs WMI Archyvas » Pixel.lt

    […] Ne taip jau seniai aš parodžiau netgi du būdus, kaip susikurti programas panašias į Task Manager: Kuriam savo Task Manager ir Pažintis su WMI. Kiekvienas iš šių metodų turi savų privalumų ir trūkumų, norit sužinoti kuris geresnis, jums teks patiems pasinagrinėti kodą ir nuspręsti, o aš norėčiau aptarti laiko aspektą. […]

  5. SwataZ

    Kaip šio straipsnio viršuje parašyta “Iš karto perspėju tuos, kurie nei karto nėra pasileidę Visual Studio - nesivarginkite skaityti toliau.”. Bet aš pirmą kart atsisėdęs padariau :) Iš 1 karto. Dėkui už pamoką :)

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.