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 z poprzednich zajęć (biblioteka.zip)
- 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
Zaimplementuj aplikację, która korzystając z mechanizmów PInvoke woła funkcje systemowe WinAPI i wyświetla następujące informacje:
- ilość wolnej przestrzeni dyskowej partycji C: korzystając z funkcji GetDiskFreeSpaceEx()
- listę okien za pomocą funkcji EnumWIndows(), podając tekst związany z oknem uzyskany za pomocą komunikatu WM_GETTEXT
- nazwy modułów (plików exe) związanych z wszystkimi procesami działającymi aktualnie w systemie korzystając z funkcji:
Zadanie 3
Zaimplementuj aplikację okienkową w .NET (WindowsForms lun WPF), która pozwala przesłać zadany tekt do wszystkich działających aplikacji notatnik („Notepad.exe”):
- okno aplikacji zawiera kontrolke edycyją oraz przycisk „wyślij”. Po wciśnięciu tego przycisku tekst z kontrolku edycyjnej jest wysyłany do wzystkich działających instancji aplikacji notanika,
- metoda GetProcessesByName pozwala uzyskać listę wszystkich procesów o zadanej nazwie (np.
Notepad
), - funkcja FindWindowEx pozwal uzyskać uchwytokna lub kontrolki o podanej nazwie lub o podanej klasie okien (kontrolka edycyjna należy do klasy okien „Edit”),
- wykorzystaj komunikat
WM_SETTEXT
do przesłania tekstu do notatnika. Przesłanie tekstu w komunikacie wymaga umieszczenia go w niezarządzanej pamięci za pomocą metody Marshal.StringToHGlobalUni(), - dodaj do aplikacji przycisk uruchamiający kolejną instancję aplikacji Notatnik za pomocą metody Process.Start(),
- 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.
Lokalizację kontrolki edycyjnej i nazwę klasy okien kontrolki w aplikacji Notepad.exe mozna zlokalizować za pomocą programu Spy++. Uwaga: aplikacja Spy++ wymaga uprawnień administracyjnych.
Zadanie 4
Napisz aplikację okienkową Windows Forms, 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 4a
Napisz aplikację okienkową WPF, która wyświetla w kontrolce ListBox, wszystkie komunikaty (nazwy komunikatów lub ich numery) napływające do okna głównego aplikacji.
- uzyskaj dostep do okna Win32, w którym osadzona jest zawartość aplikacji WPF za pomocą metody FromVisual(). Metoda ta pozwala uzyskać obiekt klasy HwndSource, która dostarcza uchwyt i dostep implementacji okna Win32 oraz implementuje własną procedurę okna.
- dodaj własną implementację procedury okna w postacu delegata HwndSourceHook rejestrowanego za pomocą metody AddHook
- przykład: How to receive WndProc messages in WPF
- 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 Forms lub WPF), 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 do wszystkich okien głównych na pulpicie (uchwyt
HWND_BROADCAST
) - 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