Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== PInvoke ====== * [[https://msdn.microsoft.com/en-us/library/ms235282.aspx|Calling Native Functions from Managed Code]] * [[http://www.pinvoke.net/index.aspx|PInvoke.net]] wiki biblioteki PInvoke.NET zawierające pasujące sygnatury typów niezbędnych do przeprowadzenia marshallingu * [[https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/wpf-and-win32-interoperation?view=netframework-4.7.2|WPF and Win32 Interoperation]] * [[https://pingfu.net/receive-wndproc-messages-in-wpf|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ęć ({{zajecia:winprog_2018_1:src:biblioteka.zip}}) * utwórz projekt aplikacji .Net w C# (np. aplikacja konsolowa) * dodaj przestrzeń nazw: [[https://msdn.microsoft.com/en-us/library/system.runtime.interopservices(v=vs.110).aspx|System.Runtime.InteropServices]] * użyj atrybutu [[https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute(v=vs.110).aspx|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 [[https://msdn.microsoft.com/pl-pl/library/windows/desktop/aa364937(v=vs.85).aspx|GetDiskFreeSpaceEx()]] * listę okien za pomocą funkcji [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs.85).aspx|EnumWIndows()]], podając tekst związany z oknem uzyskany za pomocą komunikatu [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms632627(v=vs.85).aspx|WM_GETTEXT]] * nazwy modułów (plików exe) związanych z wszystkimi procesami działającymi aktualnie w systemie korzystając z funkcji: * [[https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms682629(v=vs.85).aspx|EnumProcesses]] * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx|OpenProcess]] * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms682631(v=vs.85).aspx|EnumProcessModules]] * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85).aspx|GetModuleFileNameEx]] * przykład w WinAPI: [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms682621(v=vs.85).aspx|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 [[https://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocessesbyname(v=vs.110).aspx|GetProcessesByName]] pozwala uzyskać listę wszystkich procesów o zadanej nazwie (np. ''Notepad''), * funkcja [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms633500(v=vs.85).aspx|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 [[https://msdn.microsoft.com/pl-pl/library/system.runtime.interopservices.marshal.stringtohglobaluni(v=vs.110).aspx|Marshal.StringToHGlobalUni()]], * dodaj do aplikacji przycisk uruchamiający kolejną instancję aplikacji Notatnik za pomocą metody [[https://msdn.microsoft.com/pl-pl/library/system.diagnostics.process.start(v=vs.110).aspx|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ę [[https://msdn.microsoft.com/pl-pl/library/system.windows.forms.control.wndproc(v=vs.110).aspx|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 [[https://msdn.microsoft.com/pl-pl/library/system.windows.presentationsource.fromvisual(v=vs.110).aspx|FromVisual()]]. Metoda ta pozwala uzyskać obiekt klasy [[https://docs.microsoft.com/en-us/dotnet/api/system.windows.interop.hwndsource?view=netframework-4.7.2|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 [[https://docs.microsoft.com/en-us/dotnet/api/system.windows.interop.hwndsourcehook?view=netframework-4.7.2|HwndSourceHook]] rejestrowanego za pomocą metody [[https://docs.microsoft.com/en-us/dotnet/api/system.windows.interop.hwndsource.addhook|AddHook]] * przykład: [[https://pingfu.net/receive-wndproc-messages-in-wpf|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 [[https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms644947(v=vs.85).aspx|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