Windows 7 i .NET4


Iza nas je već više pola godine od kad je posljednji mircosoftov OS – Windows 7 lansiran. Povratne informacije od korisnika govore da je novi OS uspio u svojoj namjeri da pruži korisnicima pravi ugođaj u korištenju. Ono što ovaj OS čini posebnim od prethodnih verzija je bogato korisničko iskustvo koje korisnicima daje lakoću rada. Pored tona novih i usavršenja postojećih osobina Windows 7 za prosječnog korisnika je prava revolucija u korisničkom interfejsu koji ovaj sistem daje. Prvenstveno se misli na nekoliko stvari:

1. Podrška za Senzore i Lokacije

2. Novi redizajnirani TaskBar

3. Libraries

4. Podrška za MultiTouch

Senzors and Location Platform (SLP)

Senzori u Windows 7 smislu su uređaji koji su sposobni mjeriti određene fizičke veličine okoline. Npr. Senzor može detektovati temparaturu, intenzitet svjetlosti u okolini i sl. Također, senzori imaju mogućnost preko GPS sitema izračunavati trenutni položaj. Senzori i Lokacija je nova platforma u Windows 7, koja na jednistven način obuhvata i tretira ove uređaje, i kroz jedinstven API pruža kontrolu i iskorištavanje ovih uređaja u razvoju i korištenju aplikacija koje koriste ove uređaje. Prije Windows 7, svaki od uređaja se tretirao posebno i imao je poseban API s kojim se kontrolisao. Windows 7 pruža jedinstven API preko kojeg se mogu razvijati aplikacije za svaki uređaj koji je označen kao Windows 7 SLP Compatibile.

image

Gornja slika pokazuje novi Windows 7 Control Panel Aplet za prikaz i manupulaciju sa senzorima i lokacijom podržavanih uređaja. API koji je razvijen pod Windows 7 za senzore i lokacije, naravno je „native“ i direktono se ne može koristiti u razvoju .NET aplikacija.

U koliko nemate fizički senzorski uređaj, a još uvijek želite da razvijete aplikacije potpomognute sa ovim uređajima moguće je instalirati virtualni senzor koji oponaša fizički uređaj. Da bi mogli da koristite virtualni senzor potrebno je da instalirate zadnji Windows 7 SDK, te zavisno od tipa OS (32bit ili 64bit) instalirate virtualne senzore.

Instalacija Windows 7 SDK i podrška za virtualne senzore

U nekoliko koraka biće opisan način na koji se istalira podrška za virtualni senzor

1. Pokrenite web instalaciju Windows 7 SDK, sa ovog linka. Instalacija Windows 7 SDK može se skinuti u ISO verziji ili web instalaciji. ISO vrezija je oko 4 GB, pa se preporuča da se koristi web instalacija preko koje možete izabrati one komponente koje su vam interesantne.

2. Nakon pokretanja winsdk_web.exe, pokreće se instalacijski čarobnjak preko kojeg se mogu ozačiti one komponente koje su za vas interesantne. Naredni prozor pokazuje komponente koje se trebaju instalirati u koliko želite imati podršku za visturalne senzore i aplikaciju za manipulaciju senzora svjetlosti.

image

3. Nakon instalacije SDK-a, sada je potrebno instalirati driver za senzor. Otvorite Device Manager i dodajte novi hardware, kao na slici.

image

U narednom koraku odaberite sljedeće opcije kao na slikama:

image

image

image

image

Putanja na kojoj se nalazi driver za virtualni senzor zavisi od tipa OS. Kod Win64 driver se nalazi kao na slici dolje, dok se za Win32 driver nalaizi u Bin folderu (jedan nivo više).

image

Nakon instalacije potrebno je Senzor uključiti:

image

5. Kad je driver instaliran sada je moguće pokrenuti aplikaciju VirtualLightSensor.exe za senzor svjetlosti koja se nalazi u Bin odnosno Bin/x64 folder za win32 ili win64 OS respektivno.

image

Razvoj .NET aplikacija koje podržavaju senzore

Razvoj .NET aplikacija koje podržavaju senzore i lokaciju, moguće je preko .NET 4.0 koji ulazi u release fazu ili koristiti .NET3.5. U oba slučaja potrebno je još koristiti određene biblioteke za podršku. S toga je Microsoft je pokrenuo Open Source projekat Windows API Code Pack, koji predstavlja ne samo wraper oko windows 7 dll-a, nego i OO platformu za razvoj aplikacija koje crpe osobine Windows 7 OS. Postiji čitav niz novih Windows 7 osobina koje su ugrađene u API Code Pack, koje će biti spomenute kasnije. Pored toga API Code Pack sadrži i podršku određenih osobina od starijih OS-ova poput Viste i XP, a koje nisu bile podržane sa .NET-om. API Code Pack sa prvom verzijom 1.0 pojavio se na ljeto 2009, dok je verzija 1.1.0 obznanjena na PDC2009 u oktobru 2009. Planovi su da će ovaj projekat u dogledno vrijeme biti sastavni dio .NET Frameworka.

LightSensorDemo

U okviru ovog posta implementiraćemo mali demo koji se bazira na senzoru svjetlosti. Aplikacija će detektovati senzore svjetlosti instalirane na PC-u (naravno virtualne). Detekcija svjetlosti registrovaće se sa progress bar controlom koja će prikazivati intenzitet svjetlosti. Za vrijeme promjene intenziteta svjetlosti u RichEdit koje će također biti povezana sa senzorom svjetlosti, mijenjaće svoju pozadinu u odnosu na intenzitet svjetlosti.

