VÝUKOVÝ MATERIÁL Identifikační údaje školy
Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vytvořeno Určeno pro Přílohy
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 CZ.1.07/1.5.00/34.1076 Pro vzdělanější Šluknovsko 32 – Inovace a zkvalitnění výuky prostřednictvím ICT 0207 Mgr. Bc. Jan Škoda Programování VY_32_INOVACE_0207_0314 Visual C# - API funkce Žák si upevní učivo o API funkcích v programovacím jazyce Visual C# 26. 7. 2013 3. ročník oboru Informační technologie 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-048664.