PInvoke
- PInvoke.net wiki biblioteki PInvoke.NET zawierające pasujące sygnatury typów niezbędnych do przeprowadzenia marshallingu
Zadanie 1
Za pomocą mechanizmu PInvoke włącz do kodu zarządzanego w C# funkcję Komunikat()
z biblioteki DLL tworzonej na poprzednich zajęciach i uruchom ją.
- utwórz projekt aplikacji .Net w C# (np. aplikacja konsolowa)
- dodaj przestrzeń nazw: System.Runtime.InteropServices
- użyj atrybutu DLLImportAtributte do włączenia funkcji
Komunikat
do jako statyczną metodę jednej z klas w C# i przetestuj działanie tej funkcji
Zadanie 2
Dodaj do projektu z zadania 1 następujące funkcjonalności:
- wyświetl ilość wolnej przestrzeni dyskowej partycji C: korzystając z funkcji GetDiskFreeSpaceEx()
- wyświetl listę okien za pomocą funkcji EnumWIndows(), podając tekst związany z oknem uzyskany za pomocą komunikatu WM_GETTEXT
- wypisz nazwy modułów (plików exe) związanych z wszystkimi procesami w systemie kozystając z funkcji:
Zadanie 3
Zaimplementuj aplikację okienkową w .NET, która zawiera kontrolkę edycyjną oraz przycisk. Po wciśnięciu przycisku tekst z kontrolki edycyjnej jest wysyłany do wszystkich działających procesów „Notepad.exe” (a konkretnie do ich kontrolek edycyjnych). Uwaga: powinna być uruchomiona przynajmniej jedna aplikacja Notepad.exe
, nie musi posiadać focusa.
- uruchom aplikację Notepad.exe i zlokalizuj kontrolkę edycyjną związaną z tym programem za pomocą programu Spy++. Uwaga: aplikacja Spy++ wymaga uprawnień administracyjnych.
- za pomocą metody GetProcessesByName uzyskaj listę wszystkich procesów aplikacji
Notepad
- za pomocą funkcji FindWindowEx zdobądź uchwyt do kontrolki edycyjnej procesu notatnika.
- po kliknięciu przycisku wyślij komunikat
WM_SETTEXT
z zawartością pola edycyjnego z twojej aplikacji do kontrolki edycyjnej w aplikacji Notepad.exe - aby przesłać tekst w komunikacjie można umieścić go w niezarządzanej pamięci za pomocą metody Marshal.StringToHGlobalUni()
- dodaj przycisk uruchamiający kolejną instancję aplikacji Notatnik za pomocą metody Process.Start()
- komunikat WM_SETTEXT wstawia podany tekst do okna
- dodaj nową kontrolkę edycyjną oraz przycisk. Po wciśnięciu przycisku wysyłany jest komunikat
WM_CLOSE
do wszystkich okien, których nazwa pasuje do tekstu wpisanego w kontrolce edycyjnej
Zadanie 4
Napisz aplikację Windows Form, która wyświetla w kontrolce ListBox, wszystkie komunikaty napływające do okna głównego aplikacji. * dociąż metodę WndProc(), która umieszcza informacje na temat napływających komunikatów w kontrolce ListBox
- dodaj przycisk pozwalający wyczyścić zawartość kontrolki ListBox
- dodaj CheckBox, którego zaznaczenie powoduje włączenie/wyłączenie zapisywania komunikatów w kontrolce ListBox
Zadanie 5
Napisz aplikację Windows Form, która rejestruje w systemie komunikat „KomunikatWinApi” i pozwala wysłać go do wszystkich innych aplikacji.
- zarejestruj komunikat
KomunikatWinApi
za pomocą funkcji RegisterWindowMessage - dodaj przycisk powodujący wysłanie zarejestrowanego komunikatu
- dodaj kontrolkę ListBox, w której będą umieszczane informacje o komunikatach wysłanych z innych aplikacji
- uruchom kilka instancji aplikacji i przetestuj mechanizm rozsyłania wiadomości