PInvoke

MSDN Platform Invoke Tutorial

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:

EnumProcesses

OpenProcess

EnumProcessModules

GetModuleFileNameEx

przykład w WinAPI: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682621(v=vs.85).aspx

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