image

Da bi se mogao ovaj demo implementirati potrebno je, pored Windows 7 SDK, kojeg smo opisali, instalirati Windows API Code Pack.Koji će detaljnije biti opisan u narednom postu.

Nakon skidanja API Code Pack-a, potrebno je buildati biblioteku da bi se mogli referecirati njeni dll-ovi.

1. Otvorite Visual Studio 2010 (ili 2008), te formirajte novi Windows Forms Projekat LightSensorDEMO.

2. Nakon formiranja projekta potrebno je referencirati dll-ove od API Code Pack-a:

image

Odaberemo putanju u koju smo formirali dll-ove, te ih učitamo, kao na sljedećoj slici:

image

1. Nakon toga u Forms1.cs potrebno je deklarisati prostore imena:

image

Sada je jos potrebno implementirati logiku aplilacije. Da bi manipulisali sa senzorima koristimo statičku klasu: SensorManager čija je deklaracija prikazana u sljedećem kodu:

public static class SensorManager
    {
        public static event SensorsChangedEventHandler SensorsChanged;

        public static SensorList<Sensor> GetAllSensors();
        public static S GetSensorBySensorId<S>(Guid sensorId) where S : Sensor;
        public static SensorList<Sensor> GetSensorsByCategoryId(Guid category);
        public static SensorList<S> GetSensorsByTypeId<S>() where S : Sensor;
        public static SensorList<Sensor> GetSensorsByTypeId(Guid typeId);
        public static void RequestPermission(IntPtr parentWindowHandle, bool modal, SensorList<Sensor> sensors);
    }

Ova klasa sadrži statičke metode koje koristimo da dobijemo sve senzore instalirane na PC-u, secifične senzore filtrirane po kategoriji, ID, i sl. Pored ovih metoda postoji i event koji se okida kada god PC detektuje novi instaliran senzor. Ovom klasom u stanju smo potpuno manipulisati sa svim senzorima, kao i ad hock dobijati informacije o novoinstaliranom senzoru.

Na samom početku definisćemo event SensorsChanged, da u slučaju kada na aplikacija radi, imamo mogućnost detektovanja novoinstaliranog senzora.

U konstruktor klase Forms1 definišimo SensorsChanged,i implementirajmo metodu:

public Form1()
{
    InitializeComponent();
    SensorManager.SensorsChanged += new SensorsChangedEventHandler(SensorManager_SensorsChanged);
}

Pripadajuća metoda SensorManager_SensorsChanged poziva se iz radne niti (working thread) pa se direktono ne može manipulisati GUI kontrolama forme. S toga se pomoću BeginInvoke pristupa kontrolama na sljedeći način:

void SensorManager_SensorsChanged(SensorsChangedEventArgs change)
{

    BeginInvoke(new MethodInvoker(delegate
    {
        InitSensors();
    }));
}

Preko BeginInvoke pristupamo metodi InitSensors(); u kojoj definišemo i incijaliziramo event za promjenu intenziteta senzora svjetlosti.

Implementacija metode je sljedeća:

private void InitSensors()
{
    SensorList<AmbientLightSensor> alsList = SensorManager.GetSensorsByTypeId<AmbientLightSensor>();
    if (alsList.Count < 1)
    {
        MessageBox.Show("Ne postoji instaliran Senzor svjetlosti!");
        return;
    }

    alsList[0].DataReportChanged += new DataReportChangedEventHandler(Form1_DataReportChanged);
    alsList[0].UpdateData();
}

Ova metoda radi sljedeće:

1. Pohranjuje u listu sve instalirane senzore

2. U koliko lista nije prazna uzimamo prvi senzor iz liste i pretplaćujemo se na event DataReportChanged, koji će pratiti promjenu svjetlosti.

3. Metoda Form1_DataReportChanged uzima trenutnu vrijednost svjetlosti koju senzor registrira, na osvnovu te vrijednosti podešava se progress bar kontrola, a rich edit kontroli mijenja boju pozadine. Ova implementacije je prikazana na sljedećem listingu:

void Form1_DataReportChanged(Sensor sender, EventArgs e)
{
    AmbientLightSensor sensor = sender as AmbientLightSensor;
    // Seznor promjene svjetlosti dolazi iz radne niti stoga je potreno
    // preko BeginInvoke promjenu prosljediti u UI nit
    BeginInvoke(new MethodInvoker(delegate
    {
        int lightVal= (int)sensor.CurrentLuminousIntensity.Intensity;
        progressBar1.Value =lightVal;

        if (lightVal < 5)
            richTextBox1.BackColor = Color.Gray;
        else if(lightVal<10)
            richTextBox1.BackColor = Color.Goldenrod;
        else if (lightVal < 20)
            richTextBox1.BackColor = Color.LawnGreen;
        else if (lightVal < 100)
            richTextBox1.BackColor = Color.Green;
        else if (lightVal < 500)
            richTextBox1.BackColor = Color.Red;
        else if (lightVal < 1000)
            richTextBox1.BackColor = Color.Blue;
        else if (lightVal < 5000)
            richTextBox1.BackColor = Color.Yellow;
        else if (lightVal < 50000)
            richTextBox1.BackColor = Color.SaddleBrown;

    }));
}

LightSensorDEMO aplikacija demonstrira upotrebu novih mogućnosti Windows 7 OS, za razvoj .NET aplikacija korištenjem Windows API Code Pack. Cjelokupan sourcecode aplikacije možete preuzeti sa ovog linka.

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 14/03/2010, in .NET, Windows and tagged , , . Bookmark the permalink. 2 Comments.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s