utworzone przez Adam Jachocki | lis 4, 2021 | .NetCore, Visual Studio, WPF
Super! Dostałeś nowy monitor 4k! Nic tylko szaleć. Odpalasz swój program napisany w WPF i… gówno widzisz. Wszystko jest za małe. Jak to się dzieje? Przecież obiecali, że WPF ogarnia DPI, czy coś tam i nie trzeba już nic robić…
No tak. Niby ogarnia, ale nie ogarnia zmiany DPI przy kilku monitorach. To automatycznie robią aplikacje pisane w UWP. Natomiast w WPF trzeba zrobić mały, prosty myk. Ale spokojnie, nie musisz przepisywać aplikacji, stosować jakiś ViewBoxów, czy skomplikowanych obliczeń. Wszystko zostanie załatwione w pliku manifestu.
Windows 10 od wersji 1703 używa czegoś takiego jak Per-Monitor v2 awarness mode. Po krótce chodzi o to, że potrafi rozpoznać, kiedy okno aplikacji jest przesuwane na monitor z inną rozdzielczością. Teraz musimy poinformować naszą aplikację WPF, że też to potrafi:
Rozwiązanie
1. Utwórz plik manifestu (jeśli używasz domyślnego) lub otwórz jeśli już go masz.
Aby utworzyć plik manifestu:
- kliknij prawym klawiszem myszy na projekt
- wybierz Add -> New Item
- odnajdź plik manifestu (wpisz w okienko do szukania: manifest)
2. Jeśli utworzyłeś nowy plik manifestu, to prawdopodobnie już wszystko masz. Wystarczy znaleźć fragment <application xmlns="urn:schemas-microsoft-com:asm.v3">
i go odkomentować.
3. Powinieneś w pliku manifestu mieć taki fragment:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
I tyle. Upewnij się, że Twoja aplikacja używa tego pliku. Aby to zrobić:
- kliknij prawym klawiszem myszy na projekt
- wejdź w ustawienia (Properties)
- na karcie Application upewnij sie, że w ComboBox Manifest masz podany swój plik manifestu.
Uruchom apkę… I to tyle.
utworzone przez Adam Jachocki | maj 25, 2021 | Programowanie
Na szybko
Do pliku manifestu (stwórz, jeśli nie masz) wpisz taki kod:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
Po kolei
Wstęp
Czasem zachodzi potrzeba, żeby aplikacja była uruchamiana tylko w trybie administratora. Musi mieć podniesione uprawnienia, żeby na przykład móc utworzyć lub usuwać pliki w katalogu ProgramFiles albo robić inne operacje, które są niedozwolone dla zwykłego użytkownika. Każdą aplikację desktopową można ustawić tak, żeby była uruchamiana tylko w trybie admina. Co więcej, robi się to dokładnie tak samo niezależnie od technologii. Ważne, żeby aplikacja pracowała pod Windowsem.
Manifest
Manifest to specjalny plik XML (w .NET), który opisuje pewne metadane naszej aplikacji. Ten plik zazwyczaj znajduje się w katalogu z kodem i ma rozszerzenie .manifest, np: moja-aplikacja.exe.manifest (możesz mieć kilka plików z takim rozszerzeniem). Ale UWAGA! Plik manifestu nie jest tworzony automatycznie, więc jeśli go nie masz, musisz stworzyć go samemu.
Tworzenie manifestu
- W VisualStudio kliknij prawym klawiszem na swój projekt i wybierz Add -> New Item
- W okienku SEARCH zacznij wpisywać „manifest”
- Powinieneś na liście zobaczyć element „Application Manifest File (Windows only)”. Dodaj go.
- Zobaczysz domyślny manifest aplikacji.
- Następnie przejdź do właściwości projektu i na karcie Application sprawdź, czy aplikacja będzie budowana z tym właśnie manifestem.
I wreszcie… uruchamianie jako admin
Musisz teraz tylko zrobić małą zmianę w pliku manifestu. W sekcji trustInfo->security->requestedPrivileges
powinieneś zobaczyć taki wpis:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
teraz wystarczy, że zmienisz to na:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
zbudujesz aplikację i gotowe.
Ostatecznie plik manifestu u mnie po usunięciu komentarzy wygląda tak:
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
</application>
</compatibility>
</assembly>
Manifest aplikacji staje się jej zasobem. Od tej pory aplikacja do uruchomienia będzie wymagała uprawnień administratora i będzie mogła zrobić wszystko to, co może administrator.
Pamiętaj tylko, że to jest bardzo specyficzne wymaganie np. dla instalatorów lub pewnych programów narzędziowych. Więc zanim je wdrożysz, zastanów się dobrze, czy to dobre i jedyne wyjście.
UWAGA! Aby debugować taką aplikację, musisz uruchomić Visual Studio w trybie administratora. W przeciwnym razie VS nie będzie mógł jej uruchomić.