PInvoke

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

Zaimplementuj aplikację, która korzystając z mechanizmów PInvoke woła funkcje systemowe WinAPI i wyświetla następujące informacje:

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.

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.

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
  • 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.

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