VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu CZ.1.07/1.5.00/34.1076 Název projektu Pro vzdělanější Šluknovsko Číslo a název šablony 32 Inovace a zkvalitnění výuky prostřednictvím ICT Autor 0207 Mgr. Bc. Jan Škoda Tematická oblast Programování Číslo a název materiálu VY_32_INOVACE_0207_0314 Visual C# - API funkce Anotace Žák si upevní učivo o API funkcích v programovacím jazyce Visual C# Vytvořeno 26. 7. 2013 Určeno pro 3. ročník oboru Informační technologie Přílohy Bez příloh
Metodický list Učitel: Výklad s projekcí elektronického učebního materiálu. Ukázka obecného postupu činností. Monitorování činnosti žáků. Žák: Sleduje výkladovou projekci a demonstraci učitele. Procvičuje.
Visual C# API funkce
Windows API Operační systém Windows umožňuje aplikacím, které pod ním běží přistupovat k OS pomocí takzvaných API funkcí. Pokud píšete aplikaci pro Windows, která nepoužívá žádné další knihovny, budete muset přímo volat tyto API funkce. V knihovně.net je zaobaleno velké množství funkcí, takže se vám málokdy stane, že potřebujete dělat něco, na co není v.netu funkce. Přesto ale může být někdy potřeba volat funkci, kterou v.net Frameworku nenaleznete..net naštěstí umožňuje importování API funkcí a jejich volání pomocí takzvaného platform invoke.
Deklarace API funkcí Pokud chcete používat API funkce ve vašem programu, musíte nejprve každou funkci nadeklarovat a říct.net Frameworku jaké má parametry a v jaké se nalézá knihovně. Pokud se podíváte například na funkci ShowWindow, zjistíte že se nalézá v knihovně user32.dll a že její parametry jsou HWND a int. HWND se do.netu překládá jako IntPtr, takže deklarace funkce v C# bude vypadat následovně: // Toto je potreba kvuli atributu DllImport using System.Runtime.InteropServices; // Import funkce ShowWindow z knihovny user32.dll [DllImport("user32.dll")] static extern IntPtr ShowWindow(IntPtr hwnd,int nshow); Deklarace funkcí musí být vloženy v nějaké třídě jako statické metody. Stránka, kde naleznete hlavičky většiny API funkcí je www.pinvoke.net.
Deklarace API funkcí Další funkce, se kterou si představíme je GetWindowText. Import této funkce je trošku obtížnější, protože práce s textovými řetězci v.netu a WinAPI se liší. Naštěstí.Net obsahuje třídu StringBuilder, kterou je možné předat funkci místo parametru typu LPSTR. Pomocí atributu [Out] ještě dáváme najevo, že parametr je výstupní (ale přesto je nutné objekt inicializovat). Deklarace funkce GetWindowText tedy vypadá takto: // Import funkce pracující s textovým řetězcem [DllImport("user32.dll")] static extern int GetWindowText(IntPtr hwnd, [Out]StringBuilder lpstring,int nmaxcount);
Volání API funkcí Pokud máte nadeklarované funkce, můžete s nimi pracovat jako s normálními statickými funkcemi. Je však třeba dávat pozor na některé detaily při volání, které jsou způsobeny tím, že API funkce fungují jinak. Například u funkcí pro práci s textem musíte napřed vytvořit objekt StringBuilder s nějakou kapacitou (do kterého funkce může zkopírovat text) a tuto kapacitu předáte jako další parametr. Kód z ukázkové aplikace, který zjišťuje titulek aktivního okna vypadá takto:
Volání API funkcí // Zjistit identifikátor (handle) aktivního okna IntPtr handle=getforegroundwindow(); // Vytvořit StringBuilder s kapacitou 256 znaků StringBuilder sb=new StringBuilder(256); GetWindowText(handle,sb,sb.Capacity); // Zobrazit titulek MessageBoxem MessageBox.Show(sb.ToString());
Volání API funkcí Pokud použijete špatnou deklaraci funkce, nebo se pokusíte importovat funkci, která neexistuje vyhodí.net výjimku až při prvním volání funkce. Výjimka DllNotFoundException znamená, že jste zadali špatné jméno DLL knihovny s funkcí. Výjimka EntryPointNotFoundException znamená, že se v dané knihovně nenachází požadovaná funkce. Máte tedy buď špatně jméno funkce. Nebo hledáte funkci v jiné knihovně.
Zdroje BĚHÁLEK, Marek. Programovací jazyk C# [online]. 2007, 134 s. [cit. 2013-07-23]. Dostupné z: http://www.cs.vsb.cz/behalek/vyuka/pcsharp/text.pdf..net - Používání Windows API funkcí. PETRÍČEK, Tomáš. TomasP.Net [online]. 2005 [cit. 2013-07-23]. Dostupné z: http://tomasp.net/articles/wininterop.aspx#links. PEŇAŠKA, Jaroslav. Malý úvod do programování v.net C# [online]. 2006, 64 s. Dostupné z: http://physics.ujep.cz/~jkrejci/vyuka/prg2/malyuvoddocsharp.pdf. PInvoke.net [online]. 2007 [cit. 2013-07-23]. Dostupné z: http://www.pinvoke.net/ Projekty SIPVZ Gymnázia Olomouc-Hejčín 2005/2006. KOVÁŘ, Dušan. Programování se zaměřením na.net a jazyk C#: Programovací jazyk C# [online]. 2006 [cit. 2013-07-23]. Dostupné z: http://projektysipvz.gytool.cz/projektysipvz/default.aspx?uid=3. PUŠ, Petr. Poznáváme C# a Microsoft.NET. In: O počítačích, IT a internetu - Živě.cz [online]. 2004 [cit. 2013-07-23]. Dostupné z: http://possitive.wz.cz/files/poznavame_csharp.pdf. ŠÍMA, František a David VILÍMEK. Microsoft Visual Studio.NET: praktické programování krok za krokem. 1. vyd. Praha: Grada, 2006, 254 s. Průvodce (Grada). ISBN 80-247-1418-3. VIRIUS, Miroslav. C# pro zelenáče. Praha: Neocortex, 2002, 255 s. ISBN 80-863-3011-7. VIRIUS, Miroslav. Programování pro.net. Praha: ČVUT, 2011, 260 s. ISBN 978-80-01-04866- 4.