PInvoke

Calling Native Functions from Managed Code

PInvoke.net wiki biblioteki PInvoke.NET zawierające pasujące sygnatury typów niezbędnych do przeprowadzenia marshallingu

WPF and Win32 Interoperation

How to receive WndProc messages in WPF

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:

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 (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