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/aa288468(v=vs.71).aspx|MSDN Platform Invoke Tutorial]] * [[http://www.pinvoke.net/index.aspx|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: [[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 ===== Dodaj do projektu z zadania 1 następujące funkcjonalności: * wyświetl 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()]] * wyświetl 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]] * wypisz nazwy modułów (plików exe) związanych z wszystkimi procesami w systemie kozystają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, 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 [[https://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocessesbyname(v=vs.110).aspx|GetProcessesByName]] uzyskaj listę wszystkich procesów aplikacji ''Notepad'' * za pomocą funkcji [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms633500(v=vs.85).aspx|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 [[https://msdn.microsoft.com/pl-pl/library/system.runtime.interopservices.marshal.stringtohglobaluni(v=vs.110).aspx|Marshal.StringToHGlobalUni()]] * dodaj 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()]] * komunikat [[https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms632644(v=vs.85).aspx|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ę [[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 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 [[https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms644947(v=vs.85).aspx|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