Repository: builtbybel/FlyOOBE Branch: main Commit: ed093a784df5 Files: 230 Total size: 1.2 MB Directory structure: gitextract_mo4whkyi/ ├── .gitattributes ├── .gitignore ├── Flyby11/ │ ├── CpuCheck.cpp │ ├── Flyby11.vcxproj │ ├── Flyby11.vcxproj.filters │ ├── dllmain.cpp │ ├── framework.h │ ├── pch.cpp │ └── pch.h ├── Flyby11-deprecated/ │ ├── CpuCheckNative/ │ │ ├── CpuCheckNative.rc │ │ ├── CpuCheckNative.vcxproj │ │ ├── CpuCheckNative.vcxproj.filters │ │ ├── PopcntCheck.cpp │ │ ├── dllmain.cpp │ │ ├── framework.h │ │ ├── pch.cpp │ │ ├── pch.h │ │ └── resource.h │ ├── Flyby11/ │ │ ├── App.config │ │ ├── CanIUpgradeView.Designer.cs │ │ ├── CanIUpgradeView.cs │ │ ├── CanIUpgradeView.resx │ │ ├── ClippyUI.Designer.cs │ │ ├── ClippyUI.cs │ │ ├── ClippyUI.resx │ │ ├── CompatibilityForm.Designer.cs │ │ ├── CompatibilityForm.cs │ │ ├── CompatibilityForm.resx │ │ ├── FAQHandler.cs │ │ ├── Flyby11.csproj │ │ ├── IsoHandler.cs │ │ ├── Locales/ │ │ │ ├── Strings.Designer.cs │ │ │ ├── Strings.ar.resx │ │ │ ├── Strings.cs-CZ.resx │ │ │ ├── Strings.de.resx │ │ │ ├── Strings.fr.resx │ │ │ ├── Strings.he.resx │ │ │ ├── Strings.hu.resx │ │ │ ├── Strings.it.resx │ │ │ ├── Strings.ja.resx │ │ │ ├── Strings.ko.resx │ │ │ ├── Strings.nl.resx │ │ │ ├── Strings.pl.resx │ │ │ ├── Strings.pt-BR.resx │ │ │ ├── Strings.resx │ │ │ ├── Strings.sv-SE.resx │ │ │ ├── Strings.tr.resx │ │ │ └── Strings.zh-CN.resx │ │ ├── Logger.cs │ │ ├── MainForm.Designer.cs │ │ ├── MainForm.cs │ │ ├── MainForm.resx │ │ ├── ProblemsForm.Designer.cs │ │ ├── ProblemsForm.cs │ │ ├── ProblemsForm.resx │ │ ├── Program.cs │ │ ├── Properties/ │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Resources.Designer.cs │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.cs │ │ │ └── Settings.settings │ │ ├── SwitchView.cs │ │ └── app.manifest │ └── Flyby11.sln ├── Flyoobe/ │ ├── App.config │ ├── Features/ │ │ ├── Ads/ │ │ │ ├── FileExlorerAds.cs │ │ │ ├── FinishSetupAds.cs │ │ │ ├── LockScreenAds.cs │ │ │ ├── PersonalizedAds.cs │ │ │ ├── SettingsAds.cs │ │ │ ├── StartmenuAds.cs │ │ │ ├── TailoredExperiences.cs │ │ │ ├── TipsAndSuggestions.cs │ │ │ └── WelcomeExperienceAds.cs │ │ ├── Edge/ │ │ │ ├── BrowserSignin.cs │ │ │ ├── DefaultTopSites.cs │ │ │ ├── DefautBrowserSetting.cs │ │ │ ├── EdgeCollections.cs │ │ │ ├── EdgeShoppingAssistant.cs │ │ │ ├── FirstRunExperience.cs │ │ │ ├── GamerMode.cs │ │ │ ├── ImportOnEachLaunch.cs │ │ │ ├── StartupBoost.cs │ │ │ ├── TabPageQuickLinks.cs │ │ │ └── UserFeedback.cs │ │ ├── FeatureBase.cs │ │ ├── FeatureLoader.cs │ │ ├── FeatureManager.cs │ │ ├── FeatureNode.cs │ │ ├── Gaming/ │ │ │ ├── GameDVR.cs │ │ │ ├── PowerThrotteling.cs │ │ │ └── VisualFX.cs │ │ ├── Privacy/ │ │ │ ├── ActivityHistory.cs │ │ │ ├── LocationTracking.cs │ │ │ ├── PrivacyExperience.cs │ │ │ └── Telemetry.cs │ │ ├── System/ │ │ │ ├── BSODDetails.cs │ │ │ ├── Hibernation.cs │ │ │ ├── MenuShowDelay.cs │ │ │ ├── NetworkThrottling.cs │ │ │ ├── SpeedUpShutdown.cs │ │ │ ├── SystemResponsiveness.cs │ │ │ ├── TaskbarEndTask.cs │ │ │ └── VerboseStatus.cs │ │ └── UI/ │ │ ├── BingSearch.cs │ │ ├── FullContextMenus.cs │ │ ├── SearchBoxSuggestions.cs │ │ ├── SearchboxTaskbarMode.cs │ │ ├── ShowOrHideMostUsedApps.cs │ │ ├── ShowTaskViewButton.cs │ │ ├── SnapAssistFlyout.cs │ │ ├── StartLayout.cs │ │ ├── Transparency.cs │ │ └── WLockScreen.cs │ ├── Flyoobe.csproj │ ├── Helper/ │ │ ├── BackgroundHelper.cs │ │ ├── DonationHelper.cs │ │ ├── Logger.cs │ │ ├── UIHelper.cs │ │ └── Utils.cs │ ├── IView.cs │ ├── InstallView/ │ │ ├── AdvancedControlView.Designer.cs │ │ ├── AdvancedControlView.cs │ │ ├── AdvancedControlView.resx │ │ ├── BackupDriversProvider.cs │ │ ├── BootMenuInfoProvider.cs │ │ ├── InPlaceRepairProvider.cs │ │ ├── InstallProviders.cs │ │ ├── MctProvider.cs │ │ ├── MountIsoProvider.cs │ │ ├── NativeResetProvider.cs │ │ ├── RebootToUefiProvider.cs │ │ ├── RufusProvider.cs │ │ ├── RunSetupFromIsoProvider.cs │ │ ├── ToolHelper.cs │ │ └── VentoyProvider.cs │ ├── MainForm.Designer.cs │ ├── MainForm.cs │ ├── MainForm.resx │ ├── NavButton.cs │ ├── OobeControl.Designer.cs │ ├── OobeControl.cs │ ├── OobeControl.resx │ ├── Program.cs │ ├── Properties/ │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── ToolHubView/ │ │ ├── ToolHubCategory.cs │ │ ├── ToolHubControlView.Designer.cs │ │ ├── ToolHubControlView.cs │ │ ├── ToolHubControlView.resx │ │ ├── ToolHubDefinition.cs │ │ ├── ToolHubHelper.cs │ │ ├── ToolHubItemControl.Designer.cs │ │ ├── ToolHubItemControl.cs │ │ ├── ToolHubItemControl.resx │ │ └── ToolHubUrlDialog.cs │ ├── ViewMetadata.cs │ ├── ViewNavigator.cs │ ├── Views/ │ │ ├── AccountControlView.Designer.cs │ │ ├── AccountControlView.cs │ │ ├── AccountControlView.resx │ │ ├── AiControlView.Designer.cs │ │ ├── AiControlView.cs │ │ ├── AiControlView.resx │ │ ├── AppSettingsControlView.Designer.cs │ │ ├── AppSettingsControlView.cs │ │ ├── AppSettingsControlView.resx │ │ ├── AppsControlView.Designer.cs │ │ ├── AppsControlView.cs │ │ ├── AppsControlView.resx │ │ ├── DefaultsControlView.Designer.cs │ │ ├── DefaultsControlView.cs │ │ ├── DefaultsControlView.resx │ │ ├── DeviceControlView.Designer.cs │ │ ├── DeviceControlView.cs │ │ ├── DeviceControlView.resx │ │ ├── ExperienceControlView.Designer.cs │ │ ├── ExperienceControlView.cs │ │ ├── ExperienceControlView.resx │ │ ├── HomeControlView.Designer.cs │ │ ├── HomeControlView.cs │ │ ├── HomeControlView.resx │ │ ├── HomeItemControl.Designer.cs │ │ ├── HomeItemControl.cs │ │ ├── HomeItemControl.resx │ │ ├── InstallerControlView.Designer.cs │ │ ├── InstallerControlView.cs │ │ ├── InstallerControlView.resx │ │ ├── LoggerControlView.Designer.cs │ │ ├── LoggerControlView.cs │ │ ├── LoggerControlView.resx │ │ ├── NetworkControlView.Designer.cs │ │ ├── NetworkControlView.cs │ │ ├── NetworkControlView.resx │ │ ├── PersonalizationControlView.Designer.cs │ │ ├── PersonalizationControlView.cs │ │ ├── PersonalizationControlView.resx │ │ ├── UpdatesControlView.Designer.cs │ │ ├── UpdatesControlView.cs │ │ └── UpdatesControlView.resx │ └── app.manifest ├── Flyoobe.Extensions/ │ ├── Developer Essentials.ps1 │ ├── EXTENSIONS.md │ ├── Gaming tweaks.ps1 │ ├── Microsoft Defender maintenance.ps1 │ ├── Network Tools.ps1 │ ├── Power Actions.ps1 │ └── Write-an-Extension.md ├── Flyoobe.ToolSpot-deprecated/ │ ├── Flyoobe.Spot.sln │ └── Flyoobe.ToolSpot/ │ ├── App.config │ ├── Flyoobe.Spot.csproj │ ├── MainForm.Designer.cs │ ├── MainForm.cs │ ├── MainForm.resx │ ├── Program.cs │ ├── Properties/ │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ └── app.manifest ├── Flyoobe.sln ├── LICENSE ├── README.md ├── assets/ │ ├── Flyoobe_Profile_Community.txt │ └── Info.md └── docs/ └── update-check.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.c linguist-language=C *.h linguist-language=C *.cpp linguist-language=C++ *.cc linguist-language=C++ *.hpp linguist-language=C++ ================================================ FILE: .gitignore ================================================ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore # User-specific files *.rsuser *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Mono auto generated files mono_crash.* # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ [Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ [Ll]ogs/ # Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ # Visual Studio 2017 auto generated files Generated\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUnit *.VisualState.xml TestResult.xml nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # Benchmark Results BenchmarkDotNet.Artifacts/ # .NET Core project.lock.json project.fragment.lock.json artifacts/ # ASP.NET Scaffolding ScaffoldingReadMe.txt # StyleCop StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c *_h.h *.ilk *.meta *.obj *.iobj *.pch *.pdb *.ipdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *_wpftmp.csproj *.log *.tlog *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # Visual Studio Trace Files *.e2e # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # AxoCover is a Code Coverage Tool .axoCover/* !.axoCover/settings.json # Coverlet is a free, cross platform Code Coverage Tool coverage*.json coverage*.xml coverage*.info # Visual Studio code coverage results *.coverage *.coveragexml # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # NuGet Symbol Packages *.snupkg # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. !**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/[Pp]ackages/repositories.config # NuGet v3's project.json files produces more ignorable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx *.appxbundle *.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !?*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.jfm *.pfx *.publishsettings orleans.codegen.cs # Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm ServiceFabricBackup/ *.rptproj.bak # SQL Server files *.mdf *.ldf *.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings *.rptproj.rsuser *- [Bb]ackup.rdl *- [Bb]ackup ([0-9]).rdl *- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat node_modules/ # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw # Visual Studio 6 auto-generated project file (contains which files were open etc.) *.vbp # Visual Studio 6 workspace and project file (working project files containing files to include in project) *.dsw *.dsp # Visual Studio 6 technical files *.ncb *.aps # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # CodeRush personal settings .cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ *.pyc # Cake - Uncomment if you are using it # tools/** # !tools/packages.config # Tabs Studio *.tss # Telerik's JustMock configuration file *.jmconfig # BizTalk build output *.btp.cs *.btm.cs *.odx.cs *.xsd.cs # OpenCover UI analysis results OpenCover/ # Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log *.binlog # NVidia Nsight GPU debugger configuration file *.nvuser # MFractors (Xamarin productivity tool) working folder .mfractor/ # Local History for Visual Studio .localhistory/ # Visual Studio History (VSHistory) files .vshistory/ # BeatPulse healthcheck temp database healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ # Fody - auto-generated XML schema FodyWeavers.xsd # VS Code files for those working on multiple tools .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json *.code-workspace # Local History for Visual Studio Code .history/ # Windows Installer files from build outputs *.cab *.msi *.msix *.msm *.msp # JetBrains Rider *.sln.iml ================================================ FILE: Flyby11/CpuCheck.cpp ================================================ // CpuCheck.cpp #include "pch.h" #include extern "C" __declspec(dllexport) bool __cdecl HasPopcnt() { int cpuInfo[4] = { 0 }; __cpuid(cpuInfo, 1); // Check if the processor supports SSE4.2 (bit 20 of the ECX register) bool hasSSE42 = (cpuInfo[2] & (1 << 20)) != 0; // Check if the processor supports POPCNT (bit 23 of the ECX register) bool hasPOPCNT = (cpuInfo[2] & (1 << 23)) != 0; return hasSSE42 && hasPOPCNT; } ================================================ FILE: Flyby11/Flyby11.vcxproj ================================================ Debug Win32 Release Win32 Debug x64 Release x64 17.0 Win32Proj {7a2dd9d3-5d3d-46e8-976a-51a6304ccf45} Flyby11 10.0 DynamicLibrary true v143 Unicode DynamicLibrary false v143 true Unicode DynamicLibrary true v143 Unicode DynamicLibrary false v143 true Unicode Level3 true WIN32;_DEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h Windows true false Level3 true true true WIN32;NDEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h Windows true false Level3 true _DEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h MultiThreaded Windows true false Level3 true true true NDEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h Windows true false Create Create Create Create ================================================ FILE: Flyby11/Flyby11.vcxproj.filters ================================================  {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Headerdateien Headerdateien Quelldateien Quelldateien Quelldateien ================================================ FILE: Flyby11/dllmain.cpp ================================================ // dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. #include "pch.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } ================================================ FILE: Flyby11/framework.h ================================================ #pragma once #define WIN32_LEAN_AND_MEAN // Selten verwendete Komponenten aus Windows-Headern ausschließen // Windows-Headerdateien #include ================================================ FILE: Flyby11/pch.cpp ================================================ // pch.cpp: Quelldatei, die dem vorkompilierten Header entspricht #include "pch.h" // Bei der Verwendung vorkompilierter Header ist diese Quelldatei für eine erfolgreiche Kompilierung erforderlich. ================================================ FILE: Flyby11/pch.h ================================================ // pch.h: Dies ist eine vorkompilierte Headerdatei. // Die unten aufgeführten Dateien werden nur einmal kompiliert, um die Buildleistung für zukünftige Builds zu verbessern. // Dies wirkt sich auch auf die IntelliSense-Leistung aus, Codevervollständigung und viele Features zum Durchsuchen von Code eingeschlossen. // Die hier aufgeführten Dateien werden jedoch ALLE neu kompiliert, wenn mindestens eine davon zwischen den Builds aktualisiert wird. // Fügen Sie hier keine Dateien hinzu, die häufig aktualisiert werden sollen, da sich so der Leistungsvorteil ins Gegenteil verkehrt. #ifndef PCH_H #define PCH_H // Fügen Sie hier Header hinzu, die vorkompiliert werden sollen. #include "framework.h" #endif //PCH_H ================================================ FILE: Flyby11-deprecated/CpuCheckNative/CpuCheckNative.vcxproj ================================================ Debug Win32 Release Win32 Debug x64 Release x64 17.0 Win32Proj {a2038e07-e21f-4b05-b811-3052a2b014bc} CpuCheckNative 10.0 DynamicLibrary true v143 Unicode DynamicLibrary false v143 true Unicode DynamicLibrary true v143 Unicode DynamicLibrary false v143 true Unicode $(ProjectName) Level3 true WIN32;_DEBUG;CPUCHECKNATIVE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h Windows true false Level3 true true true WIN32;NDEBUG;CPUCHECKNATIVE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h Windows true true true false Level3 true _DEBUG;CPUCHECKNATIVE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h MultiThreaded Windows true false Level3 true true true NDEBUG;CPUCHECKNATIVE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use pch.h Windows true true true false Create Create Create Create ================================================ FILE: Flyby11-deprecated/CpuCheckNative/CpuCheckNative.vcxproj.filters ================================================  {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Headerdateien Headerdateien Headerdateien Quelldateien Quelldateien Quelldateien Ressourcendateien ================================================ FILE: Flyby11-deprecated/CpuCheckNative/PopcntCheck.cpp ================================================ #include "pch.h" #include extern "C" __declspec(dllexport) bool __cdecl HasPopcnt() { int cpuInfo[4] = { 0 }; // Get CPU info by calling __cpuid, which fills the cpuInfo array with CPU feature flags __cpuid(cpuInfo, 1); // Check if the processor supports SSE4.2 (bit 20 of the ECX register) bool hasSSE42 = (cpuInfo[2] & (1 << 20)) != 0; // Check if the processor supports POPCNT (bit 23 of the ECX register) bool hasPOPCNT = (cpuInfo[2] & (1 << 23)) != 0; // POPCNT is the critical instruction for Windows 11 upgrade compatibility!! // If both SSE4.2 and POPCNT are supported, yeah we can return true; otherwise, false return hasSSE42 && hasPOPCNT; } ================================================ FILE: Flyby11-deprecated/CpuCheckNative/dllmain.cpp ================================================ // dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. #include "pch.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } ================================================ FILE: Flyby11-deprecated/CpuCheckNative/framework.h ================================================ #pragma once #define WIN32_LEAN_AND_MEAN // Selten verwendete Komponenten aus Windows-Headern ausschließen // Windows-Headerdateien #include ================================================ FILE: Flyby11-deprecated/CpuCheckNative/pch.cpp ================================================ // pch.cpp: Quelldatei, die dem vorkompilierten Header entspricht #include "pch.h" // Bei der Verwendung vorkompilierter Header ist diese Quelldatei für eine erfolgreiche Kompilierung erforderlich. ================================================ FILE: Flyby11-deprecated/CpuCheckNative/pch.h ================================================ // pch.h: Dies ist eine vorkompilierte Headerdatei. // Die unten aufgeführten Dateien werden nur einmal kompiliert, um die Buildleistung für zukünftige Builds zu verbessern. // Dies wirkt sich auch auf die IntelliSense-Leistung aus, Codevervollständigung und viele Features zum Durchsuchen von Code eingeschlossen. // Die hier aufgeführten Dateien werden jedoch ALLE neu kompiliert, wenn mindestens eine davon zwischen den Builds aktualisiert wird. // Fügen Sie hier keine Dateien hinzu, die häufig aktualisiert werden sollen, da sich so der Leistungsvorteil ins Gegenteil verkehrt. #ifndef PCH_H #define PCH_H // Fügen Sie hier Header hinzu, die vorkompiliert werden sollen. #include "framework.h" #endif //PCH_H ================================================ FILE: Flyby11-deprecated/CpuCheckNative/resource.h ================================================ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by CpuCheckNative.rc // Nchste Standardwerte fr neue Objekte // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif ================================================ FILE: Flyby11-deprecated/Flyby11/App.config ================================================  ================================================ FILE: Flyby11-deprecated/Flyby11/CanIUpgradeView.Designer.cs ================================================ namespace Flyby11 { partial class CanIUpgradeView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.btnBack = new System.Windows.Forms.Button(); this.lblPtHdr = new System.Windows.Forms.Label(); this.lblPtAns = new System.Windows.Forms.Label(); this.lblPtHdr2 = new System.Windows.Forms.Label(); this.lblPtAns3 = new System.Windows.Forms.Label(); this.linkPtAns3 = new System.Windows.Forms.LinkLabel(); this.statusLabel = new System.Windows.Forms.Label(); this.lblPtAns4 = new System.Windows.Forms.Label(); this.btnWindowsUpdate = new System.Windows.Forms.Button(); this.linkPtAns2 = new System.Windows.Forms.LinkLabel(); this.lblPtAns2 = new System.Windows.Forms.Label(); this.btnPatch = new System.Windows.Forms.Button(); this.lblPtAns5 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // btnBack // this.btnBack.AutoSize = true; this.btnBack.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control; this.btnBack.FlatAppearance.BorderSize = 0; this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnBack.Font = new System.Drawing.Font("Segoe MDL2 Assets", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btnBack.ForeColor = System.Drawing.Color.DimGray; this.btnBack.Location = new System.Drawing.Point(0, 0); this.btnBack.Name = "btnBack"; this.btnBack.Size = new System.Drawing.Size(34, 29); this.btnBack.TabIndex = 232; this.btnBack.Text = "..."; this.btnBack.UseVisualStyleBackColor = true; this.btnBack.Click += new System.EventHandler(this.btnBack_Click); // // lblPtHdr // this.lblPtHdr.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblPtHdr.AutoEllipsis = true; this.lblPtHdr.Font = new System.Drawing.Font("Segoe UI Variable Text Semibold", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblPtHdr.ForeColor = System.Drawing.Color.Black; this.lblPtHdr.Location = new System.Drawing.Point(12, 55); this.lblPtHdr.Name = "lblPtHdr"; this.lblPtHdr.Size = new System.Drawing.Size(534, 17); this.lblPtHdr.TabIndex = 233; this.lblPtHdr.Text = "An existing Windows 10 device can be upgraded to Windows 11 if it meets the follo" + "wing criteria:"; // // lblPtAns // this.lblPtAns.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblPtAns.AutoEllipsis = true; this.lblPtAns.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblPtAns.Location = new System.Drawing.Point(33, 89); this.lblPtAns.Name = "lblPtAns"; this.lblPtAns.Size = new System.Drawing.Size(513, 36); this.lblPtAns.TabIndex = 234; this.lblPtAns.Text = "1. The device is running a currently supported version of Windows 10. If the devi" + "ce isn\'t currently running a supported version of Windows 10, upgrade to a suppo" + "rted version of Windows 10."; // // lblPtHdr2 // this.lblPtHdr2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblPtHdr2.AutoEllipsis = true; this.lblPtHdr2.Font = new System.Drawing.Font("Segoe UI Variable Text Semibold", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblPtHdr2.ForeColor = System.Drawing.Color.Black; this.lblPtHdr2.Location = new System.Drawing.Point(12, 161); this.lblPtHdr2.Name = "lblPtHdr2"; this.lblPtHdr2.Size = new System.Drawing.Size(534, 17); this.lblPtHdr2.TabIndex = 236; this.lblPtHdr2.Text = "To see if a Windows 10 device is eligible to upgrade to Windows 11, follow one of" + " these options:"; this.lblPtHdr2.Click += new System.EventHandler(this.lblPtHdr2_Click); // // lblPtAns3 // this.lblPtAns3.AutoEllipsis = true; this.lblPtAns3.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblPtAns3.Location = new System.Drawing.Point(33, 194); this.lblPtAns3.Name = "lblPtAns3"; this.lblPtAns3.Size = new System.Drawing.Size(135, 16); this.lblPtAns3.TabIndex = 237; this.lblPtAns3.Text = "1. Download and run the"; // // linkPtAns3 // this.linkPtAns3.ActiveLinkColor = System.Drawing.Color.RoyalBlue; this.linkPtAns3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.linkPtAns3.AutoEllipsis = true; this.linkPtAns3.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.linkPtAns3.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; this.linkPtAns3.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180))))); this.linkPtAns3.Location = new System.Drawing.Point(167, 194); this.linkPtAns3.Name = "linkPtAns3"; this.linkPtAns3.Size = new System.Drawing.Size(394, 16); this.linkPtAns3.TabIndex = 261; this.linkPtAns3.TabStop = true; this.linkPtAns3.Text = "WhyNotWin11 app to confirm your device meets the minimum system requirements"; this.linkPtAns3.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkPCHealthCheckApp_LinkClicked); // // statusLabel // this.statusLabel.AutoEllipsis = true; this.statusLabel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); this.statusLabel.Dock = System.Windows.Forms.DockStyle.Bottom; this.statusLabel.Font = new System.Drawing.Font("Segoe UI Variable Text Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.statusLabel.Location = new System.Drawing.Point(0, 552); this.statusLabel.Name = "statusLabel"; this.statusLabel.Size = new System.Drawing.Size(561, 33); this.statusLabel.TabIndex = 262; this.statusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // lblPtAns4 // this.lblPtAns4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblPtAns4.AutoEllipsis = true; this.lblPtAns4.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblPtAns4.Location = new System.Drawing.Point(33, 220); this.lblPtAns4.Name = "lblPtAns4"; this.lblPtAns4.Size = new System.Drawing.Size(523, 27); this.lblPtAns4.TabIndex = 263; this.lblPtAns4.Text = "2. Select the following Windows Update shortcut and then select the Check for upd" + "ates button:"; // // btnWindowsUpdate // this.btnWindowsUpdate.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180))))); this.btnWindowsUpdate.Cursor = System.Windows.Forms.Cursors.Hand; this.btnWindowsUpdate.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180))))); this.btnWindowsUpdate.FlatAppearance.BorderSize = 2; this.btnWindowsUpdate.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(160))))); this.btnWindowsUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnWindowsUpdate.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12.5F, System.Drawing.FontStyle.Bold); this.btnWindowsUpdate.ForeColor = System.Drawing.Color.White; this.btnWindowsUpdate.Location = new System.Drawing.Point(47, 249); this.btnWindowsUpdate.Name = "btnWindowsUpdate"; this.btnWindowsUpdate.Size = new System.Drawing.Size(161, 35); this.btnWindowsUpdate.TabIndex = 264; this.btnWindowsUpdate.TabStop = false; this.btnWindowsUpdate.Text = "Windows Update"; this.btnWindowsUpdate.UseCompatibleTextRendering = true; this.btnWindowsUpdate.UseVisualStyleBackColor = false; this.btnWindowsUpdate.Click += new System.EventHandler(this.btnWindowsUpdate_Click); // // linkPtAns2 // this.linkPtAns2.ActiveLinkColor = System.Drawing.Color.RoyalBlue; this.linkPtAns2.AutoEllipsis = true; this.linkPtAns2.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.linkPtAns2.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; this.linkPtAns2.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180))))); this.linkPtAns2.Location = new System.Drawing.Point(144, 134); this.linkPtAns2.Name = "linkPtAns2"; this.linkPtAns2.Size = new System.Drawing.Size(402, 16); this.linkPtAns2.TabIndex = 265; this.linkPtAns2.TabStop = true; this.linkPtAns2.Text = "the minimum hardware specifications to run Windows 11."; this.linkPtAns2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkHardwareSpecs_LinkClicked); // // lblPtAns2 // this.lblPtAns2.AutoEllipsis = true; this.lblPtAns2.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblPtAns2.Location = new System.Drawing.Point(34, 134); this.lblPtAns2.Name = "lblPtAns2"; this.lblPtAns2.Size = new System.Drawing.Size(111, 16); this.lblPtAns2.TabIndex = 266; this.lblPtAns2.Text = "2. The device meets"; // // btnPatch // this.btnPatch.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180))))); this.btnPatch.Cursor = System.Windows.Forms.Cursors.Hand; this.btnPatch.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180))))); this.btnPatch.FlatAppearance.BorderSize = 2; this.btnPatch.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(160))))); this.btnPatch.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnPatch.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12.5F, System.Drawing.FontStyle.Bold); this.btnPatch.ForeColor = System.Drawing.Color.White; this.btnPatch.Location = new System.Drawing.Point(47, 344); this.btnPatch.Name = "btnPatch"; this.btnPatch.Size = new System.Drawing.Size(161, 35); this.btnPatch.TabIndex = 267; this.btnPatch.TabStop = false; this.btnPatch.Text = "Patch Installation"; this.btnPatch.UseCompatibleTextRendering = true; this.btnPatch.UseVisualStyleBackColor = false; this.btnPatch.Click += new System.EventHandler(this.btnPatch_Click); // // lblPtAns5 // this.lblPtAns5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblPtAns5.AutoEllipsis = true; this.lblPtAns5.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblPtAns5.Location = new System.Drawing.Point(33, 288); this.lblPtAns5.Name = "lblPtAns5"; this.lblPtAns5.Size = new System.Drawing.Size(513, 40); this.lblPtAns5.TabIndex = 268; this.lblPtAns5.Text = "3. Your device does not meet the official requirements for Windows 11? You can ap" + "ply a compatibility patch to enable the Inplace Upgrade via Windows Update."; // // CanIUpgradeView // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); this.Controls.Add(this.lblPtAns5); this.Controls.Add(this.btnPatch); this.Controls.Add(this.lblPtAns2); this.Controls.Add(this.linkPtAns2); this.Controls.Add(this.btnWindowsUpdate); this.Controls.Add(this.lblPtAns4); this.Controls.Add(this.statusLabel); this.Controls.Add(this.linkPtAns3); this.Controls.Add(this.lblPtAns3); this.Controls.Add(this.lblPtHdr2); this.Controls.Add(this.lblPtAns); this.Controls.Add(this.lblPtHdr); this.Controls.Add(this.btnBack); this.Name = "CanIUpgradeView"; this.Size = new System.Drawing.Size(561, 585); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button btnBack; private System.Windows.Forms.Label lblPtHdr; private System.Windows.Forms.Label lblPtAns; private System.Windows.Forms.Label lblPtHdr2; private System.Windows.Forms.Label lblPtAns3; private System.Windows.Forms.LinkLabel linkPtAns3; private System.Windows.Forms.Label statusLabel; private System.Windows.Forms.Label lblPtAns4; private System.Windows.Forms.Button btnWindowsUpdate; private System.Windows.Forms.LinkLabel linkPtAns2; private System.Windows.Forms.Label lblPtAns2; private System.Windows.Forms.Button btnPatch; private System.Windows.Forms.Label lblPtAns5; } } ================================================ FILE: Flyby11-deprecated/Flyby11/CanIUpgradeView.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Security.Principal; using System.Windows.Forms; using Views; namespace Flyby11 { public partial class CanIUpgradeView : UserControl { private IsoHandler isoHandler; public CanIUpgradeView() { InitializeComponent(); isoHandler = new IsoHandler(UpdateStatusLabel); InitializeLocalizedStrings(); SetStyle(); } private void InitializeLocalizedStrings() { lblPtHdr.Text = Locales.Strings.ciuView_lblPtHdr; lblPtHdr2.Text = Locales.Strings.ciuView_lblPtHdr2; lblPtAns.Text = Locales.Strings.ciuView_lblPtAns; lblPtAns2.Text = Locales.Strings.ciuView_lblPtAns2; lblPtAns3.Text = Locales.Strings.ciuView_lblPtAns3; lblPtAns4.Text = Locales.Strings.ciuView_lblPtAns4; lblPtAns5.Text = Locales.Strings.ciuView_lblPtAns5; linkPtAns2.Text = Locales.Strings.ciuView_linkPtAns2; // PC Health Check app linkPtAns3.Text = Locales.Strings.ciuView_linkPtAns3; // Hardware requirements } private void SetStyle() { // Segoe MDL2 Assets btnBack.Text = "\uE72B"; } // Update the status label private void UpdateStatusLabel(string message) { statusLabel.Text = message; statusLabel.Refresh(); // Ensure the label updates in real-time } private void btnBack_Click(object sender, EventArgs e) { SwitchView.GoBack(this.Parent as Panel); } private async void linkPCHealthCheckApp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { string installAssistantUrl = "https://github.com/rcmaehl/WhyNotWin11/releases/download/2.6.1.1/WhyNotWin11.exe"; await isoHandler.DownloadMediaTool(installAssistantUrl, "WhyNotWin11.exe"); } private void linkHardwareSpecs_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start("https://www.microsoft.com/windows/windows-11-specifications?ocid=smc_marvel_ups_support_win11"); } private void btnWindowsUpdate_Click(object sender, EventArgs e) { try { // Open Windows Update settings Process.Start(new ProcessStartInfo { FileName = "ms-settings:windowsupdate", UseShellExecute = true }); // Trigger update check via PowerShell Process.Start(new ProcessStartInfo { FileName = "powershell.exe", Arguments = "-Command \"Start-WindowsUpdate -Confirm:$false\"", UseShellExecute = false, CreateNoWindow = true }); UpdateStatusLabel("Checking for updates..."); } catch (Exception ex) { UpdateStatusLabel($"Error starting Windows Update: {ex.Message}"); } } private void btnPatch_Click(object sender, EventArgs e) { // Check if the application is running with Administrator privileges if (!IsRunningAsAdministrator()) { // Request elevation (UAC prompt) and restart the application with admin rights UpdateStatusLabel("This application needs to be run as Administrator. Restarting as Administrator..."); RunAsAdministrator(); return; } UpdateStatusLabel("Checking patch status..."); // Check if the patch has already been applied if (IsPatchApplied()) { UpdateStatusLabel("Patch is already applied. No further action needed."); } else { // If patch not applied, attempt to apply the patch UpdateStatusLabel("Applying patch..."); if (ApplyPatch()) { UpdateStatusLabel("Patch applied successfully! You are ready for the upgrade."); } else { // UpdateStatusLabel("Failed to apply the patch. Please try again."); } } } // Helper method to check if the application is running as Administrator private bool IsRunningAsAdministrator() { var identity = System.Security.Principal.WindowsIdentity.GetCurrent(); var principal = new System.Security.Principal.WindowsPrincipal(identity); return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator); } // Helper method to restart the application with Administrator privileges private void RunAsAdministrator() { ProcessStartInfo processStartInfo = new ProcessStartInfo { FileName = Application.ExecutablePath, Verb = "runas" // This triggers the UAC prompt }; Process.Start(processStartInfo); Application.Exit(); // Exit the current application to prevent further execution } private bool IsPatchApplied() { try { using (Process process = new Process()) { process.StartInfo = new ProcessStartInfo { FileName = "cmd.exe", Arguments = "/c reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\HwReqChk\" /v HwReqChkVars", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; process.Start(); string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); if (!string.IsNullOrWhiteSpace(error)) { UpdateStatusLabel($"Registry query failed: {error}"); return false; } if (output.Contains("HwReqChkVars")) { UpdateStatusLabel("Patch is already applied."); return true; } UpdateStatusLabel("Patch is not applied."); return false; } } catch (Exception ex) { UpdateStatusLabel($"Error checking patch status: {ex.Message}"); return false; } } private bool ApplyPatch() { try { string[] commands = new[] { "reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\HwReqChk\" /f", "reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\HwReqChk\" /v HwReqChkVars /t REG_MULTI_SZ /d \"SQ_SecureBootCapable=TRUE\\0SQ_SecureBootEnabled=TRUE\\0SQ_TpmVersion=2\\0SQ_RamMB=8192\" /f", "reg delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\CompatMarkers\" /f", "reg delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Shared\" /f", "reg delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\TargetVersionUpgradeExperienceIndicators\" /f", "reg add \"HKLM\\SYSTEM\\Setup\\MoSetup\" /f /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1" }; List processes = new List(); foreach (string command in commands) { Process process = new Process(); process.StartInfo = new ProcessStartInfo { FileName = "cmd.exe", Arguments = $"/c {command}", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; process.Start(); processes.Add(process); } foreach (Process process in processes) { process.WaitForExit(); string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); if (!string.IsNullOrWhiteSpace(error)) { // UpdateStatusLabel($"Error applying patch: {error}"); return false; } if (!string.IsNullOrWhiteSpace(output)) { UpdateStatusLabel($"{output}"); } } UpdateStatusLabel("Patch applied successfully!"); return true; } catch (Exception ex) { UpdateStatusLabel($"Error applying patch: {ex.Message}"); return false; } } private void lblPtHdr2_Click(object sender, EventArgs e) { } } } ================================================ FILE: Flyby11-deprecated/Flyby11/CanIUpgradeView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyby11-deprecated/Flyby11/ClippyUI.Designer.cs ================================================ namespace Flyby11 { partial class ClippyUI { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.assetClippy = new System.Windows.Forms.PictureBox(); this.lblClosePane = new System.Windows.Forms.Label(); this.lblHelp = new System.Windows.Forms.Label(); this.tt = new System.Windows.Forms.ToolTip(this.components); ((System.ComponentModel.ISupportInitialize)(this.assetClippy)).BeginInit(); this.SuspendLayout(); // // assetClippy // this.assetClippy.Dock = System.Windows.Forms.DockStyle.Fill; this.assetClippy.Location = new System.Drawing.Point(0, 0); this.assetClippy.Name = "assetClippy"; this.assetClippy.Size = new System.Drawing.Size(163, 160); this.assetClippy.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.assetClippy.TabIndex = 0; this.assetClippy.TabStop = false; this.assetClippy.MouseDown += new System.Windows.Forms.MouseEventHandler(this.assetClippy_MouseDown); this.assetClippy.MouseMove += new System.Windows.Forms.MouseEventHandler(this.assetClippy_MouseMove); // // lblClosePane // this.lblClosePane.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.lblClosePane.AutoEllipsis = true; this.lblClosePane.AutoSize = true; this.lblClosePane.Cursor = System.Windows.Forms.Cursors.Hand; this.lblClosePane.Font = new System.Drawing.Font("Segoe MDL2 Assets", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblClosePane.ForeColor = System.Drawing.Color.DimGray; this.lblClosePane.Location = new System.Drawing.Point(137, 9); this.lblClosePane.Name = "lblClosePane"; this.lblClosePane.Size = new System.Drawing.Size(19, 13); this.lblClosePane.TabIndex = 4; this.lblClosePane.Text = "..."; this.lblClosePane.Click += new System.EventHandler(this.lblClosePane_Click); // // lblHelp // this.lblHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.lblHelp.AutoEllipsis = true; this.lblHelp.AutoSize = true; this.lblHelp.Cursor = System.Windows.Forms.Cursors.Hand; this.lblHelp.Font = new System.Drawing.Font("Segoe MDL2 Assets", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblHelp.ForeColor = System.Drawing.Color.DeepPink; this.lblHelp.Location = new System.Drawing.Point(112, 9); this.lblHelp.Name = "lblHelp"; this.lblHelp.Size = new System.Drawing.Size(19, 13); this.lblHelp.TabIndex = 5; this.lblHelp.Text = "..."; this.tt.SetToolTip(this.lblHelp, "Need more help?"); this.lblHelp.Click += new System.EventHandler(this.lblHelp_Click); // // tt // this.tt.IsBalloon = true; // // ClippyUI // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(163, 160); this.ControlBox = false; this.Controls.Add(this.lblHelp); this.Controls.Add(this.lblClosePane); this.Controls.Add(this.assetClippy); this.Name = "ClippyUI"; this.Opacity = 0.9D; this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; ((System.ComponentModel.ISupportInitialize)(this.assetClippy)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.PictureBox assetClippy; private System.Windows.Forms.Label lblClosePane; private System.Windows.Forms.Label lblHelp; private System.Windows.Forms.ToolTip tt; } } ================================================ FILE: Flyby11-deprecated/Flyby11/ClippyUI.cs ================================================ using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyby11 { public partial class ClippyUI : Form { private Point mouseDownLocation; private Logger logger; private MainForm mainForm; public ClippyUI(MainForm mainForm, Logger logger) { InitializeComponent(); this.mainForm = mainForm; this.logger = logger; // Initialize ClippyUI appearance and position InitializeFormAppearance(); } private void InitializeFormAppearance() { // Segoe MDL2 Assets lblClosePane.Text = "\uE8BB"; lblHelp.Text = "\uE897"; // Remove the form border this.FormBorderStyle = FormBorderStyle.None; // Take a screenshot of the desktop Bitmap desktopScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); using (Graphics g = Graphics.FromImage(desktopScreenshot)) { g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, desktopScreenshot.Size); } // Determine color of the pixel under form Point formLocation = this.PointToScreen(Point.Empty); Color desktopColor = desktopScreenshot.GetPixel(formLocation.X + this.Width / 2, formLocation.Y + this.Height / 2); // Set PictureBox properties assetClippy.Size = new Size(150, 150); // Make the form transparent this.BackColor = desktopColor; this.TransparencyKey = desktopColor; // Load default Clippy image string defaultImagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app", "clippy.png"); if (File.Exists(defaultImagePath)) { assetClippy.Image = Image.FromFile(defaultImagePath); } else { LoadRandomCharacter(); // fallback, no picture found } } public void SetClippyPosition(Form mainForm) { int margin = 10; // Get the working area of the screen Rectangle screenBounds = Screen.FromControl(mainForm).WorkingArea; // Calculate the position of the Clippy UI (right below the main form) int x = Math.Min(mainForm.Location.X + mainForm.Width + margin, screenBounds.Right - this.Width); int y = Math.Min(mainForm.Location.Y + mainForm.Height - this.Height, screenBounds.Bottom - this.Height); this.StartPosition = FormStartPosition.Manual; this.Location = new Point(x, y); } private void LoadRandomCharacter() { string directoryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app\\assets"); string[] searchPatterns = { "clippy*.png", "clippy*.gif" }; List matchingFiles = new List(); foreach (string pattern in searchPatterns) { string[] files = Directory.GetFiles(directoryPath, pattern); matchingFiles.AddRange(files); } if (matchingFiles.Count > 0) { Random random = new Random(); int randomIndex = random.Next(0, matchingFiles.Count); string randomClippyImagePath = matchingFiles[randomIndex]; assetClippy.Image = Image.FromFile(randomClippyImagePath); } else { MessageBox.Show("Oops! I can't work if I'm invisible. Please make sure Clippy is in the right place!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void assetClippy_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownLocation = e.Location; } } // EventHandler for the MouseMove event of the Clippy image private void assetClippy_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { // Update position of the SetupForm based on the movement of the Clippy image this.Left += e.X - mouseDownLocation.X; this.Top += e.Y - mouseDownLocation.Y; // Update position of the MainForm relative to the new position of the SetupForm mainForm.Left += e.X - mouseDownLocation.X; mainForm.Top += e.Y - mouseDownLocation.Y; } } private async void lblClosePane_Click(object sender, EventArgs e) { logger.Log("Looks like you're giving me the boot! No hard feelings—I'll be here if you need me again.", Color.DeepPink); await Task.Delay(1000); // Hide Clippy this.Hide(); } private void lblHelp_Click(object sender, EventArgs e) { mainForm._faqHandler.AddNextFAQStep(); } } } ================================================ FILE: Flyby11-deprecated/Flyby11/ClippyUI.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 17, 17 ================================================ FILE: Flyby11-deprecated/Flyby11/CompatibilityForm.Designer.cs ================================================ namespace Flyby11 { partial class CompatibilityForm { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.SuspendLayout(); // // CompatibilityForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.ClientSize = new System.Drawing.Size(530, 304); this.Name = "CompatibilityForm"; this.ShowIcon = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.ResumeLayout(false); } #endregion } } ================================================ FILE: Flyby11-deprecated/Flyby11/CompatibilityForm.cs ================================================ using System; using System.Drawing; using System.Windows.Forms; namespace Flyby11 { public partial class CompatibilityForm : Form { public CompatibilityForm(bool hasPopcnt, bool hasSse42) { InitializeComponent(); InitLayout(hasPopcnt, hasSse42); } private void InitLayout(bool hasPopcnt, bool hasSse42) { this.Text = "Flyby11 - Windows 11 Compatibility Check via CpuCheckNative.dll"; this.StartPosition = FormStartPosition.CenterScreen; this.Font = new Font("Segoe UI", 10); // icon font for check marks var iconFont = new Font("Segoe MDL2 Assets", 18); // Label for CPU POPCNT Support var lblPopcnt = new Label { Text = "CPU POPCNT:", Location = new Point(30, 30), AutoSize = true }; var iconPopcnt = new Label { Text = hasPopcnt ? "\uE73D" : "\uE10A", // ✔ or ❌ Font = iconFont, ForeColor = hasPopcnt ? Color.ForestGreen : Color.Crimson, Location = new Point(280, 30), AutoSize = true }; // Label for SSE4.2 Support var lblSse42 = new Label { Text = "SSE4.2:", Location = new Point(30, 70), AutoSize = true }; var iconSse42 = new Label { Text = hasSse42 ? "\uE73D" : "\uE10A", Font = iconFont, ForeColor = hasSse42 ? Color.ForestGreen : Color.Crimson, Location = new Point(280, 70), AutoSize = true }; // Label for Upgrade Probability var lblProb = new Label { Text = "Upgrade Probability:", Location = new Point(30, 120), AutoSize = true, Font = new Font("Segoe UI", 10, FontStyle.Bold) }; var result = new Label { Text = (hasPopcnt && hasSse42) ? "Very High" : "Low", Location = new Point(250, 120), ForeColor = (hasPopcnt && hasSse42) ? Color.ForestGreen : Color.Crimson, AutoSize = true }; // Adding the info about upgrade status var infoLabel = new Label { Text = "Note: If both POPCNT and SSE4.2 are supported, your upgrade chances are very high.\n" + "Otherwise, you may face issues while upgrading.", Location = new Point(30, 160), AutoSize = true, Font = new Font("Segoe UI", 9, FontStyle.Italic), ForeColor = Color.Gray }; // additional info var additionalInfoLabel = new Label { Text = "This app successfully helped upgrade over half a million PCs to Windows 11!\n" + "Fewer e-waste, lower costs, and no need for a new setup. " + "Stay updated. Best wishes, Belim. ", Dock = DockStyle.Bottom, AutoSize = true, Font = new Font("Segoe UI", 9, FontStyle.Italic), ForeColor = Color.DimGray }; // W10 support-end countdown var supportEndDate = new DateTime(2025, 10, 14); var daysLeft = (supportEndDate - DateTime.Today).Days; var countdownLabel = new Label { Text = $"⚠️ Windows 10 support ends in {daysLeft} days – on October 14, 2025!", Dock = DockStyle.Bottom, AutoSize = true, Font = new Font("Segoe UI", 9.5f, FontStyle.Bold), ForeColor = Color.Red, }; // Button Upgrade var upgradeButton = new Button { Text = "Start Upgrade Now!", Dock = DockStyle.Bottom, AutoSize = true, Size = new Size(180, 40), BackColor = Color.ForestGreen, ForeColor = Color.White, Font = new Font("Segoe UI", 12, FontStyle.Bold), FlatStyle = FlatStyle.Flat }; upgradeButton.FlatAppearance.BorderSize = 0; upgradeButton.Click += UpgradeButton_Click; this.Controls.Add(lblPopcnt); this.Controls.Add(iconPopcnt); this.Controls.Add(lblSse42); this.Controls.Add(iconSse42); this.Controls.Add(lblProb); this.Controls.Add(result); this.Controls.Add(infoLabel); this.Controls.Add(upgradeButton); this.Controls.Add(countdownLabel); // this.Controls.Add(additionalInfoLabel); } private void UpgradeButton_Click(object sender, EventArgs e) { //MessageBox.Show("You are good to go! Proceeding with the upgrade...", "Upgrade Started", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } } } ================================================ FILE: Flyby11-deprecated/Flyby11/CompatibilityForm.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyby11-deprecated/Flyby11/FAQHandler.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Net; using System.Windows.Forms; namespace Flyby11 { public class FAQHandler { // Reference to the panel that will display the FAQ private readonly Panel _faqPanel; // Delegate to update the app's status label (from main form) private readonly Action _updateStatus; private FlowLayoutPanel _faqContentPanel; // List of individual FAQ entry steps private readonly List> _faqSteps = new List>(); private int _currentFaqStep = 0; public FAQHandler(Panel faqPanel, Action updateStatus) { _faqPanel = faqPanel; _updateStatus = updateStatus; } // Initializes the FAQ view with basic content only public void InitializeFAQ() { _faqPanel.AutoScroll = true; _faqPanel.Controls.Clear(); _faqContentPanel = new FlowLayoutPanel { Dock = DockStyle.Fill, AutoScroll = true, Padding = new Padding(10), FlowDirection = FlowDirection.TopDown, WrapContents = false }; // Add static FAQ content (header, ISO info, etc.) AddTitle(_faqContentPanel); AddISOFAQ(_faqContentPanel); _faqPanel.Controls.Add(_faqContentPanel); PrepareOtherFAQSteps(); // Prepare additional entries without adding them yet AddNextFAQStep(); // Show second FAQ entry , Donate } // Adds the next FAQ item from the list public void AddNextFAQStep() { if (_currentFaqStep < _faqSteps.Count) { _faqSteps[_currentFaqStep](_faqContentPanel); _currentFaqStep++; // Scroll to the newly added element var last = _faqContentPanel.Controls[_faqContentPanel.Controls.Count - 1]; _faqContentPanel.ScrollControlIntoView(last); // Add some space below the last element var m = last.Margin; last.Margin = new Padding(m.Left, m.Top, m.Right, 20); } else { _updateStatus("Well, it looks like I've done all I can here. If you need more help, you might want to reach out to the developer, Belim."); } } // Fill list with FAQ methods – each step adds one block of content private void PrepareOtherFAQSteps() { _faqSteps.Clear(); _currentFaqStep = 0; _faqSteps.Add(AddFaq2); _faqSteps.Add(AddFaq3); _faqSteps.Add(AddFaq4); _faqSteps.Add(AddFaq5); _faqSteps.Add(AddFaq6); _faqSteps.Add(AddFaq7); } // Adds the title section private void AddTitle(FlowLayoutPanel parent) { AddLabel(parent, Locales.Strings.faq_header, new Font("Segoe UI Variable Display", 10.5f, FontStyle.Bold), DockStyle.Top, ContentAlignment.MiddleCenter, 11); } // Adds the ISO download information (Q1/A1) private void AddISOFAQ(FlowLayoutPanel parent) { AddLabel(parent, Locales.Strings.faq_q1, new Font("Segoe UI Variable Display", 10.5f, FontStyle.Bold), ContentAlignment.TopLeft, 11); AddLabel(parent, Locales.Strings.faq_a1, new Font("Segoe UI Variable Display", 11), ContentAlignment.TopLeft, 11); var downloadOptions = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Font = new Font("Segoe UI Variable Display", 10.5f), Width = 300, Padding = new Padding(5) }; downloadOptions.Items.Add("Select Download Source"); // Add default placeholder item downloadOptions.Items.Add(Locales.Strings.faq_downloadMS); // Index 1 downloadOptions.Items.Add(Locales.Strings.faq_downloadFido); // Index 2 downloadOptions.Items.Add("Media Creation Tool (Beginner-Friendly)"); // Index 3 downloadOptions.SelectedIndex = 0; // Set default selection downloadOptions.SelectedIndexChanged += (s, e) => { switch (downloadOptions.SelectedIndex) { case 1: // Open Microsoft ISO download page Process.Start("https://www.microsoft.com/software-download/windows11"); break; case 2: // Download and run Fido script DownloadAndRunFidoScript("https://raw.githubusercontent.com/pbatard/Fido/refs/heads/master/Fido.ps1"); break; case 3: // Handle Media Creation Tool download process HandleMediaCreationToolDownload(); break; } }; parent.Controls.Add(downloadOptions); /// /// Downloads and executes the Fido PowerShell script. /// void DownloadAndRunFidoScript(string scriptUrl) { string tempScriptPath = Path.Combine(Path.GetTempPath(), "Fido.ps1"); using (var client = new WebClient()) { try { client.DownloadFile(scriptUrl, tempScriptPath); _updateStatus("Fido script downloaded successfully. Running it now..."); Process.Start(new ProcessStartInfo { FileName = "powershell.exe", Arguments = $"-ExecutionPolicy Bypass -File \"{tempScriptPath}\"", Verb = "runas", CreateNoWindow = true, UseShellExecute = true }); } catch (Exception ex) { _updateStatus("Error downloading or running Fido: " + ex.Message); } } } /// /// Handles download, optional tutorial, and execution of the Media Creation Tool. /// void HandleMediaCreationToolDownload() { var infoResult = MessageBox.Show( "With the Media Creation Tool, you can either upgrade your PC or create an ISO file.\n\nImportant: In the step 'Choose which media to use', make sure to select 'ISO file'.\n\nIf you're unsure, would you like to watch a recommended YouTube tutorial on how to do this?", "Media Creation Tool Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (infoResult == DialogResult.Yes) { Process.Start("https://www.youtube.com/watch?v=dNl1FHajW9w"); } using (var saveDialog = new SaveFileDialog()) { saveDialog.Title = "Save Media Creation Tool"; saveDialog.Filter = "Executable|*.exe"; saveDialog.FileName = "MediaCreationTool.exe"; if (saveDialog.ShowDialog() == DialogResult.OK) { using (var client = new WebClient()) { try { client.DownloadFile("https://go.microsoft.com/fwlink/?linkid=2156295", saveDialog.FileName); MessageBox.Show("Media Creation Tool downloaded successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); var runResult = MessageBox.Show("Do you want to run the Media Creation Tool now?", "Run Tool", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (runResult == DialogResult.Yes) { Process.Start(saveDialog.FileName); } } catch (Exception ex) { MessageBox.Show("Error downloading the Media Creation Tool: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } } } // Adds any generic label to the flow panel private void AddLabel(FlowLayoutPanel parent, string text, Font font, ContentAlignment alignment, int padding = 0) { var label = new Label { Text = text, Font = font, Padding = new Padding(padding), TextAlign = alignment, AutoSize = true, UseCompatibleTextRendering = true }; parent.Controls.Add(label); } // Overload for labels with DockStyle private void AddLabel(FlowLayoutPanel parent, string text, Font font, DockStyle dock, ContentAlignment alignment, int padding = 0) { var label = new Label { Text = text, Font = font, Padding = new Padding(padding), Dock = dock, TextAlign = alignment, AutoSize = true, UseCompatibleTextRendering = true, }; parent.Controls.Add(label); } // Adds FAQ entry with question + answer + link private void AddFAQItem(FlowLayoutPanel parent, string question, string answer, string linkText, string linkUrl) { AddLabel(parent, question, new Font("Segoe UI Variable Display", 10.5f, FontStyle.Bold), ContentAlignment.TopLeft, 11); AddLabel(parent, answer, new Font("Segoe UI Variable Display", 11), ContentAlignment.TopLeft, 11); var linkLabel = new LinkLabel { Text = linkText, Font = new Font("Segoe UI Variable Display", 10.5f, FontStyle.Underline), LinkColor = Color.Blue, AutoSize = true, Padding = new Padding(10), TextAlign = ContentAlignment.TopLeft, UseCompatibleTextRendering = true, }; linkLabel.LinkClicked += (sender, e) => Process.Start(linkUrl); parent.Controls.Add(linkLabel); } // -- Individual FAQ entries -- // Donation private void AddFaq2(FlowLayoutPanel panel) { var donateContainer = new FlowLayoutPanel { FlowDirection = FlowDirection.TopDown, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, BackColor = Color.FromArgb(255, 182, 193), Padding = new Padding(10), Margin = new Padding(0, 10, 0, 10), WrapContents = false }; var qLabel = new Label { Text = Locales.Strings.faq_q2, Font = new Font("Comic Sans MS", 11.5f, FontStyle.Bold), AutoSize = true, Padding = new Padding(0, 0, 0, 5), UseCompatibleTextRendering = true }; var aLabel = new Label { Text = Locales.Strings.faq_a2, Font = new Font("Segoe UI Variable Display", 11), AutoSize = true, Padding = new Padding(0, 0, 0, 5), UseCompatibleTextRendering = true }; var donateLink = new LinkLabel { Text = Locales.Strings.faq_a2Link, Font = new Font("Comic Sans MS", 10.5f, FontStyle.Underline), LinkColor = Color.MediumBlue, AutoSize = true, UseCompatibleTextRendering = true }; donateLink.LinkClicked += (sender, e) => Process.Start("https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG"); donateContainer.Controls.Add(qLabel); donateContainer.Controls.Add(aLabel); donateContainer.Controls.Add(donateLink); // Add to parent panel panel.Controls.Add(donateContainer); } private void AddFaq3(FlowLayoutPanel panel) { AddLabel(panel, Locales.Strings.faq_q3, new Font("Segoe UI Variable Display", 10.5f, FontStyle.Bold), ContentAlignment.TopLeft, 11); AddLabel(panel, Locales.Strings.faq_a3, new Font("Segoe UI Variable Display", 11), ContentAlignment.TopLeft, 11); } private void AddFaq4(FlowLayoutPanel panel) { AddLabel(panel, Locales.Strings.faq_q4, new Font("Segoe UI Variable Display", 10.5f, FontStyle.Bold), ContentAlignment.TopLeft, 11); AddLabel(panel, Locales.Strings.faq_a4, new Font("Segoe UI Variable Display", 11), ContentAlignment.TopLeft, 11); } private void AddFaq5(FlowLayoutPanel panel) { AddLabel(panel, Locales.Strings.faq_q5, new Font("Segoe UI Variable Display", 10.5f, FontStyle.Bold), ContentAlignment.TopLeft, 11); AddLabel(panel, Locales.Strings.faq_a5, new Font("Segoe UI Variable Display", 11), ContentAlignment.TopLeft, 11); } private void AddFaq6(FlowLayoutPanel panel) { AddLabel(panel, Locales.Strings.faq_q6, new Font("Segoe UI Variable Display", 10.5f, FontStyle.Bold), ContentAlignment.TopLeft, 11); AddLabel(panel, Locales.Strings.faq_a6, new Font("Segoe UI Variable Display", 11), ContentAlignment.TopLeft, 11); } private void AddFaq7(FlowLayoutPanel panel) { AddFAQItem(panel, Locales.Strings.faq_q7, Locales.Strings.faq_a7, Locales.Strings.faq_a7Link, "https://github.com/BuiltByBel"); } } } ================================================ FILE: Flyby11-deprecated/Flyby11/Flyby11.csproj ================================================ Debug AnyCPU {503AF34B-7544-4C43-A099-2B948C3FF49A} WinExe Flyby11 Flyby11 v4.8 512 true true publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true x64 true full false bin\Debug\ DEBUG;TRACE prompt 4 AnyCPU pdbonly true bin\Release\ TRACE prompt 4 app.manifest AppIcon.ico UserControl CanIUpgradeView.cs Form ClippyUI.cs Form CompatibilityForm.cs True True Strings.resx Form MainForm.cs Form ProblemsForm.cs True True Resources.resx CanIUpgradeView.cs ClippyUI.cs CompatibilityForm.cs MainForm.cs PublicResXFileCodeGenerator Designer Strings.Designer.cs ProblemsForm.cs Designer PublicResXFileCodeGenerator Resources.Designer.cs SettingsSingleFileGenerator Settings.Designer.cs True Settings.settings True False Microsoft .NET Framework 4.8 %28x86 und x64%29 true False .NET Framework 3.5 SP1 false ================================================ FILE: Flyby11-deprecated/Flyby11/IsoHandler.cs ================================================ using System; using System.Diagnostics; using System.IO; using System.Net.Http; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyby11 { public class IsoHandler { private static readonly HttpClient httpClient = new HttpClient(); private readonly Action _updateStatus; public IsoHandler(Action updateStatus) { _updateStatus = updateStatus; } public async Task HandleIso(string isoPath, bool experimentalEnabled) { try { // Block Win10 ISOs string isoFileName = Path.GetFileName(isoPath); if (Regex.IsMatch(isoFileName, @"(?i)(win10|windows\s*10)")) { _updateStatus("Error: Windows 10 ISOs are not supported."); MessageBox.Show("Windows 10 ISOs are not supported. Please use a Windows 11 ISO.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _updateStatus(Locales.Strings._debugStatusMounting); //Mounting the ISO... Hang tight! // Ensure the ISO path is properly quoted string quotedIsoPath = $"\"{isoPath}\""; // Pass the quoted path to ExecutePowerShellCommand string driveLetter = await MountIsoAndGetDriveLetter(isoPath); if (string.IsNullOrEmpty(driveLetter)) { _updateStatus(Locales.Strings._debugStatusMountingFailed); //Failed to mount the ISO. Please try again. MessageBox.Show(Locales.Strings._debugStatusMountingFailed, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _updateStatus(Locales.Strings._debugStatusMountingSuccess); //ISO mounted successfully! Let's get this Windows 11 ready! string setupPath = Path.Combine(driveLetter, "sources", "setupprep.exe"); if (File.Exists(setupPath)) { await RunSetupWithAdminRights(setupPath, experimentalEnabled); } else { _updateStatus($"{Locales.Strings._debugStatusSetupFileNotFound} {driveLetter}. Aborting."); // Setup file not found in MessageBox.Show($"{Locales.Strings._debugStatusSetupFileNotFound} {driveLetter}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception ex) { _updateStatus($"{Locales.Strings._debugStatusHandleIsoEx} {ex.Message}"); //Oops! Something went wrong: MessageBox.Show($"Error: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private async Task MountIsoAndGetDriveLetter(string isoPath) { try { _updateStatus("Mounting ISO..."); // PowerShell script to mount ISO and get the assigned drive letter string script = $@" $iso = Mount-DiskImage -ImagePath '{isoPath}' -PassThru $volumes = Get-Volume -DiskImage $iso $volumes.DriveLetter "; using (var process = new Process()) { process.StartInfo.FileName = "powershell.exe"; process.StartInfo.Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"{script}\""; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.Start(); string output = await process.StandardOutput.ReadToEndAsync(); string error = await process.StandardError.ReadToEndAsync(); await process.WaitForExitAsync(); if (!string.IsNullOrWhiteSpace(error)) { _updateStatus("PowerShell error during mount: " + error); return null; } string driveLetter = output.Trim(); if (!string.IsNullOrWhiteSpace(driveLetter)) { _updateStatus($"ISO mounted successfully at {driveLetter}:\\"); return $"{driveLetter}:\\"; } else { _updateStatus("Failed to retrieve drive letter after mounting ISO."); return null; } } } catch (Exception ex) { _updateStatus("Exception during mounting: " + ex.Message); return null; } } private async Task RunSetupWithAdminRights(string setupPath, bool experimentalEnabled) { try { _updateStatus(Locales.Strings._debugInstallRunElevated); //Starting the setup process with elevated privileges... // Default argument string arguments = "/Product Server"; // If experimental mode is enabled, append additional setup parameters if (experimentalEnabled) { arguments += " /Compat IgnoreWarning /MigrateDrivers All"; } var startInfo = new ProcessStartInfo { FileName = "powershell.exe", Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"Start-Process '{setupPath}' -ArgumentList '{arguments}' -Verb runas\"", Verb = "runas", UseShellExecute = true, CreateNoWindow = false }; _updateStatus(Locales.Strings._debugStatusRunning); //Almost there! We're getting the setup ready... using (var process = Process.Start(startInfo)) { if (process != null) { await process.WaitForExitAsync(); } } // Final status message string finalStatus = Locales.Strings._debugInstallReady; if (experimentalEnabled) { finalStatus += " (Advanced mode enabled: Compatibility checks bypassed)"; } _updateStatus(finalStatus); //Windows 11 installation can now proceed. Please follow the instructions in the setup window. MessageBox.Show(Locales.Strings.msg_InstallReady, "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { _updateStatus($"Error: {ex.Message}"); MessageBox.Show($"Error: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// /// Create unattend.xml file in the sources\$OEM$\$$\Panther directory /// /// The USB drive where the unattend.xml will be created. public void CreateUnattendXml(string usbDrive) { string unattendDir = Path.Combine(usbDrive, "sources", "$OEM$", "$$", "Panther"); Directory.CreateDirectory(unattendDir); // Create the directory if it doesn't exist string unattendPath = Path.Combine(unattendDir, "unattend.xml"); // Check if the file already exists if (!File.Exists(unattendPath)) { // Create the unattend.xml content string xmlContent = @" 1 reg add HKLM\SYSTEM\Setup\LabConfig /v BypassTPMCheck /t REG_DWORD /d 1 /f 2 reg add HKLM\SYSTEM\Setup\LabConfig /v BypassSecureBootCheck /t REG_DWORD /d 1 /f 3 reg add HKLM\SYSTEM\Setup\LabConfig /v BypassRAMCheck /t REG_DWORD /d 1 /f 1 reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE /v BypassNRO /t REG_DWORD /d 1 /f "; File.WriteAllText(unattendPath, xmlContent); _updateStatus("Created unattend.xml in the sources\\$OEM$\\$$\\Panther directory."); } else { _updateStatus("unattend.xml already exists in the sources\\$OEM$\\$$\\Panther directory."); // Display a message box to inform the user MessageBox.Show("The patch has already been applied. The 'unattend.xml' file already exists in the specified directory.", "Patch Already Applied", MessageBoxButtons.OK, MessageBoxIcon.Information); } } /// /// Downloads a specified tool (Media Creation Tool or Installation Assistant) from a provided URL. /// /// The URL of the tool to download. /// The name of the file to save. /// A task representing the asynchronous operation. public async Task DownloadMediaTool(string downloadUrl, string fileName) { using (SaveFileDialog saveFileDialog = new SaveFileDialog()) { saveFileDialog.Filter = "Executable Files (*.exe)|*.exe"; saveFileDialog.Title = $"Save {fileName}"; saveFileDialog.FileName = fileName; if (saveFileDialog.ShowDialog() == DialogResult.OK) { string destinationPath = saveFileDialog.FileName; try { _updateStatus($"Preparing to download {fileName}..."); _updateStatus("Download may take some time, please wait..."); var response = await httpClient.GetAsync(downloadUrl); response.EnsureSuccessStatusCode(); using (var fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None)) { await response.Content.CopyToAsync(fileStream); } _updateStatus($"{fileName} download completed successfully!"); // Start the downloaded tool _updateStatus($"Starting {fileName}..."); Process.Start(new ProcessStartInfo { FileName = destinationPath, UseShellExecute = true // To run .exe files }); } catch (Exception ex) { _updateStatus($"An error occurred while downloading {fileName}: {ex.Message}"); } } else { _updateStatus($"{fileName} download canceled by user."); } } } } public static class ProcessExtensions { public static async Task WaitForExitAsync(this Process process) { var tcs = new TaskCompletionSource(); process.EnableRaisingEvents = true; process.Exited += (sender, args) => tcs.TrySetResult(true); await tcs.Task; } } } ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.Designer.cs ================================================ //------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. // Laufzeitversion:4.0.30319.42000 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. // //------------------------------------------------------------------------------ namespace Flyby11.Locales { using System; /// /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. /// // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Strings { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Strings() { } /// /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Flyby11.Locales.Strings", typeof(Strings).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Sucht eine lokalisierte Zeichenfolge, die You're ready to install Windows 11 on unsupported hardware! Ignore the 'Windows Server' prompt; you're all set! ähnelt. /// public static string _debugInstallReady { get { return ResourceManager.GetString("_debugInstallReady", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Starting the setup process with elevated privileges... ähnelt. /// public static string _debugInstallRunElevated { get { return ResourceManager.GetString("_debugInstallRunElevated", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Oops! Something went wrong: ähnelt. /// public static string _debugStatusHandleIsoEx { get { return ResourceManager.GetString("_debugStatusHandleIsoEx", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Mounting the ISO... Hang tight! ähnelt. /// public static string _debugStatusMounting { get { return ResourceManager.GetString("_debugStatusMounting", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Failed to mount the ISO. Please try again. ähnelt. /// public static string _debugStatusMountingFailed { get { return ResourceManager.GetString("_debugStatusMountingFailed", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die ISO mounted successfully! Let's get this Windows 11 ready! ähnelt. /// public static string _debugStatusMountingSuccess { get { return ResourceManager.GetString("_debugStatusMountingSuccess", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Almost there! We're getting the setup ready... ähnelt. /// public static string _debugStatusRunning { get { return ResourceManager.GetString("_debugStatusRunning", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Setup file not found in ähnelt. /// public static string _debugStatusSetupFileNotFound { get { return ResourceManager.GetString("_debugStatusSetupFileNotFound", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die 1. The device is running a currently supported version of Windows 10. If the device isn't currently running a supported version of Windows 10, upgrade to a supported version of Windows 10. ähnelt. /// public static string ciuView_lblPtAns { get { return ResourceManager.GetString("ciuView_lblPtAns", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die 2. The device meets ähnelt. /// public static string ciuView_lblPtAns2 { get { return ResourceManager.GetString("ciuView_lblPtAns2", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die 1. Download and run the ähnelt. /// public static string ciuView_lblPtAns3 { get { return ResourceManager.GetString("ciuView_lblPtAns3", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die 2. Select the following Windows Update shortcut and then select the Check for updates button: ähnelt. /// public static string ciuView_lblPtAns4 { get { return ResourceManager.GetString("ciuView_lblPtAns4", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die 3. Your device does not meet the official requirements for Windows 11? You can apply a compatibility patch to enable the Inplace Upgrade via Windows Update. ähnelt. /// public static string ciuView_lblPtAns5 { get { return ResourceManager.GetString("ciuView_lblPtAns5", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die An existing Windows 10 device can be upgraded to Windows 11 if it meets the following criteria: ähnelt. /// public static string ciuView_lblPtHdr { get { return ResourceManager.GetString("ciuView_lblPtHdr", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die To see if a Windows 10 device is eligible to upgrade to Windows 11, follow one of these options: ähnelt. /// public static string ciuView_lblPtHdr2 { get { return ResourceManager.GetString("ciuView_lblPtHdr2", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die the minimum hardware specifications to run Windows 11. ähnelt. /// public static string ciuView_linkPtAns2 { get { return ResourceManager.GetString("ciuView_linkPtAns2", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die WhyNotWin11 app to confirm your device meets the minimum system requirements ähnelt. /// public static string ciuView_linkPtAns3 { get { return ResourceManager.GetString("ciuView_linkPtAns3", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Bypass patch canceled by user. ähnelt. /// public static string compPatch_debugCancel { get { return ResourceManager.GetString("compPatch_debugCancel", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die User attempted to select a non-removable drive. ähnelt. /// public static string compPatch_debugNotRemovableDrive { get { return ResourceManager.GetString("compPatch_debugNotRemovableDrive", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die No USB drive selected for patching. ähnelt. /// public static string compPatch_debugNoUSBDrive { get { return ResourceManager.GetString("compPatch_debugNoUSBDrive", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Failed to apply bypass patch: ähnelt. /// public static string compPatch_msgFailedEx { get { return ResourceManager.GetString("compPatch_msgFailedEx", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die The selected path is not a removable drive. Please select a USB drive. ähnelt. /// public static string compPatch_msgNotRemovableDrive { get { return ResourceManager.GetString("compPatch_msgNotRemovableDrive", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Select the USB drive containing your Windows 11 installation files.\nThis feature adds a compatibility patch to bypass certain system requirements.\nCompatible with drives prepared by any tool, including Rufus. Ensure the drive is ready! ähnelt. /// public static string compPatch_msgSelectDrive { get { return ResourceManager.GetString("compPatch_msgSelectDrive", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die This will apply compatibility bypass settings on the selected USB drive. Continue? ähnelt. /// public static string compPatch_msgSelectDriveConfirm { get { return ResourceManager.GetString("compPatch_msgSelectDriveConfirm", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Bypass patch applied successfully! ähnelt. /// public static string compPatch_msgSuccess { get { return ResourceManager.GetString("compPatch_msgSuccess", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Flyby11 Upgrading Assistant ähnelt. /// public static string ctl_FormTitle { get { return ResourceManager.GetString("ctl_FormTitle", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Apply Compatibility Patch to ISO (Clean Install) ähnelt. /// public static string ctl_inkCompPatch { get { return ResourceManager.GetString("ctl_inkCompPatch", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Can I upgrade to Windows 11? ähnelt. /// public static string ctl_linkCiuv { get { return ResourceManager.GetString("ctl_linkCiuv", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Select from computer ähnelt. /// public static string ctl_linkSelectComputer { get { return ResourceManager.GetString("ctl_linkSelectComputer", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Did the upgrade work? ähnelt. /// public static string ctl_linkVote { get { return ResourceManager.GetString("ctl_linkVote", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Drag and drop the Windows 11 ISO to patch it and install on unsupported hardware (Inplace Upgrade). ähnelt. /// public static string ctl_statusLabel { get { return ResourceManager.GetString("ctl_statusLabel", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die A: You can download the latest ISO from the official Microsoft website or use the Fido Downloader. ähnelt. /// public static string faq_a1 { get { return ResourceManager.GetString("faq_a1", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die A: If you've successfully installed Windows 11 and saved some money, feel free to leave a little something as a thank-you here. ähnelt. /// public static string faq_a2 { get { return ResourceManager.GetString("faq_a2", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Click here to donate and show your support. ähnelt. /// public static string faq_a2Link { get { return ResourceManager.GetString("faq_a2Link", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die A: Once the ISO is mounted, the setup process runs in the background. The Windows installer starts, guiding you through the steps required to install Windows 11 on your machine. ähnelt. /// public static string faq_a3 { get { return ResourceManager.GetString("faq_a3", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die A: Please check the error messages and report it on GitHub. ähnelt. /// public static string faq_a4 { get { return ResourceManager.GetString("faq_a4", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die A: Yes, Microsoft has left a backdoor open. This method leverages a feature of the Windows 11 setup process that uses the Windows Server variant of the installation. Unlike the regular Windows 11 setup, this variant skips most hardware compatibility checks. ähnelt. /// public static string faq_a5 { get { return ResourceManager.GetString("faq_a5", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die A: According to Microsoft, you should throw your PC away. I would suggest installing Linux on it and moving away from Windows. ähnelt. /// public static string faq_a6 { get { return ResourceManager.GetString("faq_a6", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die A: The developer is Belim, also known as Builtbybel, who has contributed a lot of code to the Windows community. ähnelt. /// public static string faq_a7 { get { return ResourceManager.GetString("faq_a7", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Click here to learn more about the developer's work. ähnelt. /// public static string faq_a7Link { get { return ResourceManager.GetString("faq_a7Link", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Download via Fido (Recommended) ähnelt. /// public static string faq_downloadFido { get { return ResourceManager.GetString("faq_downloadFido", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Microsoft Site ähnelt. /// public static string faq_downloadMS { get { return ResourceManager.GetString("faq_downloadMS", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Frequently Asked Questions (FAQ) ähnelt. /// public static string faq_header { get { return ResourceManager.GetString("faq_header", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Q: Where can I get the latest Windows 11 ISO? ähnelt. /// public static string faq_q1 { get { return ResourceManager.GetString("faq_q1", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Q: How can I support the developer? ähnelt. /// public static string faq_q2 { get { return ResourceManager.GetString("faq_q2", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Q: How does the setup process work once the ISO is mounted? ähnelt. /// public static string faq_q3 { get { return ResourceManager.GetString("faq_q3", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Q: What if I encounter issues during installation? ähnelt. /// public static string faq_q4 { get { return ResourceManager.GetString("faq_q4", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Q: Is it legal to use this method? ähnelt. /// public static string faq_q5 { get { return ResourceManager.GetString("faq_q5", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Q: What are my alternatives if my PC is not supported? ähnelt. /// public static string faq_q6 { get { return ResourceManager.GetString("faq_q6", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Q: Who is the developer? ähnelt. /// public static string faq_q7 { get { return ResourceManager.GetString("faq_q7", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Windows 11 installation can now proceed. Please follow the instructions in the setup window. ähnelt. /// public static string msg_InstallReady { get { return ResourceManager.GetString("msg_InstallReady", resourceCulture); } } /// /// Sucht eine lokalisierte Zeichenfolge, die Thank you for using my app!\n\nI developed this application in my free time to help you upgrade from Windows 10 to Windows 11 – even on PCs that, according to Microsoft's hardware requirements, would normally not be supported.\n\nMy app helps you avoid purchasing a new computer and actively contributes to reducing unnecessary electronic waste.\n\nNormally, I do not charge anything for my projects – neither for development nor for support.\nHowever, since this app is significantly more comprehensive, offers [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. /// public static string msgClosing { get { return ResourceManager.GetString("msgClosing", resourceCulture); } } } } ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.ar.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 تم إلغاء التصحيح بواسطة المستخدم. حاول المستخدم اختيار محرك أقراص غير قابل للإزالة. لم يتم اختيار أي محرك أقراص USB للتصحيح. فشل في تطبيق التصحيح: المسار المحدد ليس محرك أقراص قابل للإزالة. يرجى اختيار محرك أقراص USB. اختر محرك أقراص USB الذي يحتوي على ملفات تثبيت Windows 11 الخاصة بك.\nتضيف هذه الميزة تصحيح توافق لتجاوز متطلبات النظام معينة.\nمتوافق مع الأقراص المعدة بواسطة أي أداة، بما في ذلك Rufus. تأكد من أن المحرك جاهز! سيتم تطبيق إعدادات تجاوز التوافق على محرك أقراص USB المحدد. هل تريد المتابعة؟ تم تطبيق التصحيح بنجاح! مساعد ترقية Flyby11 تطبيق تصحيح التوافق على ISO (تثبيت نظيف) هل يمكنني الترقية إلى Windows 11؟ هل نجحت الترقية؟ اسحب وأفلت ملف ISO الخاص بـ Windows 11 لتصحيحه وتثبيته على الأجهزة غير المدعومة (ترقية مكانية). ج: يمكنك تنزيل أحدث ISO من الموقع الرسمي لشركة Microsoft أو استخدام Fido Downloader. ج: إذا قمت بتثبيت Windows 11 بنجاح ووفرت بعض المال، فلا تتردد في ترك شيء صغير كعلامة شكر هنا. انقر هنا للتبرع وإظهار دعمك. ج: بمجرد تحميل ISO، يتم تشغيل عملية الإعداد في الخلفية. يبدأ مثبت Windows، موجهًا إياك خلال الخطوات المطلوبة لتثبيت Windows 11 على جهازك. ج: يرجى التحقق من رسائل الخطأ والإبلاغ عنها على GitHub. ج: نعم، تركت Microsoft بابًا خلفيًا مفتوحًا. تستفيد هذه الطريقة من ميزة في عملية إعداد Windows 11 تستخدم إصدار Windows Server من التثبيت. على عكس إعداد Windows 11 العادي، تتخطى هذه النسخة معظم فحوصات توافق الأجهزة. ج: وفقًا لشركة Microsoft، يجب عليك التخلص من جهاز الكمبيوتر الخاص بك. أوصي بتثبيت Linux عليه والابتعاد عن Windows. ج: المطور هو Belim، المعروف أيضًا باسم Builtbybel، الذي ساهم بالكثير من الشيفرة في مجتمع Windows. انقر هنا لمعرفة المزيد عن عمل المطور. تنزيل عبر Fido (موصى به) موقع Microsoft الأسئلة الشائعة (FAQ) س: أين يمكنني الحصول على أحدث Windows 11 ISO؟ س: كيف يمكنني دعم المطور؟ س: كيف تعمل عملية الإعداد بمجرد تحميل ISO؟ س: ماذا لو واجهت مشاكل أثناء التثبيت؟ س: هل من القانوني استخدام هذه الطريقة؟ س: ما هي البدائل إذا لم يكن جهازي مدعومًا؟ س: من هو المطور؟ 1. الجهاز يعمل بإصدار مدعوم حاليًا من Windows 10. إذا لم يكن الجهاز يعمل بإصدار مدعوم حاليًا من Windows 10، قم بالترقية إلى إصدار مدعوم من Windows 10. 2. الجهاز يلبي 1. قم بتنزيل وتشغيل 2. اختر اختصار تحديث Windows التالي ثم اختر زر التحقق من التحديثات: 3. جهازك لا يلبي المتطلبات الرسمية لـ Windows 11؟ يمكنك تطبيق تصحيح التوافق لتمكين الترقية المكانية عبر تحديث Windows. يمكن ترقية جهاز Windows 10 الحالي إلى Windows 11 إذا كان يلبي المعايير التالية: للتحقق مما إذا كان جهاز Windows 10 مؤهلاً للترقية إلى Windows 11، اتبع إحدى هذه الخيارات: المواصفات الدنيا للأجهزة لتشغيل Windows 11. تطبيق WhyNotWin11 لتأكيد أن جهازك يلبي الحد الأدنى من متطلبات النظام يمكن الآن متابعة تثبيت Windows 11. يرجى اتباع التعليمات في نافذة الإعداد. تثبيت أنت جاهز لتثبيت Windows 11 على الأجهزة غير المدعومة! تجاهل رسالة 'Windows Server'؛ أنت جاهز! تثبيت بدء عملية الإعداد بامتيازات مرتفعة... تثبيت عذرًا! حدث خطأ ما: تحميل يتم تحميل ISO... انتظر قليلاً! تحميل فشل تحميل ISO. يرجى المحاولة مرة أخرى. تحميل تم تحميل ISO بنجاح! دعنا نجعل هذا Windows 11 جاهزًا! تحميل قريبًا! نحن نستعد للإعداد... تثبيت لم يتم العثور على ملف الإعداد في تحميل اختر من الكمبيوتر ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.cs-CZ.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Bypass patch zrušen uživatelem. Uživatel nevybral výměné zařízení. Nebyl vybrán USB disk pro záplatování. Chyba při aplikování "bypass" záplaty: Zvolená cesta není vyměnitelný disk. Prosím zvolte USB disk. Vyberte USB disk obsahující instalační soubory Windows 11. \nTato funkce přidává kompatibilní záplatu, která obejde určité systémové požadavky. \nKompatibilní s disky připravenými jakýmkoli nástrojem, včetně Rufus. Ujistěte se, že je disk připraven! Tímto se na vybraný USB disk použijí nastavení pro obejití kompatibility ("bypass"). Pokračovat? Záplata pro obejití ("bypass") byla úspěšně aplikována! Asistent pro upgrade Flyby11 Použít záplatu pro kompatibility na ISO (čistá instalace) Mohu upgradovat na Windows 11? Fungoval upgrade? Přetáhněte Windows 11 ISO, abyste jej opravili a nainstalovali na nepodporovaný hardware (místní upgrade). O: Můžete si stáhnout nejnovější ISO z oficiálních stránek Microsoftu nebo použít Fido Downloader. O: Pokud jste úspěšně nainstalovali Windows 11 a ušetřili nějaké peníze, neváhejte zde zanechat malý příspěvek jako poděkování. Klikněte zde, abyste přispěli a vyjádřili svou podporu. O: Jakmile je ISO připojeno, proces instalace běží na pozadí. Instalátor Windows se spustí a provede vás kroky potřebnými k instalaci Windows 11 na váš počítač. O: Zkontrolujte prosím chybové zprávy a nahlaste je na GitHubu. O: Ano, Microsoft nechal otevřená zadní vrátka. Tato metoda využívá funkci instalačního procesu Windows 11, která používá variantu instalace Windows Server. Na rozdíl od běžné instalace Windows 11 tato varianta přeskočí většinu kontrol kompatibility hardwaru. O: Podle Microsoftu byste měli svůj počítač vyhodit. Doporučil bych na něj nainstalovat Linux a přejít od Windows. O: Vývojářem je Belim, známý také jako Builtbybel, který přispěl velkým množstvím kódu do komunity Windows. Klikněte zde, abyste se dozvěděli více o práci vývojáře. Stáhnout přes Fido (doporučeno) Web Microsoft Často kladené dotazy (FAQ) Q: Kde mohu získat nejnovější ISO Windows 11? Q: Jak mohu podpořit vývojáře? Q: Jak funguje proces instalace, jakmile je ISO připojeno? Q: Co když narazím na problémy během instalace? Q: Je legální použít tuto metodu? Q: Jaké mám alternativy, pokud můj počítač není podporován? Q: Kdo je vývojář? 1. Zařízení používá aktuálně podporovanou verzi Windows 10. Pokud zařízení nepoužívá podporovanou verzi Windows 10, upgradujte na podporovanou verzi Windows 10. 2. Zařízení splňuje... 1. Stáhněte a spusťte... 2. Vyberte následující zástupce Windows Update a poté vyberte tlačítko Zkontrolovat aktualizace: 3. Vaše zařízení nesplňuje oficiální požadavky pro Windows 11? Můžete použít kompatibilní patch, který umožní Inplace Upgrade prostřednictvím Windows Update. Stávající zařízení s Windows 10 lze upgradovat na Windows 11, pokud splňuje následující kritéria: Chcete-li zjistit, zda je zařízení s Windows 10 způsobilé k upgradu na Windows 11, postupujte podle jedné z těchto možností: minimální hardwarové požadavky pro spuštění Windows 11. Aplikace WhyNotWin11 pro potvrzení, že vaše zařízení splňuje minimální systémové požadavky. Instalace Windows 11 může nyní pokračovat. Postupujte prosím podle pokynů v okně nastavení. Install Jste připraveni nainstalovat Windows 11 na nepodporovaný hardware! Ignorujte výzvu 'Windows Server'; jste připraveni! Install Zahájení procesu instalace s vyššími oprávněními... Install Jejda! Něco se pokazilo: Mounting Připojování ISO... Vydržte! Mounting Nepodařilo se připojit ISO. Zkuste to prosím znovu. Mounting ISO úspěšně připojeno! Pojďme připravit tento Windows 11! Mounting Skoro hotovo! Připravujeme instalaci... Install Instalační soubor nebyl nalezen v... Mounting Vyberte z počítače. ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.de.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Umgehungspatch vom Benutzer abgebrochen. Benutzer hat versucht, ein nicht entfernbares Laufwerk auszuwählen. Es wurde kein USB-Laufwerk für den Patch ausgewählt. Fehler beim Anwenden des Umgehungspatches: Der ausgewählte Pfad ist kein entfernbares Laufwerk. Bitte wähle ein USB-Laufwerk aus. Wähle das USB-Laufwerk aus, das deine Windows 11-Installationsdateien enthält.\nDiese Funktion fügt einen Kompatibilitäts-Patch hinzu, um bestimmte Systemanforderungen zu umgehen.\nKompatibel mit Laufwerken, die mit jedem Tool vorbereitet wurden, einschließlich Rufus. Stelle sicher, dass das Laufwerk bereit ist! Dies wird die Kompatibilitäts-Umgehungseinstellungen auf das ausgewählte USB-Laufwerk anwenden. Fortfahren? Umgehungspatch wurde erfolgreich angewendet! Flyby11 Upgrade-Assistent Kompatibilitäts-Patch auf ISO anwenden (Saubere Installation) Kann ich auf Windows 11 upgraden? Hat das Upgrade funktioniert? Ziehe die Windows 11 ISO hierher, um sie zu patchen und auf nicht unterstützter Hardware zu installieren (Inplace-Upgrade). A: Du kannst die neueste ISO von der offiziellen Microsoft-Website herunterladen oder den Fido Downloader verwenden. A: Wenn du Windows 11 erfolgreich installiert hast und dabei etwas Geld gespart hast, kannst du hier gerne ein kleines Dankeschön hinterlassen. Deine Unterstützung hält das Projekt am Leben – und hilft auch anderen. Klicke hier, um zu spenden und deine Unterstützung zu zeigen. A: Sobald die ISO eingebunden ist, läuft der Setup-Prozess im Hintergrund. Der Windows-Installer startet und führt dich durch die erforderlichen Schritte, um Windows 11 auf deinem Gerät zu installieren. A: Bitte überprüfe die Fehlermeldungen und melde sie auf GitHub. A: Ja, Microsoft hat eine Hintertür offen gelassen. Diese Methode nutzt eine Funktion des Windows 11-Setup-Prozesses, die die Windows Server-Variante der Installation verwendet. Im Gegensatz zum normalen Windows 11-Setup überspringt diese Variante die meisten Hardware-Kompatibilitätsprüfungen. A: Laut Microsoft solltest du deinen PC wegwerfen. Ich würde empfehlen, Linux darauf zu installieren und von Windows wegzugehen. A: Der Entwickler ist Belim, auch bekannt als Builtbybel, der viel Code zur Windows-Community beigetragen hat. Klicke hier, um mehr über die Arbeit des Entwicklers zu erfahren. Herunterladen über Fido (Empfohlen) Microsoft-Website Häufig gestellte Fragen (FAQ) F: Wo kann ich die neueste Windows 11 ISO herunterladen? F: Wie kann ich den Entwickler unterstützen? F: Wie funktioniert der Setup-Prozess, sobald die ISO eingebunden ist? F: Was, wenn ich während der Installation auf Probleme stoße? F: Ist es legal, diese Methode zu verwenden? F: Was sind meine Alternativen, wenn mein PC nicht unterstützt wird? F: Wer ist der Entwickler? 1. Auf dem Gerät läuft eine aktuell unterstützte Version von Windows 10. Wenn auf dem Gerät aktuell keine unterstützte Version von Windows 10 läuft, führen Sie ein Upgrade auf eine unterstützte Version von Windows 10 durch. 2. Das Gerät erfüllt 1. Prüfen mit der App 2. Wählen Sie die folgende Windows Update-Verknüpfung und dann die Schaltfläche Nach Updates suchen: 3. Ihr Gerät erfüllt nicht die offiziellen Anforderungen für Windows 11? Sie können einen Kompatibilitätspatch anwenden, um das Inplace Upgrade über Windows Update zu ermöglichen. Ein vorhandenes Windows 10-Gerät kann auf Windows 11 aktualisiert werden, wenn es die folgenden Kriterien erfüllt: Um festzustellen, ob ein Windows 10-Gerät für ein Upgrade auf Windows 11 berechtigt ist, folgen Sie einer dieser Optionen: die Mindesthardwarespezifikationen zum Ausführen von Windows 11. WhyNotWin11-App, um zu bestätigen, dass Ihr Gerät die Mindestsystemanforderungen erfüllt Die Windows 11-Installation kann jetzt fortgesetzt werden. Bitte folge den Anweisungen im Setup-Fenster. Du bist bereit, Windows 11 auf nicht unterstützter Hardware zu installieren! Einfach die Meldung „Windows Server“ ignorieren – und los geht's! Der Setup-Prozess wird mit erhöhten Berechtigungen gestartet... Ups! Da ist etwas schiefgelaufen: ISO wird eingebunden... Bleib dran! Das Einbinden der ISO ist fehlgeschlagen. Bitte versuche es erneut. ISO erfolgreich eingebunden! Los geht's mit der Vorbereitung von Windows 11! Fast geschafft! Wir bereiten den Setup vor... Setup-Datei nicht gefunden in Vom Computer auswählen Vielen Dank, dass du meine App nutzt!\n\nIch habe diese Anwendung in meiner Freizeit entwickelt, um dir den Umstieg von Windows 10 auf Windows 11 zu erleichtern – auch auf PCs, die laut Microsofts Hardwarevorgaben eigentlich nicht unterstützt werden.\n\nMeine App hilft dir, den Kauf eines neuen Rechners zu vermeiden und trägt aktiv dazu bei, unnötigen Elektroschrott zu verhindern.\n\nNormalerweise verlange ich für meine Projekte keinerlei Geld – weder für die Entwicklung noch für den Support.\nDa diese App jedoch deutlich umfangreicher ist, mehr Funktionen bietet und auch mehr Supportaufwand verursacht, würde ich mich freuen, wenn du – sofern es dir möglich ist – eine kleine freiwillige Spende in Erwägung ziehst.\n\nNatürlich nur, wenn du möchtest und es dir leisten kannst.\n\nMöchtest du jetzt auf PayPal spenden? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.fr.resx ================================================ text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Patch de contournement annulé par l'utilisateur. L'utilisateur a tenté de sélectionner un lecteur non amovible. Aucune clé USB sélectionnée pour le correctif. Échec de l'application du correctif de contournement : Le chemin sélectionné n'est pas un lecteur amovible. Veuillez sélectionner une clé USB. Sélectionnez la clé USB contenant vos fichiers d'installation de Windows 11.\nCette fonctionnalité ajoute un correctif de compatibilité pour contourner certaines exigences système.\nCompatible avec les lecteurs préparés par n'importe quel outil, y compris Rufus. Assurez-vous que le lecteur est prêt ! Cela appliquera les paramètres de contournement de compatibilité sur la clé USB sélectionnée. Continuer ? Le patch de contournement a été appliqué avec succès ! Assistant de mise à niveau Flyby11 Appliquer le correctif de compatibilité à l'ISO (installation propre) Puis-je passer à Windows 11 ? La mise à niveau a-t-elle fonctionné ? Glissez et déposez l'ISO Windows 11 pour le corriger et l'installer sur du matériel non pris en charge (mise à niveau sur place). R : Vous pouvez télécharger la dernière version ISO à partir du site Web officiel de Microsoft ou utiliser Fido Downloader. R : Si vous avez réussi à installer Windows 11 et à économiser de l'argent, n'hésitez pas à laisser un petit quelque chose en guise de remerciement ici. Cliquez ici pour faire un don et montrer votre soutien. R : Une fois l'ISO monté, le processus d'installation s'exécute en arrière-plan. Le programme d'installation de Windows démarre et vous guide à travers les étapes requises pour installer Windows 11 sur votre ordinateur. R : Veuillez vérifier les messages d’erreur et les signaler sur GitHub. R : Oui, Microsoft a laissé une porte dérobée ouverte. Cette méthode exploite une fonctionnalité du processus d’installation de Windows 11 qui utilise la variante Windows Server de l’installation. Contrairement à l’installation standard de Windows 11, cette variante ignore la plupart des vérifications de compatibilité matérielle. R : Selon Microsoft, vous devriez jeter votre PC. Je vous suggère d'installer Linux dessus et d'abandonner Windows. R : Le développeur est Belim, également connu sous le nom de Builtbybel, qui a contribué de nombreux codes à la communauté Windows. Cliquez ici pour en savoir plus sur le travail du développeur. Télécharger via Fido (recommandé) Site Microsoft Questions fréquemment posées (FAQ) Q : Où puis-je obtenir la dernière version ISO de Windows 11 ? Q : Comment puis-je soutenir le développeur ? Q : Comment fonctionne le processus de configuration une fois l'ISO monté ? Q : Que faire si je rencontre des problèmes lors de l’installation ? Q : Est-il légal d’utiliser cette méthode ? Q : Quelles sont mes alternatives si mon PC n’est pas pris en charge ? Q : Qui est le développeur ? 1. L'appareil exécute une version actuellement prise en charge de Windows 10. Si l'appareil n'exécute pas actuellement une version prise en charge de Windows 10, effectuez une mise à niveau vers une version prise en charge de Windows 10. 2. L'appareil répond 1. Téléchargez et exécutez le 2. Sélectionnez le raccourci Windows Update suivant, puis sélectionnez le bouton Rechercher les mises à jour : 3. Votre appareil ne répond pas aux exigences officielles de Windows 11 ? Vous pouvez appliquer un correctif de compatibilité pour activer la mise à niveau sur place via Windows Update. Un appareil Windows 10 existant peut être mis à niveau vers Windows 11 s'il répond aux critères suivants : Pour voir si un appareil Windows 10 est éligible à la mise à niveau vers Windows 11, suivez l'une de ces options : les spécifications matérielles minimales pour exécuter Windows 11. Application WhyNotWin11 pour confirmer que votre appareil répond à la configuration minimale requise L'installation de Windows 11 peut maintenant commencer. Veuillez suivre les instructions dans la fenêtre d'installation. Install Vous êtes prêt à installer Windows 11 sur du matériel non pris en charge ! Ignorez l'invite « Windows Server » : vous êtes prêt ! Install Démarrage du processus de configuration avec des privilèges élevés... Install Oups ! Une erreur s'est produite : Mounting Montage de l'ISO... Accrochez-vous ! Mounting Impossible de monter l'ISO. Veuillez réessayer. Mounting L'ISO a été monté avec succès ! Préparons ce Windows 11 ! Mounting Nous y sommes presque ! préparation de l'installation... Fichier d'installation introuvable dans Mounting ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.he.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 החלת טלאי העקיפה בוטלה על ידי המשתמש. המשתמש ניסה לבחור כונן שאינו נשלף. לא נבחר כונן USB לצורך החלת הטלאי. החלת טלאי העקיפה נכשלה: הנתיב שנבחר אינו כונן נשלף. אנא בחר כונן USB. בחר את כונן ה-USB שמכיל את קובצי ההתקנה של Windows 11.\nפונקציה זו מוסיפה טלאי תאימות כדי לעקוף דרישות מערכת מסוימות.\nתואם לכוננים שהוכנו בכלים שונים, כולל Rufus. ודא שהכונן מוכן! פעולה זו תחיל הגדרות עקיפת תאימות על כונן ה-USB שנבחר. להמשיך? טלאי העקיפה הוחל בהצלחה! מסייע השדרוג Flyby11 החל טלאי תאימות על ISO (התקנה נקייה) האם אני יכול לשדרג ל-Windows 11? האם השדרוג הצליח? גרור את קובץ ה־ISO של Windows 11 לכאן כדי להחיל עליו טלאי ולהתקין על חומרה שאינה נתמכת (שדרוג במקום). ת: ניתן להוריד את קובץ ה־ISO העדכני מאתר מיקרוסופט הרשמי או בעזרת Fido Downloader. ת: אם הצלחת להתקין את Windows 11 וחסכת כסף – תוכל להשאיר כאן תרומה קטנה כהוקרת תודה. לחץ כאן כדי לתרום ולהביע תמיכה. ת: לאחר שה־ISO נצפה (mount), תהליך ההתקנה פועל ברקע. מתקין Windows יתחיל וידריך אותך בשלבים הנדרשים להתקנה. ת: בדוק את הודעות השגיאה ודווח עליהן ב-GitHub. ת: כן, מיקרוסופט השאירה דלת אחורית פתוחה. שיטה זו מנצלת את גרסת ההתקנה של Windows Server, אשר מדלגת על רוב בדיקות התאימות לחומרה. ת: לפי מיקרוסופט עליך לזרוק את המחשב. אני ממליץ להתקין עליו Linux ולעבור מ-Windows. ת: המפתח הוא Belim, המוכר גם בשם Builtbybel, שתרם רבות לקהילת Windows. לחץ כאן כדי ללמוד עוד על עבודתו של המפתח. הורדה דרך Fido (מומלץ) אתר Microsoft שאלות נפוצות (FAQ) ש: היכן ניתן להוריד את Windows 11 ISO העדכני? ש: כיצד ניתן לתמוך במפתח? ש: כיצד פועל תהליך ההתקנה לאחר צפייה ב־ISO? ש: מה לעשות במקרה של שגיאה בהתקנה? ש: האם מותר חוקית להשתמש בשיטה הזו? ש: מהן החלופות אם המחשב שלי לא נתמך? ש: מי המפתח? 1. המכשיר פועל עם גרסה נתמכת של Windows 10. אם המכשיר לא מריץ גרסה נתמכת, יש לשדרג לגרסה נתמכת של Windows 10. 2. המכשיר עומד ב 1. הורד והפעל את 2. בחר את קיצור הדרך הבא של Windows Update ולאחר מכן לחץ על הלחצן "בדוק אם קיימים עדכונים": 3. המכשיר שלך לא עומד בדרישות הרשמיות של Windows 11? ניתן להחיל טלאי תאימות כדי לאפשר שדרוג במקום דרך Windows Update. ניתן לשדרג מכשיר עם Windows 10 לגרסה 11 אם הוא עומד בקריטריונים הבאים: כדי לבדוק אם מכשיר Windows 10 זכאי לשדרוג ל-Windows 11, בצע אחת מהאפשרויות הבאות: המפרט המינימלי להפעלת Windows 11. אפליקציית WhyNotWin11 לאימות עמידת המכשיר בדרישות המערכת המינימליות ניתן כעת להמשיך בהתקנת Windows 11. נא לעקוב אחר ההוראות בחלון ההתקנה. אתה מוכן להתקנת Windows 11 על חומרה לא נתמכת! התעלם מההודעה 'Windows Server' – הכל מוכן! מתחיל את תהליך ההתקנה עם הרשאות מנהל... אופס! משהו השתבש: מצרף את קובץ ה־ISO... אנא המתן! צירוף קובץ ה־ISO נכשל. נסה שוב. קובץ ה־ISO צורף בהצלחה! מתחילים את הכנת Windows 11! כמעט סיימנו! אנו מכינים את תהליך ההתקנה... קובץ ההתקנה לא נמצא ב בחר מהמחשב תודה שהשתמשת באפליקציה שלי!\n\nפיתחתי את האפליקציה הזו בזמני הפנוי כדי לעזור לך לשדרג מ־Windows 10 ל־Windows 11 – גם על מחשבים שאינם נתמכים לפי דרישות החומרה של מיקרוסופט.\n\nהאפליקציה שלי עוזרת לך להימנע מקניית מחשב חדש ותורמת להפחתת פסולת אלקטרונית מיותרת.\n\nבדרך כלל אני לא גובה תשלום על הפרויקטים שלי – לא עבור הפיתוח ולא עבור התמיכה.\nאבל מכיוון שאפליקציה זו מקיפה יותר, כוללת יותר תכונות ודורשת יותר תמיכה, אשמח אם תוכל לשקול תרומה קטנה בהתנדבות, אם זה אפשרי עבורך.\n\nכמובן, רק אם אתה רוצה ויכול להרשות לעצמך.\n\nהאם ברצונך לתרום ב-PayPal עכשיו? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.hu.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 A felhasználó megszakította a javítás megkerülését. A felhasználó megpróbált kiválasztani egy nem cserélhető meghajtót. Nincs USB-meghajtó kiválasztva a javításhoz. Nem sikerült alkalmazni a bypass javítást: A kiválasztott elérési út nem cserélhető meghajtó. Válasszon egy USB-meghajtót. Válassza ki a Windows 11 telepítőfájljait tartalmazó USB-meghajtót.\nEz a funkció kompatibilitási javítást ad hozzá bizonyos rendszerkövetelmények megkerüléséhez.\nKompatibilis bármely eszközzel előkészített meghajtókkal, beleértve a Rufust is. Győződjön meg arról, hogy a meghajtó készen áll! Ez alkalmazza a kompatibilitási megkerülési beállításokat a kiválasztott USB-meghajtón. Folytassuk? A bypass tapasz sikeresen alkalmazva! Flyby11 frissítési segéd Alkalmazza a kompatibilitási javítást az ISO -ra (tiszta telepítés) Frissíthetek Windows 11-re? Működött a frissítés? Húzza a Windows 11 ISO-t a javításhoz és a nem támogatott hardverre való telepítéshez (Helyi frissítés). V: Letöltheti a legújabb ISO-t a Microsoft hivatalos webhelyéről, vagy használhatja a Fido Downloadert. V: Ha sikeresen telepítette a Windows 11-et, és pénzt takarított meg, nyugodtan hagyjon itt egy kis köszönetet. Kattintson ide, hogy adományozzon és kifejezze támogatását. V: Az ISO csatlakoztatása után a beállítási folyamat a háttérben fut. Elindul a Windows telepítője, amely végigvezeti Önt a Windows 11 gépre történő telepítéséhez szükséges lépéseken. V: Kérjük, ellenőrizze a hibaüzeneteket, és jelentse a GitHubon. V: Igen, a Microsoft nyitva hagyott egy hátsó ajtót. Ez a módszer a Windows 11 telepítési folyamatának egy olyan funkcióját használja, amely a telepítés Windows Server-változatát használja. A szokásos Windows 11 beállítással ellentétben ez a változat kihagyja a legtöbb hardverkompatibilitási ellenőrzést. V: A Microsoft szerint ki kell dobnia a számítógépét. Azt javaslom, hogy telepítse rá a Linuxot, és távolodjon el a Windowstól. V: A fejlesztő Belim, más néven Builtbybel, aki sok kóddal járult hozzá a Windows közösséghez. Kattintson ide, ha többet szeretne megtudni a fejlesztő munkájáról. Letöltés a Fido-n keresztül (ajánlott) Microsoft webhely Gyakran Ismételt Kérdések (GYIK) K: Hol szerezhetem be a legújabb Windows 11 ISO-t? K: Hogyan támogathatom a fejlesztőt? K: Hogyan működik a beállítási folyamat az ISO csatlakoztatása után? K: Mi a teendő, ha problémákat tapasztalok a telepítés során? K: Legális ennek a módszernek a használata? K: Milyen alternatívák vannak, ha a számítógépem nem támogatott? K: Ki a fejlesztő? 1. Az eszközön a Windows 10 jelenleg támogatott verziója fut. Ha az eszközön jelenleg nem a Windows 10 támogatott verziója fut, frissítsen a Windows 10 támogatott verziójára. 2. Az eszköz megfelel 1. Töltse le és futtassa a 2. Válassza ki a következő Windows Update parancsikont, majd válassza a Frissítések keresése gombot: 3. Eszköze nem felel meg a Windows 11 hivatalos követelményeinek? Kompatibilitási javítás alkalmazásával engedélyezheti a helyben történő frissítést a Windows Update szolgáltatáson keresztül. Egy meglévő Windows 10-es eszköz frissíthető Windows 11-re, ha megfelel az alábbi feltételeknek: Ha meg szeretné tudni, hogy egy Windows 10-es eszköz jogosult-e a Windows 11-re való frissítésre, kövesse az alábbi lehetőségek egyikét: a Windows 11 futtatásához szükséges minimális hardverspecifikációk. WhyNotWin11 alkalmazás annak megerősítéséhez, hogy a készülék megfelel a minimális rendszerkövetelményeknek A Windows 11 telepítése most folytatható. Kérjük, kövesse a beállítási ablakban található utasításokat. Install Készen áll a Windows 11 telepítésére nem támogatott hardverre! Hagyja figyelmen kívül a' Windows Server ' parancsot; minden készen áll! Install A telepítési folyamat indítása emelt jogosultságokkal... Install Hoppá! Valami elromlott: Mounting Az ISO csatlakoztatása... Kitartás! Mounting Nem sikerült csatlakoztatni az ISO-t. Kérjük, próbálja újra. Mounting ISO sikeresen csatlakoztatva! Lássunk hozzá a Windows 11 elkészítéséhez! Mounting Majdnem kész! Előkészítjük a beállítást... Install A telepítőfájl nem található a(z) Mounting Kiválasztás a számítógépről Thank you for using my app!\n\nI developed this application in my free time to help you upgrade from Windows 10 to Windows 11 – even on PCs that, according to Microsoft's hardware requirements, would normally not be supported.\n\nMy app helps you avoid purchasing a new computer and actively contributes to reducing unnecessary electronic waste.\n\nNormally, I do not charge anything for my projects – neither for development nor for support.\nHowever, since this app is significantly more comprehensive, offers more features, and requires more support, I would be grateful if you would consider making a small voluntary donation, if you are able to.\n\nOf course, only if you want to and can afford it.\n\nWould you like to donate on PayPal now? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.it.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Installazione patch bypass annullata dall'utente. L'utente ha selezionato un'unità non rimovibile. Nessuna unità USB selezionata per l'installazione della patch. Impossibile applicare la patch bypass: Il percorso selezionato non è un'unità rimovibile.\nSeleziona un'unità USB. Seleziona l'unità USB contenente i file di installazione di Windows 11.\ntQuesta funzione aggiunge una patch di compatibilità per bypassare determinati requisiti di sistema.\nÈ compatibile con le unità preparate da qualsiasi strumento, incluso Rufus.\nAssicurati che l'unità sia pronta! Ciò applicherà le impostazioni di bypass compatibilità nell'unità USB selezionata.\nVuoi continuare? Patch bypass applicata correttamente! Assistente aggiornamento Flyby11 Applica patch compatibilità a file ISO (installazione pulita) Posso eseguire l'aggiornamento a Windows 11? L'aggiornamento ha funzionato? Segnalacelo! Trascina e rilascia il file ISO di Windows per patcharlo ed installare con hardware non supportato (aggiornamento inplace). R: puoi scaricare la versione ISO più recente dal sito web ufficiale di Microsoft o usare il downloader di Fido. R: se hai installato correttamente Windows 11 e hai risparmiato un po' di soldi, non esitare a lasciare qualcosa come ringraziamento qui. Clic qui per donare e dimostrare il tuo supporto. R: una volta montato il file ISO, il processo di configurazione verrà eseguito in background. Il programma di installazione di Windows si avvia, guidando i passaggi necessari per installare Windows 11 nel dispositivo. R: controlla i messaggi di errore e segnalali in GitHub. R: sì, Microsoft ha lasciato aperto un backdoor. Questo metodo sfrutta una funzione del processo di configurazione di Windows 11 che usa la variante di Windows Server dell'installazione. A differenza della normale configurazione di Windows 11, questa variante salta la maggior parte dei controlli di compatibilità hardware. R: secondo Microsoft, dovresti buttare via il PC. Io ti suggerisco di installarci Linux e di lasciar stare Windows. R: lo sviluppatore è Belim, noto anche come Buildbybel, che ha contribuito molto al codice alla comunità di Windows. Fai clic qui per saperne di più sui lavori dello sviluppatore. Scarica tramite Fido (consigliato) Download dal sito Microsoft Domande frequenti (FAQ) D: dove posso scaricare il file ISO della versione più recente di Windows 11? D: come posso supportare lo sviluppatore? D: come funziona il processo di configurazione una volta montato il file ISO? D: e se riscontro problemi durante l'installazione? D: è legale usare questo metodo? D: quali sono le alternative se l'hardware del PC non è supportato? D: chi è lo sviluppatore? 1. Il dispositivo contiene una versione di Windows 10 attualmente supportata. Se nel dispositivo non è attualmente in esecuzione una versione supportata di Windows 10, aggiorna ad una versione supportata di Windows 10. 2. Il dispositivo soddisfa 1. Download ed esecuzione di 2. Seleziona il collegamento di Windows Update, quindi seleziona il pulsante 'Controlla aggiornamenti': 3. Il dispositivo non soddisfa i requisiti ufficiali per Windows 11? È possibile applicare una patch di compatibilità per abilitare l'aggiornamento inplace tramite Windows Update. Un dispositivo con una installazione Windows 10 esistente può essere aggiornata a Windows 11 se soddisfa i seguenti criteri: Per vedere se un dispositivo Windows 10 è idoneo a passare a Windows 11, segui una di queste opzioni: Le specifiche hardware minime per eseguire Windows 11. l'app WhyNotwin11 per confermare se il dispositivo soddisfa i requisiti minimi di sistema L'installazione di Windows 11 può ora procedere. Segui le istruzioni nella finestra di configurazione. Installa Sei pronto per installare Windows 11 con hardware non supportato! Ignora il prompt "Windows Server"; tutto è pronto! Installa Avvio processo configurazione con privilegi elevati ... Installa Oops! Qualcosa è andato storto: Montaggio Montaggio file... Montaggio Impossibile montare il file ISO. Riprova. Montaggio File ISO montato correttamente! Procediamo con l'installazione di Windows 11! Montaggio Ci siamo quasi! Preparazione installazione ... Installazione File configurazione non trovato in Montaggio Seleziona dal computer ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.ja.resx ================================================ text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 バイパスパッチはユーザーによってキャンセルされました。 ユーザーがリムーバブルでないドライブを選択しようとしました。 パッチを適用する USB ドライブが選択されていません。 バイパスパッチの適用に失敗しました: 選択したパスはリムーバブルドライブではありません。USB ドライブを選択してください。 Windows 11 インストールファイルを含む USB ドライブを選択します。\nこの機能は、特定のシステム要件を回避するための互換性パッチを追加します。\nRufus を含む任意のツールで準備されたドライブと互換性があります。\nドライブの準備ができていることを確認してください! 選択した USB ドライブに互換性バイパス設定が適用されます。続行しますか? バイパスパッチが正常に適用されました。 Flyby11 アップグレードアシスタント ISO に互換性パッチを適用する (クリーンインストール) Windows 11 にアップグレード可能ですか? アップグレードは成功しましたか? Windows 11 の ISO をドラッグ アンド ドロップでパッチを適用してサポートされていないハードウェアにインストール (インプレース アップグレード) A: 最新の ISO は Microsoft の公式 ウェブサイトからダウンロードか、Fido Downloader が使用できます。 A: Windows 11 を正常にインストールできてコストが節約できた場合は、ぜひこちらで感謝の気持ちをお伝えください。 寄付をして開発をサポートするには、ここをクリックしてください。 A: ISO がマウントされるとセットアップ プロセスがバックグラウンドで実行されます。Windows インストーラーが起動し、マシンに Windows 11 をインストールするための必要な手順が案内されます。 A: エラーメッセージを確認して GitHub で報告してください。 A: はい、Microsoft は、このバックドアを開いたままにしています。この方法は、Windows Server バリアントのインストールを使用する Windows 11 セットアップ プロセスの機能を活用します。通常の Windows 11 セットアップと異なり、このバリアントはほとんどのハードウェア互換性のチェックをスキップします。 A: Microsoft によると PC を廃棄した方が良いそうです。Linux をインストールして Windows から離れることを推奨します。 A: 開発者は、Windows コミュニティに多くのコードを提供してきた、Builtbybel としても知られている Belim 氏です。 開発者の作業の詳細については、ここをクリックしてください。 Fido を使用してダウンロード (推奨) Microsoft のサイト よくある質問 (FAQ) Q: 最新の Windows 11 ISO はどこから入手できますか? Q: 開発者に寄付するにはどうすればいいですか? Q: ISO がマウントされた後、セットアップ プロセスはどのように機能しますか? Q: インストール中に問題が発生した場合はどうすれば良いですか? Q: この方法を使用することは合法ですか? Q: 使用している PC がサポートされていない場合の代替手段は何でしょうか? Q: 開発者は誰ですか? 1. デバイスで現在サポートされているバージョンの Windows 10 を実行している状態である。サポートしていない Windows 10 を実行している場合は、サポートされている Windows 10 にアップグレードしてください。 2. デバイスで 1. ダウンロードで確認 2. 次に Windows Update を選択後に「更新プログラムのチェック」ボタンを選択します: 3. 使用しているデバイスは Windows 11 の要件を満たしていませんか?互換性パッチを適用して、Windows Update 経由でのインプレース アップグレードを有効化することができます。 既存の Windows 10 デバイスは、次の条件を満たしている場合に Windows 11 にアップグレードできます: Windows 10 デバイスが Windows 11 にアップグレードできるかどうかを確認するには、次のいずれかのオプションに従ってください。 Windows 11 を実行するための最小ハードウェア仕様を確認する。 WhyNotWin11 で最小のシステム要件を満たしているか確認できます。 Windows 11 のインストールを続行できます。セットアップ ウィンドウの指示に従ってください。 インストール サポートされていないハードウェアに Windows 11 をインストールする準備ができました。「Windows Server」のプロンプトは無視してください。これで準備完了です! インストール 昇格された権限でセットアップ プロセスを開始しています... インストール おっと!問題が発生しました: マウント中 ISO をマウント中です... しばらくお待ちください! マウント中 ISO のマウントに失敗しました。再度お試しください。 マウント中 ISO のマウントに成功しました! Windows 11 を準備します! マウント中 もうすぐです!セットアップを準備しています... インストール セットアップファイルが見つかりません マウント中 コンピューターから ISO を選択 私が開発したアプリをご利用いただきありがとうございます!\n\n私は Windows 10 から Windows 11 へのアップグレードを支援するために空き時間を利用してこのアプリを開発しました。Microsoft のハードウェア要件では通常サポートされない PC でもアップグレードできます。\n\nこのアプリは、新しいコンピューターの購入を回避や不要な電子機器廃棄物の削減に積極的に貢献します。\n\n私は開発費やサポート費用、プロジェクトに対して料金を一切請求しません。\nただし、このアプリは非常に包括的で多くの機能を提供し、より多くの機能を提供するためにより多くのサポートを必要とするため、可能であれば任意の寄付を検討していただければ幸いです。少額でも構いません。\n\nもちろんですが、寄付をしたいという希望があることと余裕がある場合に限ります。\n\n今すぐ PayPal で寄付しますか? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.ko.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 사용자가 바이패스 패치를 취소했습니다. 사용자가 제거할 수 없는 드라이브를 선택하려고 했습니다. 패치할 USB 드라이브를 선택하지 않았습니다. 바이패스 패치 적용에 실패했습니다: 선택한 경로는 이동식 드라이브가 아닙니다. USB 드라이브를 선택하세요. Windows 11 설치 파일이 들어 있는 USB 드라이브를 선택하세요.\n이 기능은 특정 시스템 요구 사항을 우회하는 호환성 패치를 추가합니다.\nRufus를 포함한 모든 도구로 준비된 드라이브와 호환됩니다. 드라이브가 준비되었는지 확인하세요! 선택한 USB 드라이브에 호환성 우회 설정이 적용됩니다. 계속하시겠습니까? 바이패스 패치가 성공적으로 적용되었습니다! Flyby11 업그레이드 도우미 ISO에 호환성 패치 적용 (새로 설치) Windows 11로 업그레이드할 수 있나요? 업그레이드가 제대로 됐나요? Windows 11 ISO를 끌어서 놓아 패치하고 지원되지 않는 하드웨어에 설치합니다 (내부 업그레이드). 답변: Microsoft 공식 웹사이트에서 최신 ISO를 다운로드하거나 Fido 다운로더를 사용할 수 있습니다. 답변: Windows 11을 성공적으로 설치하고 비용을 약간 절약했다면 감사의 표시로 여기에 작은 글을 남겨주세요. 여기를 클릭하여 기부하고 지지를 표해주세요. 답변: ISO가 마운트되면 설치 프로세스가 백그라운드에서 실행됩니다. Windows 설치 프로그램이 시작되어 컴퓨터에 Windows 11을 설치하는 데 필요한 단계를 안내합니다. 답변: 오류 메시지를 확인하시고 GitHub에 보고해 주세요. 답변: 네, Microsoft는 백도어를 열어 두었습니다. 이 방법은 Windows Server 설치 변형을 사용하는 Windows 11 설치 프로세스의 기능을 활용합니다. 일반 Windows 11 설치와 달리, 이 변형은 대부분의 하드웨어 호환성 검사를 건너뜁니다. 답변: Microsoft에 따르면 PC는 폐기해야 한다고 합니다. 저라면 Windows에서 Linux로 바꾸고 PC를 폐기하는 것을 추천합니다. 답변: 개발자는 Belim이며 Builtbybel로도 알려져 있습니다. 그는 Windows 커뮤니티에 많은 코드를 기여했습니다. 개발자의 작업에 대해 자세히 알아보려면 여기를 클릭하세요. Fido를 통해 다운로드 (권장) Microsoft 사이트 자주 묻는 질문 (FAQ) 질문: 최신 Windows 11 ISO는 어디서 구할 수 있나요? 질문: 개발자를 어떻게 지원할 수 있나요? 질문: ISO를 마운트한 후 설정 과정은 어떻게 진행되나요? 질문: 설치 중에 문제가 발생하면 어떻게 해야 하나요? 질문: 이 방법을 사용하는 것이 합법인가요? 질문: 내 PC가 지원되지 않는 경우 어떤 대안이 있나요? 질문: 개발자는 누구인가요? 1. 해당 기기는 현재 지원되는 Windows 10 버전을 실행 중입니다. 해당 기기가 현재 지원되는 Windows 10 버전을 실행하고 있지 않은 경우, 지원되는 Windows 10 버전으로 업그레이드하세요. 2. 장치가 만족합니다 1. 다운로드하고 실행하세요 2. 다음 Windows 업데이트 바로 가기를 선택한 다음 업데이트 확인 버튼을 선택합니다. 3. 기기가 Windows 11 공식 요구 사항을 충족하지 못하시나요? Windows 업데이트를 통해 호환성 패치를 적용하여 현재 위치 업그레이드를 활성화할 수 있습니다. 다음 기준을 충족하는 경우 기존 Windows 10 장치를 Windows 11로 업그레이드할 수 있습니다. Windows 10 장치가 Windows 11로 업그레이드할 수 있는지 확인하려면 다음 옵션 중 하나를 따르세요. Windows 11을 실행하기 위한 최소 하드웨어 사양. WhyNotWin11 앱을 사용하여 기기가 최소 시스템 요구 사항을 충족하는지 확인하세요. 이제 Windows 11 설치를 진행할 수 있습니다. 설치 창의 지침을 따르세요. Install 지원되지 않는 하드웨어에 Windows 11을 설치할 준비가 되었습니다! 'Windows Server' 메시지는 무시하세요. 설치가 완료되었습니다! Install 상승된 권한으로 설정 프로세스를 시작합니다... Install 어머나! 오류가 발생했습니다. Mounting ISO 마운트... 잠깐만요! Mounting ISO를 마운트하지 못했습니다. 다시 시도해 주세요. Mounting ISO가 성공적으로 마운트되었습니다! 이제 Windows 11을 준비하세요! Mounting 거의 다 왔어요! 설치 준비를 하고 있어요... Install 설치 파일을 찾을 수 없습니다 Mounting 컴퓨터에서 선택 제 앱을 사용해주셔서 감사합니다!\n\n저는 여가 시간에 Windows 10에서 Windows 11로 업그레이드하는 데 도움이 되는 이 애플리케이션을 개발했습니다. Microsoft 하드웨어 요구 사항에 따라 일반적으로 지원되지 않는 PC에서도 사용할 수 있습니다.\n\n제 앱은 새 컴퓨터를 구매하지 않도록 도와주고 불필요한 전자 폐기물을 줄이는 데 적극적으로 기여합니다.\n\n일반적으로 저는 프로젝트에 대해 개발이나 지원 비용을 청구하지 않습니다.\n하지만 이 앱은 훨씬 더 포괄적이고, 더 많은 기능을 제공하며, 더 많은 지원이 필요하므로 가능하시다면 소액의 자발적인 기부를 고려해 주시면 감사하겠습니다.\n\n물론, 기부를 원하고 경제적으로 여유가 있으시다면 가능합니다.\n\n지금 PayPal로 기부하시겠습니까? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.nl.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Omzeilingspatch geannuleerd door gebruiker. Gebruiker probeerde een niet-verwisselbaar station te selecteren. Geen USB-station geselecteerd voor patching. Fout bij toepassen van omzeilingspatch: Het geselecteerde pad is geen verwisselbaar station. Selecteer een USB-station. Selecteer het USB-station met uw Windows 11 installatiebestanden.\nDeze functie voegt een compatibiliteitspatch toe om bepaalde systeemeisen te omzeilen.\nCompatibel met stations die zijn voorbereid met elke tool, inclusief Rufus. Zorg ervoor dat het station klaar is! Dit zal compatibiliteits-omzeilingsinstellingen toepassen op het geselecteerde USB-station. Doorgaan? Omzeilingspatch succesvol toegepast! Flyby11 Upgrade-assistent Compatibiliteitspatch toepassen op ISO (Schone installatie) Kan ik upgraden naar Windows 11? Werkte de upgrade? Sleep de Windows 11 ISO hierheen om het te patchen en te installeren op niet-ondersteunde hardware (In-place upgrade). A: U kunt de nieuwste ISO downloaden van de officiële Microsoft-website of de Fido Downloader gebruiken. A: Als u Windows 11 succesvol heeft geïnstalleerd en wat geld heeft bespaard, voel je vrij om hier een kleine donatie als dank achter te laten. Klik hier om te doneren en uw steun te tonen. A: Zodra de ISO is gekoppeld, wordt het installatieproces op de achtergrond uitgevoerd. Het Windows-installatieprogramma start en begeleidt u door de stappen die nodig zijn om Windows 11 op uw machine te installeren. A: Controleer de foutmeldingen en rapporteer het op GitHub. A: Ja, Microsoft heeft een achterdeur open gelaten. Deze methode maakt gebruik van een functie van het Windows 11 installatieproces die de Windows Server-variant van de installatie gebruikt. In tegenstelling tot de gewone Windows 11-installatie slaat deze variant de meeste hardware-compatibiliteitscontroles over. A: Volgens Microsoft zou je je PC weg moeten gooien. Ik zou voorstellen om Linux erop te installeren en weg te gaan van Windows. A: De ontwikkelaar is Belim, ook bekend als Builtbybel, die veel code heeft bijgedragen aan de Windows-community. Klik hier om meer te leren over het werk van de ontwikkelaar. Downloaden via Fido (Aanbevolen) Microsoft-site Veelgestelde vragen (FAQ) V: Waar kan ik de nieuwste Windows 11 ISO krijgen? V: Hoe kan ik de ontwikkelaar ondersteunen? V: Hoe werkt het installatieproces zodra de ISO is gekoppeld? V: Wat als ik problemen ondervind tijdens de installatie? V: Is het legaal om deze methode te gebruiken? V: Wat zijn mijn alternatieven als mijn PC niet wordt ondersteund? V: Wie is de ontwikkelaar? 1. Het apparaat draait een momenteel ondersteunde versie van Windows 10. Als het apparaat momenteel geen ondersteunde versie van Windows 10 draait, upgrade dan naar een ondersteunde versie van Windows 10. 2. Het apparaat voldoet aan 1. Download en voer de 2. Selecteer de volgende Windows Update-snelkoppeling en selecteer vervolgens de knop Controleren op updates: 3. Voldoet uw apparaat niet aan de officiële vereisten voor Windows 11? U kunt een compatibiliteitspatch toepassen om de In-place upgrade via Windows Update in te schakelen. Een bestaand Windows 10-apparaat kan worden geüpgraded naar Windows 11 als het voldoet aan de volgende criteria: Om te zien of een Windows 10-apparaat in aanmerking komt voor upgrade naar Windows 11, volg een van deze opties: de minimale hardwarespecificaties om Windows 11 uit te voeren. WhyNotWin11-app om te bevestigen dat uw apparaat voldoet aan de minimumsysteemvereisten Windows 11-installatie kan nu doorgaan. Volg de instructies in het installatievenster. Install U bent klaar om Windows 11 te installeren op niet-ondersteunde hardware! Negeer de 'Windows Server'-prompt; u bent helemaal klaar! Install Het installatieproces starten met verhoogde bevoegdheden... Install Oeps! Er ging iets mis: Mounting ISO koppelen... Hou vol! Mounting ISO koppelen mislukt. Probeer het opnieuw. Mounting ISO succesvol gekoppeld! Laten we deze Windows 11 klaar maken! Mounting Bijna klaar! We maken de installatie gereed... Install Installatiebestand niet gevonden in Mounting Selecteren van computer Bedankt voor het gebruiken van mijn app! Ik heb deze applicatie in mijn vrije tijd ontwikkeld om u te helpen upgraden van Windows 10 naar Windows 11 – zelfs op PC's die volgens Microsoft's hardwarevereisten normaal gesproken niet zouden worden ondersteund. Mijn app helpt u een nieuwe computer te vermijden en draagt actief bij aan het verminderen van onnodige elektronische afval. Normaal gesproken vraag ik niets voor mijn projecten – noch voor ontwikkeling, noch voor ondersteuning. Omdat deze app echter aanzienlijk uitgebreider is, meer functies biedt en meer ondersteuning vereist, zou ik dankbaar zijn als u een kleine vrijwillige donatie zou willen overwegen, indien u dat kunt. Natuurlijk alleen als u wilt en het zich kunt veroorloven. Wilt u nu doneren op PayPal? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.pl.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Łatka pomijająca została anulowana przez użytkownika. Użytkownik próbował wybrać niewysuwalny nośnik. Brak wybranego nośnika USB do aplikowania łatki. Aplikacja pomijającej łatki zakończyła się niepowodzeniem: Wybrana ścieżka nie jest wysuwalnym nośnikiem. Wybierz nośnik USB. Wybierz nośnik USB zawierający instalator Windowsa 11.\nTa funkcja dodaje kompatybilną łatką do pominięcia pewnych wymagań systemowych.\nKompatybilny z nośnikami przygotowanymi przez dowolne narzędzie, w tym Rufusa. Upewnij się, że ten nośnik jest gotowy! To zaaplikuje ustawienia pomijające wymagania na tym wybranym nośniku USB. Czy chcesz kontynuować? Łatka pomijająca wymagania systemowe została pomyślnie zaaplikowana! Flyby11 Asystent Uaktualnienia Zaaplikuj łatkę kompatybilności do obrazu ISO (czysta instalacja) Czy mogę zaktualizować do Windowsa 11? Czy te uaktualnienie zadziałało? Przeciągnij i upuść obraz ISO Windowsa 11, żeby go załatać i zainstalować na niewspieranym sprzęcie (aktualizacja na miejscu). O: Możesz pobrać najnowszy obraz ISO z oficjalnej strony Microsoft lub użyć pobieracza Fido. O: Jeśli udało ci się zainstalować system Windows 11 i zaoszczędzić trochę pieniędzy, możesz zostawić tutaj małe podziękowanie. Kliknij tutaj, aby wesprzeć mnie i okazać Twoje wsparcie. O: Po zamontowaniu obrazu ISO proces instalacji przebiega w tle. Zostanie uruchomiony instalator systemu Windows, który poprowadzi użytkownika przez kolejne kroki wymagane do zainstalowania systemu Windows 11 na komputerze. O: Proszę sprawdzić wiadomości błędów i zgłosić je na GitHubie. O: Tak, Microsoft pozostawił otwartą furtkę. Ta metoda wykorzystuje funkcję procesu instalacji systemu Windows 11, która wykorzystuje wariant instalacji systemu Windows Server. W przeciwieństwie do zwykłej instalacji systemu Windows 11, ten wariant pomija większość kontroli zgodności sprzętu. O: Według Microsoftu, powinieneś/-naś wyrzucić swój komputer. Poleciłbym instalację Linuxa na nim i oddalić się od Windowsa. O: Deweloperem jest Belim, znany również jako Builtbybel, który wniósł wiele kodu do społeczności Windows. Kliknij tutaj, aby dowiedzieć się więcej o pracy dewelopera. Pobierz przez Fido (rekomendowane) Strona Microsoftu Najczęściej zadawane pytanie (FAQ) P: Gdzie mogę pobrać najnowszy obraz ISO Windowsa 11? P: Jak mogę wesprzeć dewelopera? P: Jak przebiega proces instalacji po zainstalowaniu pliku ISO? P: Co jeśli napotkam problemy podczas instalacji? P: Czy korzystanie z tej metody jest legalne? P: Jakie mam alternatywy, jeśli mój komputer nie jest wspierany? P: Kto jest deweloperem? 1. Na urządzeniu działa aktualnie obsługiwana wersja systemu Windows 10. Jeśli na urządzeniu nie działa obecnie obsługiwana wersja systemu Windows 10, należy uaktualnić system do obsługiwanej wersji systemu Windows 10. 2. Urządzenie spełnia wymagania 1. Pobierz i uruchom 2. Wybierz następujący skrót Windows Update, a następnie wybierz przycisk Sprawdź aktualizacje: 3. Twoje urządzenie nie spełnia oficjalnych wymagań systemu Windows 11? Możesz zastosować poprawkę zgodności, aby włączyć aktualizację w miejscu za pośrednictwem Windows Update. Istniejące urządzenie z systemem Windows 10 może zostać uaktualnione do systemu Windows 11, jeśli spełnia następujące kryteria: Aby sprawdzić, czy urządzenie z systemem Windows 10 kwalifikuje się do uaktualnienia do systemu Windows 11, wykonaj jedną z poniższych opcji: minimalne specyfikacje sprzętowe umożliwiające uruchomienie systemu Windows 11. Aplikacja WhyNotWin11, aby potwierdzić, że urządzenie spełnia minimalne wymagania systemowe Teraz można kontynuować instalację systemu Windows 11. Postępuj zgodnie z instrukcjami wyświetlanymi w oknie instalacji. Install Możesz zainstalować system Windows 11 na nieobsługiwanym sprzęcie! Zignoruj monit „Windows Server”; wszystko gotowe! Install Rozpoczęcie procesu instalacji z podwyższonymi uprawnieniami... Install Ups! Coś poszło nie tak: Mounting Montowanie obrazu ISO... Trzymaj się mocno! Mounting Montowanie obrazu ISO zakończyło się niepowodzeniem. Spróbuj ponownie. Mounting Obraz ISO został zamontowany pomyślnie! Przygotujmy Windowsa 11! Mounting Już prawie! Przygotowujemy konfigurację, aby była gotowa... Install Nie znaleziono pliku konfiguracyjnego w Mounting Wybierz z komputera ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.pt-BR.resx ================================================ text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 O usuário tentou selecionar uma mídia não removível. Nenhuma unidade USB selecionada para aplicar o patch. Posso atualizar para o Windows 11? A atualização funcionou? Ops! Algo deu errado: Mounting Montando o arquivo ISO... Só um momento! Mounting Falha ao montar o arquivo ISO. Tente de novo. Mounting ISO montado com sucesso! Vamos preparar o Windows 11! Mounting Quase lá! Estamos preparando a instalação... Install Arquivo de instalação não encontrado em Mounting Selecionar do computador Patch de bypass cancelado pelo usuário. Falha ao aplicar patch de bypass: O caminho selecionado não é uma unidade removível. Selecione uma unidade USB. Selecione a unidade USB contendo os arquivos de instalação do Windows 11.\nEste recurso adiciona um patch de compatibilidade para ignorar certos requerimentos de sistema.\nCompatível com unidades preparadas por qualquer ferramenta, incluindo o Rufus. Garanta que a unidade esteja pronta! Isso aplicará as configurações de bypass de compatibilidade na unidade USB selecionada. Continuar? Patch de bypass aplicado com sucesso! Assistente de Atualização Flyby11 Aplicar patch de compatibilidade na ISO (Instalação limpa) Arraste e solte a ISO do Windows 11 para aplicar o patch e instalá-lo em hardware não suportado (Atualização local). R: Você pode baixar o ISO mais recente do site oficial da Microsoft ou usar o Fido Downloader. R: Se você instalou o Windows 11 com sucesso e economizou algum dinheiro, sinta-se à vontade para deixar algo como agradecimento aqui. Clique aqui para doar e mostrar seu apoio. R: Após a montagem da ISO, o processo de instalação é executado em segundo plano. O instalador do Windows é iniciado, guiando você pelas etapas necessárias para instalar o Windows 11 na sua máquina. R: Verifique as mensagens de erro e informe-as no GitHub. R: Sim, a Microsoft deixou uma brecha. Este método aproveita um recurso do processo de instalação do Windows 11 que utiliza a variante do Windows Server. Ao contrário da instalação padrão do Windows 11, esta variante ignora a maioria das verificações de compatibilidade de hardware. R: Segundo a Microsoft, você deve jogar seu PC fora. Eu sugeriria instalar o Linux nele e abandonar o Windows. R: O desenvolvedor se chama Belim, também conhecido como Builtbybel, que contribuiu com muito código para a comunidade Windows. Clique aqui para saber mais sobre o trabalho do desenvolvedor. Baixar pelo Fido (Recomendado) Site da Microsoft Perguntas Frequentes P: Onde posso obter o ISO mais recente do Windows 11? P: Como posso apoiar o desenvolvedor? P: Como funciona o processo de instalação depois que a ISO é montada? P: E se eu tiver problemas durante a instalação? P: É legal usar esse método? P: Quais são minhas alternativas se meu PC não for compatível? P: Quem é o desenvolvedor? 1. O dispositivo está executando uma versão atualmente compatível do Windows 10. Se o dispositivo não estiver executando uma versão compatível, atualize para uma versão que seja compatível. 2. O dispositivo atende 1. Baixe e execute o 2. Selecione o seguinte atalho do Windows Update e então selecione o botão 'Verificar por atualizações': 3. Seu dispositivo não atende aos requisitos oficiais do Windows 11? Você pode aplicar um patch de compatibilidade para habilitar a Atualização Local por meio do Windows Update. Um dispositivo Windows 10 existente pode ser atualizado para o Windows 11 se atender aos seguintes critérios: Para verificar se um dispositivo Windows 10 está qualificado para atualização para o Windows 11, siga uma destas opções: as especificações mínimas de hardware para executar o Windows 11. aplicativo WhyNotWin11 para confirmar se seu dispositivo atende aos requisitos mínimos do sistema. A instalação do Windows 11 já pode prosseguir. Siga as instruções na janela de instalação. Install Você está pronto para instalar o Windows 11 em hardware não suportado! Ignore o prompt "Windows Server"; está tudo pronto! Install Iniciando o processo de instalação com privilégios de administrador... Install Obrigado por usar meu aplicativo!\n\nDesenvolvi este aplicativo no meu tempo livre para ajudar você a atualizar do Windows 10 para o Windows 11, mesmo em PCs que, de acordo com os requisitos de hardware da Microsoft, normalmente não seriam suportados.\n\nMeu aplicativo ajuda você a evitar a compra de um novo computador e contribui ativamente para reduzir o lixo eletrônico desnecessário.\n\nNormalmente, não cobro nada pelos meus projetos, nem pelo desenvolvimento nem pelo suporte.\nNo entanto, como este aplicativo é significativamente mais abrangente, oferece mais recursos e requer mais suporte, eu agradeceria se você considerasse fazer uma pequena doação voluntária, se puder.\n\nClaro, somente se você quiser e puder pagar.\n\nGostaria de doar no PayPal agora? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Bypass patch canceled by user. User attempted to select a non-removable drive. No USB drive selected for patching. Failed to apply bypass patch: The selected path is not a removable drive. Please select a USB drive. Select the USB drive containing your Windows 11 installation files.\nThis feature adds a compatibility patch to bypass certain system requirements.\nCompatible with drives prepared by any tool, including Rufus. Ensure the drive is ready! This will apply compatibility bypass settings on the selected USB drive. Continue? Bypass patch applied successfully! Flyby11 Upgrading Assistant Apply Compatibility Patch to ISO (Clean Install) Can I upgrade to Windows 11? Did the upgrade work? Drag and drop the Windows 11 ISO to patch it and install on unsupported hardware (Inplace Upgrade). A: You can download the latest ISO from the official Microsoft website or use the Fido Downloader. A: If you've successfully installed Windows 11 and saved some money, feel free to leave a little something as a thank-you here. Click here to donate and show your support. A: Once the ISO is mounted, the setup process runs in the background. The Windows installer starts, guiding you through the steps required to install Windows 11 on your machine. A: Please check the error messages and report it on GitHub. A: Yes, Microsoft has left a backdoor open. This method leverages a feature of the Windows 11 setup process that uses the Windows Server variant of the installation. Unlike the regular Windows 11 setup, this variant skips most hardware compatibility checks. A: According to Microsoft, you should throw your PC away. I would suggest installing Linux on it and moving away from Windows. A: The developer is Belim, also known as Builtbybel, who has contributed a lot of code to the Windows community. Click here to learn more about the developer's work. Download via Fido (Recommended) Microsoft Site Frequently Asked Questions (FAQ) Q: Where can I get the latest Windows 11 ISO? Q: How can I support the developer? Q: How does the setup process work once the ISO is mounted? Q: What if I encounter issues during installation? Q: Is it legal to use this method? Q: What are my alternatives if my PC is not supported? Q: Who is the developer? 1. The device is running a currently supported version of Windows 10. If the device isn't currently running a supported version of Windows 10, upgrade to a supported version of Windows 10. 2. The device meets 1. Download and run the 2. Select the following Windows Update shortcut and then select the Check for updates button: 3. Your device does not meet the official requirements for Windows 11? You can apply a compatibility patch to enable the Inplace Upgrade via Windows Update. An existing Windows 10 device can be upgraded to Windows 11 if it meets the following criteria: To see if a Windows 10 device is eligible to upgrade to Windows 11, follow one of these options: the minimum hardware specifications to run Windows 11. WhyNotWin11 app to confirm your device meets the minimum system requirements Windows 11 installation can now proceed. Please follow the instructions in the setup window. Install You're ready to install Windows 11 on unsupported hardware! Ignore the 'Windows Server' prompt; you're all set! Install Starting the setup process with elevated privileges... Install Oops! Something went wrong: Mounting Mounting the ISO... Hang tight! Mounting Failed to mount the ISO. Please try again. Mounting ISO mounted successfully! Let's get this Windows 11 ready! Mounting Almost there! We're getting the setup ready... Install Setup file not found in Mounting Select from computer Thank you for using my app!\n\nI developed this application in my free time to help you upgrade from Windows 10 to Windows 11 – even on PCs that, according to Microsoft's hardware requirements, would normally not be supported.\n\nMy app helps you avoid purchasing a new computer and actively contributes to reducing unnecessary electronic waste.\n\nNormally, I do not charge anything for my projects – neither for development nor for support.\nHowever, since this app is significantly more comprehensive, offers more features, and requires more support, I would be grateful if you would consider making a small voluntary donation, if you are able to.\n\nOf course, only if you want to and can afford it.\n\nWould you like to donate on PayPal now? ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.sv-SE.resx ================================================ text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Förbikoppling avbruten av användaren. Användaren försökte välja en icke flyttbar enhet. Ingen USB-enhet har valts för modifiering. Det gick inte att utföra modifieringen av förbikopplingen: Den valda sökvägen är inte en flyttbar enhet. Välj en USB-enhet. Välj USB-enheten som innehåller dina Windows 11-installationsfiler.\nDen här funktionen lägger till en kompatibilitetsändring för att kringgå vissa systemkrav.\nKompatibel med enheter förberedda av alla verktyg, inklusive Rufus. Se till att enheten är klar! Detta kommer att verkställa ändringar för förbikoppling av kompatibilitet på den valda USB-enheten. Fortsätta? Förbikoppling klar! Flyby11 uppgraderingsassistent Applicera kompatibilitetskorrigering på ISO-filen (ren installation) Kan jag uppgradera till Windows 11? Fungerade uppgraderingen? Dra och släpp Windows 11 ISO-filen för att förbikoppla och installera den på hårdvara som inte stöds (uppgradering på plats). A: Du kan ladda ner den senaste ISO-filen från den officiella Microsoft-webbplatsen eller använda Fido Downloader. A: Om du lyckas installera Windows 11 och sparat lite pengar, lämna gärna något som tack för hjälpen här. Klicka här för att donera och visa ditt stöd. A: När ISO-filen är monterad körs installationsprocessen i bakgrunden. Windows-installationsprogrammet startar och guidar dig genom stegen som krävs för att installera Windows 11 på din dator. A: Kontrollera felmeddelandena och rapportera det på GitHub. A: Ja, Microsoft har lämnat en bakdörr öppen. Den här metoden utnyttjar en funktion i installationsprocessen för Windows 11 som använder Windows Server-varianten av installationen. Till skillnad från den vanliga Windows 11-installationen hoppar denna variant över de flesta kontroller av hårdvarukompatibilitet. A: Enligt Microsoft bör du slänga din dator. Jag skulle föreslå att du installerar Linux på den och överger Windows. A: Utvecklaren är Belim även känd som Builtbybel som har bidragit med mycket kod till Windows-communityt. Klicka här för att lära dig mer om utvecklarens arbete. Ladda ner via Fido (rekommenderas) Microsofts webbplats Vanliga frågor (FAQ) Q: Var kan jag få tag i den senaste ISO-filen med Windows 11? Q: Hur kan jag stöda utvecklaren? Q: Hur fungerar installationsprocessen när ISO-filen är monterad? Q: Vad händer om jag stöter på problem under installationen? Q: Är det lagligt att använda denna metoden? Q: Vilka är mina alternativ om min dator inte stöds? Q: Vem är utvecklaren? 1. Enheten kör en version av Windows 10 som stöds för närvarande. Om enheten för närvarande inte kör en version av Windows 10 som stöds, uppgradera till en version av Windows 10 som stöds. 2. Enheten uppfyller 1. Ladda ner och kör 2. Välj följande genväg för Windows Update och välj sedan knappen sök efter uppdateringar: 3. Din enhet uppfyller inte de officiella kraven för Windows 11? Du kan använda en kompatibilitetskorrigering för att aktivera uppgradering på plats via Windows Update. En befintlig Windows 10-enhet kan uppgraderas till Windows 11 om den uppfyller följande kriterier: För att kontrollera om en Windows 10-enhet är lämplig att uppgradera till Windows 11, följ ett av dessa alternativ: de minsta hårdvaruspecifikationerna för att köra Windows 11. WhyNotWin11-appen för att bekräfta att din enhet uppfyller de lägsta systemkraven Installationen av Windows 11 kan nu fortsätta. Följ instruktionerna i installationsfönstret. Install Du är redo att installera Windows 11 på hårdvaran som inte stöds! Ignorera fönstret om 'Windows Server'; du är klar! Install Startar installationsprocessen med förhöjda privilegier... Install Hoppsan! Något gick fel: Mounting Monterar ISO-filen... Snart klart! Mounting Det gick inte att montera ISO-filen. Försök igen. Mounting ISO-filen monterad! Låt oss göra Windows 11 klar! Mounting Nästan där! Vi förbereder installationen... Install Installationsfilen hittades inte i Mounting Välj från datorn ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.tr.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Baypas yaması kullanıcı tarafından iptal edildi. Kullanıcı çıkarılamayan bir sürücü seçmeye çalıştı. Yama için USB sürücüsü seçilmedi. Baypas yaması uygulanamadı: Seçilen yol çıkarılabilir bir sürücü değil. Lütfen bir USB sürücüsü seçin. Windows 11 kurulum dosyalarınızı içeren USB sürücüsünü seçin.\nBu özellik, belirli sistem gereksinimlerini atlatmak için bir uyumluluk yaması ekler.\nRufus dahil olmak üzere herhangi bir araç tarafından hazırlanan sürücülerle uyumludur. Sürücünün hazır olduğundan emin olun! Bu, seçili USB sürücüsünde uyumluluk atlama ayarlarını uygulayacaktır. Devam etmek istiyor musunuz? Baypas yaması başarıyla uygulandı! Flyby11 Yükseltme Asistanı Uyumluluk Yaması'nı ISO'ya Uygula (Temiz Kurulum) Windows 11'e yükseltebilir miyim? Yükseltme işe yaradı mı? Windows 11 ISO'yu sürükleyip bırakarak yama yapın ve desteklenmeyen donanımlara yükleyin (Yerinde Yükseltme). C: En son ISO'yu resmi Microsoft web sitesinden indirebilir veya Fido Downloader'ı kullanabilirsiniz. C: Windows 11'i başarıyla kurduysanız ve biraz para biriktirdiyseniz, buraya teşekkür amaçlı küçük bir şey bırakmaktan çekinmeyin. Bağışta bulunmak ve desteğinizi göstermek için buraya tıklayın. C: ISO yüklendikten sonra kurulum süreci arka planda çalışır. Windows yükleyicisi başlar ve makinenize Windows 11'i yüklemek için gereken adımlarda size rehberlik eder. C: Lütfen hata mesajlarını kontrol edin ve GitHub'a bildirin. C: Evet, Microsoft bir arka kapıyı açık bıraktı. Bu yöntem, kurulumun Windows Server varyantını kullanan Windows 11 kurulum sürecinin bir özelliğinden yararlanır. Normal Windows 11 kurulumunun aksine, bu varyant çoğu donanım uyumluluk denetimini atlar. C: Microsoft'a göre, bilgisayarınızı atmalısınız. Ben ona Linux kurmanızı ve Windows'tan uzaklaşmanızı öneririm. C: Geliştirici, Windows topluluğuna çok sayıda kod katkıda bulunan, aynı zamanda Builtbybel olarak da bilinen Belim'dir. Geliştiricinin çalışmaları hakkında daha fazla bilgi edinmek için buraya tıklayın. Fido üzerinden indirin (Önerilen) Microsoft Site Sıkça Sorulan Sorular (SSS) S: En son Windows 11 ISO'sunu nereden edinebilirim? S: Geliştiriciye nasıl destek olabilirim? S: ISO yüklendikten sonra kurulum süreci nasıl işliyor? S: Kurulum sırasında sorunlarla karşılaşırsam ne olur? S: Bu yöntemi kullanmak yasal mı? S: Bilgisayarım desteklenmiyorsa alternatiflerim nelerdir? S: Geliştirici kimdir? 1. Cihaz şu anda desteklenen bir Windows 10 sürümü çalıştırıyor. Cihaz şu anda desteklenen bir Windows 10 sürümü çalıştırmıyorsa, desteklenen bir Windows 10 sürümüne yükseltin. 2. Cihaz karşılar 1. İndirin ve çalıştırın 2. Aşağıdaki Windows Update kısayolunu seçin ve ardından Güncelleştirmeleri denetle düğmesini seçin: 3. Cihazınız Windows 11'in resmi gereksinimlerini karşılamıyor mu? Windows Update aracılığıyla Yerinde Yükseltmeyi etkinleştirmek için bir uyumluluk yaması uygulayabilirsiniz. Mevcut bir Windows 10 cihazı, aşağıdaki ölçütleri karşılıyorsa Windows 11'e yükseltilebilir: Bir Windows 10 cihazının Windows 11'e yükseltmeye uygun olup olmadığını görmek için şu seçeneklerden birini izleyin: Windows 11'i çalıştırmak için gereken minimum donanım özellikleri. Cihazınızın minimum sistem gereksinimlerini karşıladığını doğrulamak için WhyNotWin11 uygulaması Windows 11 kurulumu artık devam edebilir. Lütfen kurulum penceresindeki talimatları izleyin. Kur Desteklenmeyen donanıma Windows 11 yüklemeye hazırsınız! 'Windows Server' istemini görmezden gelin; artık hazırsınız! Kur Kurulum süreci yükseltilmiş ayrıcalıklarla başlatılıyor... Kur Oops! Bir şeyler ters gitti: Yükle ISO montajı... Sıkı durun! Yükle ISO bağlanamadı. Lütfen tekrar deneyin. Yükle ISO başarıyla bağlandı! Hadi Windows 11'i hazırlayalım! Yükle Neredeyse bitti! Kurulumu hazırlıyoruz... Kurulum dosyası bulunamadı Yükle ================================================ FILE: Flyby11-deprecated/Flyby11/Locales/Strings.zh-CN.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 用户取消安装绕过补丁 用户尝试选择了一个不可弹出的设备。 未选择 USB 设备来安装绕过补丁。 安装绕过补丁失败: 已选位置不是一个可弹出的设备。请选择一个正确的 USB 设备。 请选择包含 Windows 11 安装文件的 USB 设备。\n该功能用于添加兼容性补丁来绕过某些强制要求。\n兼容由任何工具(包括 Rufus)准备的设备。请确保设备已准备好! 即将在 USB 设备中安装兼容性绕过补丁。继续? 绕过补丁已成功安装! Flyby11 升级助手 为 ISO 应用兼容性补丁(全新安装) 我的设备支持升级到 Windows 11 吗? 升级对您来说有用吗? 拖入 Windows 11 ISO 文件来安装补丁,以支持安装进不支持的硬件(直接升级)。 答:您可从微软官方网站或 Fido 下载器下载最新版 ISO 答:如果您因本程序成功安装了 Windows 11,并让您省了点钱。可以随意在这里留下点小小的感谢! 点击这里捐赠并表达您的支持。 答:一旦 ISO 文件被挂载,安装过程将在后台运行。Windows 安装程序会启动,并引导您完成安装 Windows 11 所需的各项步骤。 答:请检查错误信息,并将其报告到 GitHub 上。 答:是的,微软确实留下了一个后门。此方法利用了 Windows 11 安装过程中的一个功能,该功能使用了 Windows Server 版本的安装程序。与常规的 Windows 11 安装程序不同,这个版本会跳过大多数硬件兼容性检查。 答:根据微软的说法,你应该扔掉你的电脑。但我建议你在电脑上安装 Linux,远离 Windows。 答:开发者是 Belim,也被称为 Builtbybel,他为 Windows 社区贡献了大量代码。 点击此处了解更多关于该开发者工作的信息。 通过 Fido 下载(推荐) 微软官网 常见问题解答 问:我在哪里可以下载最新的 Windows 11 ISO 文件? 问:如何支持开发者? 问:挂载 ISO 文件后,安装过程是如何进行的? 问:如果在安装过程中遇到问题怎么办? 问:使用这种方式是否合法? 问:如果我的电脑不受支持,有哪些替代方案? 问:开发者是谁? 1. 设备正在运行受支持版本的 Windows 10。若设备当前未运行受支持的 Windows 10 版本,则请升级到受支持的 Windows 10 版本。 2. 该设备符合 1. 下载并运行 2. 单击下方 Windows 更新按钮,然后单击检查更新按钮: 3. 您的设备不支持 Windows 11 官方安装流程?您可安装兼容补丁来启用 Windows 更新中的内置升级 若满足以下条件,当前运行 Windows 10 的设备可直接升级到 Windows11: 要查看 Windows 10 设备是否符合升级到 Windows 11 的条件,请按照以下其中一个选项来检查: 运行 Windows 11 的最低硬件规格要求。 WhyNotWin11 应用来确认您的设备是否符合最低硬件规格要求 现在可以继续 Windows 11 的安装。请按照安装窗口中的说明进行操作。 Install 您已准备好在不受支持的设备中安装 Windows 11!请忽略 'Windows Server' 提示;一切已准备就绪。 Install 正在以管理员权限启动安装程序… Install 啊噢!发生错误: Mounting 正在挂载 ISO… 请稍后! Mounting 无法挂载 ISO。请重试。 Mounting 已成功挂载 ISO!让我们准备好安装 Windows 11 吧! Mounting 马上就完成了!我们正在完成安装中… Install 未在此处找到安装文件: Mounting 从计算机中选择 ================================================ FILE: Flyby11-deprecated/Flyby11/Logger.cs ================================================ using System; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace Flyby11 { public class Logger { private MainForm mainForm; public Logger(MainForm mainForm) { this.mainForm = mainForm ?? throw new ArgumentNullException(nameof(mainForm)); } // Log method for a single string public void Log(string message, Color color, float fontSize = 10.5f) { if (mainForm.InvokeRequired) { mainForm.Invoke(new Action(() => Log(message, color, fontSize))); return; } AppendMessageToConversation(message, color, fontSize); // Append message to conversation } private void AppendMessageToConversation(string message, Color color, float fontSize) { Label statusLabel = mainForm.Controls.Find("statusLabel", true).FirstOrDefault() as Label; if (statusLabel != null) { statusLabel.Text = ""; statusLabel.Text += "\r\n" + message; statusLabel.ForeColor = color; statusLabel.Font = new Font(statusLabel.Font.FontFamily, fontSize); statusLabel.TextAlign = ContentAlignment.MiddleCenter; } } } } ================================================ FILE: Flyby11-deprecated/Flyby11/MainForm.Designer.cs ================================================ namespace Flyby11 { partial class MainForm { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.panelDragDrop = new System.Windows.Forms.Panel(); this.dropdownOptions = new System.Windows.Forms.ComboBox(); this.btnExperience = new System.Windows.Forms.Button(); this.statusLabel = new System.Windows.Forms.Label(); this.panelFAQ = new System.Windows.Forms.Panel(); this.panelContainer = new System.Windows.Forms.Panel(); this.panelMain = new System.Windows.Forms.Panel(); this.chkAdvancedMode = new System.Windows.Forms.CheckBox(); this.panelDragDrop.SuspendLayout(); this.panelContainer.SuspendLayout(); this.panelMain.SuspendLayout(); this.SuspendLayout(); // // panelDragDrop // this.panelDragDrop.AllowDrop = true; this.panelDragDrop.Anchor = System.Windows.Forms.AnchorStyles.None; this.panelDragDrop.BackColor = System.Drawing.Color.Transparent; this.panelDragDrop.Controls.Add(this.dropdownOptions); this.panelDragDrop.Controls.Add(this.btnExperience); this.panelDragDrop.Controls.Add(this.statusLabel); this.panelDragDrop.Location = new System.Drawing.Point(57, 190); this.panelDragDrop.Name = "panelDragDrop"; this.panelDragDrop.Size = new System.Drawing.Size(436, 256); this.panelDragDrop.TabIndex = 0; this.panelDragDrop.DragDrop += new System.Windows.Forms.DragEventHandler(this.panelDragDrop_DragDrop); this.panelDragDrop.DragEnter += new System.Windows.Forms.DragEventHandler(this.panelDragDrop_DragEnter); this.panelDragDrop.Paint += new System.Windows.Forms.PaintEventHandler(this.panelDragDrop_Paint); // // dropdownOptions // this.dropdownOptions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.dropdownOptions.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.dropdownOptions.Font = new System.Drawing.Font("Segoe UI Variable Display", 11.5F); this.dropdownOptions.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(26)))), ((int)(((byte)(26)))), ((int)(((byte)(26))))); this.dropdownOptions.FormattingEnabled = true; this.dropdownOptions.Location = new System.Drawing.Point(51, 205); this.dropdownOptions.Name = "dropdownOptions"; this.dropdownOptions.Size = new System.Drawing.Size(348, 28); this.dropdownOptions.TabIndex = 507; this.dropdownOptions.SelectedIndexChanged += new System.EventHandler(this.dropdownOptions_SelectedIndexChanged); // // btnExperience // this.btnExperience.AutoEllipsis = true; this.btnExperience.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(239)))), ((int)(((byte)(237))))); this.btnExperience.Cursor = System.Windows.Forms.Cursors.Hand; this.btnExperience.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(141)))), ((int)(((byte)(141)))), ((int)(((byte)(141))))); this.btnExperience.FlatAppearance.BorderSize = 0; this.btnExperience.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Gainsboro; this.btnExperience.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12F, System.Drawing.FontStyle.Bold); this.btnExperience.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(26)))), ((int)(((byte)(26)))), ((int)(((byte)(26))))); this.btnExperience.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnExperience.Location = new System.Drawing.Point(21, 195); this.btnExperience.Name = "btnExperience"; this.btnExperience.Padding = new System.Windows.Forms.Padding(30, 0, 0, 0); this.btnExperience.Size = new System.Drawing.Size(387, 49); this.btnExperience.TabIndex = 506; this.btnExperience.TabStop = false; this.btnExperience.UseCompatibleTextRendering = true; this.btnExperience.UseVisualStyleBackColor = false; // // statusLabel // this.statusLabel.Anchor = System.Windows.Forms.AnchorStyles.None; this.statusLabel.AutoEllipsis = true; this.statusLabel.BackColor = System.Drawing.Color.Transparent; this.statusLabel.Font = new System.Drawing.Font("Segoe UI Variable Text Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.statusLabel.Location = new System.Drawing.Point(39, 35); this.statusLabel.Name = "statusLabel"; this.statusLabel.Size = new System.Drawing.Size(352, 142); this.statusLabel.TabIndex = 0; this.statusLabel.Text = "Move ISO here"; this.statusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.statusLabel.UseCompatibleTextRendering = true; // // panelFAQ // this.panelFAQ.AutoScroll = true; this.panelFAQ.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); this.panelFAQ.Dock = System.Windows.Forms.DockStyle.Right; this.panelFAQ.Location = new System.Drawing.Point(589, 0); this.panelFAQ.Name = "panelFAQ"; this.panelFAQ.Size = new System.Drawing.Size(331, 609); this.panelFAQ.TabIndex = 207; // // panelContainer // this.panelContainer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); this.panelContainer.Controls.Add(this.panelMain); this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill; this.panelContainer.Location = new System.Drawing.Point(0, 0); this.panelContainer.Name = "panelContainer"; this.panelContainer.Size = new System.Drawing.Size(589, 609); this.panelContainer.TabIndex = 209; // // panelMain // this.panelMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelMain.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(243)))), ((int)(((byte)(243)))), ((int)(((byte)(243))))); this.panelMain.Controls.Add(this.chkAdvancedMode); this.panelMain.Controls.Add(this.panelDragDrop); this.panelMain.Location = new System.Drawing.Point(5, 3); this.panelMain.Name = "panelMain"; this.panelMain.Size = new System.Drawing.Size(580, 596); this.panelMain.TabIndex = 1; // // chkAdvancedMode // this.chkAdvancedMode.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.chkAdvancedMode.AutoSize = true; this.chkAdvancedMode.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.chkAdvancedMode.Location = new System.Drawing.Point(8, 566); this.chkAdvancedMode.Name = "chkAdvancedMode"; this.chkAdvancedMode.Size = new System.Drawing.Size(397, 17); this.chkAdvancedMode.TabIndex = 1; this.chkAdvancedMode.Text = "Enable advanced upgrade mode (bypass compatibility and driver checks)"; this.chkAdvancedMode.UseVisualStyleBackColor = true; this.chkAdvancedMode.CheckedChanged += new System.EventHandler(this.chkAdvancedMode_CheckedChanged); // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.AutoScroll = true; this.BackColor = System.Drawing.Color.WhiteSmoke; this.ClientSize = new System.Drawing.Size(920, 609); this.Controls.Add(this.panelContainer); this.Controls.Add(this.panelFAQ); this.Name = "MainForm"; this.ShowIcon = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Flyby11 Upgrading Assistant"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.panelDragDrop.ResumeLayout(false); this.panelContainer.ResumeLayout(false); this.panelMain.ResumeLayout(false); this.panelMain.PerformLayout(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Panel panelDragDrop; private System.Windows.Forms.Label statusLabel; private System.Windows.Forms.Panel panelFAQ; private System.Windows.Forms.Panel panelContainer; private System.Windows.Forms.Panel panelMain; private System.Windows.Forms.Button btnExperience; private System.Windows.Forms.ComboBox dropdownOptions; private System.Windows.Forms.CheckBox chkAdvancedMode; } } ================================================ FILE: Flyby11-deprecated/Flyby11/MainForm.cs ================================================ using System; using System.Diagnostics; using System.Drawing; using System.IO; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; using Views; namespace Flyby11 { public partial class MainForm : Form { private readonly IsoHandler _isoHandler; private Logger logger; private ClippyUI clippyUI; public FAQHandler _faqHandler { get; private set; } // Import the external function to check for POPCNT and SSE4.2 features [DllImport("CpuCheckNative.dll", CallingConvention = CallingConvention.Cdecl)] public static extern bool HasPopcnt(); public MainForm() { InitializeComponent(); logger = new Logger(this); _isoHandler = new IsoHandler(UpdateStatusLabel); _faqHandler = new FAQHandler(panelFAQ, UpdateStatusLabel); _faqHandler.InitializeFAQ(); InitializeLocalizedStrings(); InitializeClippyUI(); // Drag and drop the Windows 11 ISO to patch it and install on unsupported hardware (Inplace Upgrade). UpdateStatusLabel(Locales.Strings.ctl_statusLabel); // Check if the DLL exists before performing the compatibility check if (File.Exists("CpuCheckNative.dll")) { // Perform system compatibility check if the DLL is found bool hasPopcnt = CheckHasPopcnt(); // Check if the CPU supports POPCNT bool hasSse42 = hasPopcnt; // If POPCNT is supported, SSE4.2 is likely supported as well new CompatibilityForm(hasPopcnt, hasSse42).ShowDialog(); } else { MessageBox.Show( "A preliminary compatibility check can be performed by downloading the 'CpuCheckNative.dll' from GitHub " + "and placing it in the app folder.\nYou'll then get detailed feedback about your system's chances for a successful upgrade.", "Flyby11 - Heads-up from Clippy", MessageBoxButtons.OK, MessageBoxIcon.Warning ); } } // Checks if POPCNT and SSE4.2 are supported by the CPU using the external DLL function private bool CheckHasPopcnt() { try { return HasPopcnt(); // Call the external function to check for POPCNT and SSE4.2 } catch (Exception ex) { UpdateStatusLabel($"Error checking system compatibility: {ex.Message}"); return false; } } private void InitializeLocalizedStrings() { dropdownOptions.Items.Add("More options..."); dropdownOptions.Items.Add(Locales.Strings.ctl_linkSelectComputer); dropdownOptions.Items.Add(Locales.Strings.ctl_inkCompPatch); dropdownOptions.Items.Add(Locales.Strings.ctl_linkCiuv); dropdownOptions.Items.Add("(Vote) " + Locales.Strings.ctl_linkVote); // "Did the upgrade work?" dropdownOptions.Items.Add("(App) Customize Windows 11 with CrapFixer"); // "CrapFixer Repository" dropdownOptions.Items.Add("Troubleshoot Compatibility Issues"); // Problems form dropdownOptions.SelectedIndex = 0; } private void InitializeClippyUI() { clippyUI = new ClippyUI(this, logger); clippyUI.SetClippyPosition(this); clippyUI.Show(); } private void panelDragDrop_Paint(object sender, PaintEventArgs e) { var borderThickness = 8; var cornerRadius = 24; var glowThickness = 2; // Thin glow layer var control = (Control)sender; var rect = new Rectangle( borderThickness / 2, borderThickness / 2, control.Width - borderThickness, control.Height - borderThickness ); e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; // subtle shadow using (var shadowBrush = new SolidBrush(Color.FromArgb(30, 0, 0, 0))) { var shadowRect = new Rectangle(6, 6, control.Width - 12, control.Height - 12); using (var shadowPath = new System.Drawing.Drawing2D.GraphicsPath()) { shadowPath.AddArc(shadowRect.X, shadowRect.Y, cornerRadius, cornerRadius, 180, 90); shadowPath.AddArc(shadowRect.Right - cornerRadius, shadowRect.Y, cornerRadius, cornerRadius, 270, 90); shadowPath.AddArc(shadowRect.Right - cornerRadius, shadowRect.Bottom - cornerRadius, cornerRadius, cornerRadius, 0, 90); shadowPath.AddArc(shadowRect.X, shadowRect.Bottom - cornerRadius, cornerRadius, cornerRadius, 90, 90); shadowPath.CloseFigure(); e.Graphics.FillPath(shadowBrush, shadowPath); } } //frosted glass background (simulated with semi-transparent gradient) using (var frostedBrush = new System.Drawing.Drawing2D.LinearGradientBrush( new Rectangle(0, 0, control.Width, control.Height), Color.FromArgb(220, 240, 245, 255), // Very light blue (mica-like) Color.FromArgb(220, 235, 230, 255), // Very light lavender System.Drawing.Drawing2D.LinearGradientMode.Vertical)) { using (var frostedPath = new System.Drawing.Drawing2D.GraphicsPath()) { frostedPath.AddArc(rect.X, rect.Y, cornerRadius, cornerRadius, 180, 90); frostedPath.AddArc(rect.Right - cornerRadius, rect.Y, cornerRadius, cornerRadius, 270, 90); frostedPath.AddArc(rect.Right - cornerRadius, rect.Bottom - cornerRadius, cornerRadius, cornerRadius, 0, 90); frostedPath.AddArc(rect.X, rect.Bottom - cornerRadius, cornerRadius, cornerRadius, 90, 90); frostedPath.CloseFigure(); e.Graphics.FillPath(frostedBrush, frostedPath); } } // Glowing border with outer layer, subtle glow using (var glowBrush = new System.Drawing.Drawing2D.LinearGradientBrush( rect, Color.FromArgb(100, 150, 200, 255), // Soft blue glow Color.FromArgb(100, 200, 150, 255), // Soft lavender glow System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal)) using (var glowPen = new Pen(glowBrush, borderThickness + glowThickness)) { using (var glowPath = new System.Drawing.Drawing2D.GraphicsPath()) { glowPath.AddArc(rect.X, rect.Y, cornerRadius, cornerRadius, 180, 90); glowPath.AddArc(rect.Right - cornerRadius, rect.Y, cornerRadius, cornerRadius, 270, 90); glowPath.AddArc(rect.Right - cornerRadius, rect.Bottom - cornerRadius, cornerRadius, cornerRadius, 0, 90); glowPath.AddArc(rect.X, rect.Bottom - cornerRadius, cornerRadius, cornerRadius, 90, 90); glowPath.CloseFigure(); e.Graphics.DrawPath(glowPen, glowPath); } } // Main border (inner layer, solid but soft) using (var borderBrush = new System.Drawing.Drawing2D.LinearGradientBrush( rect, Color.FromArgb(255, 160, 196, 255), // Soft Azure Blue Color.FromArgb(255, 199, 135, 255), // Vibrant Lavender System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal)) using (var borderPen = new Pen(borderBrush, borderThickness)) { using (var borderPath = new System.Drawing.Drawing2D.GraphicsPath()) { borderPath.AddArc(rect.X, rect.Y, cornerRadius, cornerRadius, 180, 90); borderPath.AddArc(rect.Right - cornerRadius, rect.Y, cornerRadius, cornerRadius, 270, 90); borderPath.AddArc(rect.Right - cornerRadius, rect.Bottom - cornerRadius, cornerRadius, cornerRadius, 0, 90); borderPath.AddArc(rect.X, rect.Bottom - cornerRadius, cornerRadius, cornerRadius, 90, 90); borderPath.CloseFigure(); e.Graphics.DrawPath(borderPen, borderPath); } } } private async Task HandleIsoInput(object sender, EventArgs e) { string isoPath = null; bool experimentalEnabled = chkAdvancedMode.Checked; if (e is DragEventArgs dragEvent && dragEvent.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])dragEvent.Data.GetData(DataFormats.FileDrop); if (files.Length == 1 && Path.GetExtension(files[0]).Equals(".iso", StringComparison.OrdinalIgnoreCase)) { isoPath = files[0]; } } // Always show dialog if no ISO found yet (e.g. from dropdownOptions) if (isoPath == null) { using (OpenFileDialog openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "ISO Files (*.iso)|*.iso"; openFileDialog.Title = "Select an ISO File"; if (openFileDialog.ShowDialog() == DialogResult.OK) { isoPath = openFileDialog.FileName; } } } if (!string.IsNullOrEmpty(isoPath) && File.Exists(isoPath)) { await _isoHandler.HandleIso(isoPath, experimentalEnabled); } } private void panelDragDrop_DragEnter(object sender, DragEventArgs e) { // Check if the file is an ISO if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); e.Effect = (files.Length == 1 && Path.GetExtension(files[0]).Equals(".iso", StringComparison.OrdinalIgnoreCase)) ? DragDropEffects.Copy : DragDropEffects.None; } } private async void panelDragDrop_DragDrop(object sender, DragEventArgs e) { await HandleIsoInput(sender, e); } // Update the status label private void UpdateStatusLabel(string message) { statusLabel.Text = message; statusLabel.Refresh(); } private async void dropdownOptions_SelectedIndexChanged(object sender, EventArgs e) { { // Ignore the default "More options..." item if (dropdownOptions.SelectedIndex <= 0) return; switch (dropdownOptions.SelectedIndex) { case 1: // Select Computer await HandleIsoInput(sender, null); break; case 2: // Compatibility Patch HandleCompatibilityPatch(); break; case 3: // Can I Upgrade View HandleCanIUpgradeView(); break; case 4: // Open the GitHub discussion for feedback Process.Start("https://github.com/builtbybel/Flyby11/discussions/72"); break; case 5: // Open CFixer Repository Process.Start("https://github.com/builtbybel/Crapfixer/"); break; case 6: // Open Troubleshoot Compatibility Issues ProblemsForm problemsForm = new ProblemsForm(); problemsForm.ShowDialog(); break; } // Reset selection back to default prompt after action dropdownOptions.SelectedIndex = 0; } } /// /// Handles the event for the compatibility patch. /// private void HandleCompatibilityPatch() { using (var folderDialog = new FolderBrowserDialog()) { /* Select the USB drive containing your Windows 11 installation files. " + "This feature adds a compatibility patch to bypass certain system requirements. " + "Compatible with drives prepared by any tool, including Rufus. Ensure the drive is ready! */ folderDialog.Description = Locales.Strings.compPatch_msgSelectDrive.Replace(@"\n", Environment.NewLine); if (folderDialog.ShowDialog() == DialogResult.OK) { string selectedPath = folderDialog.SelectedPath; var driveInfo = new DriveInfo(Path.GetPathRoot(selectedPath)); if (driveInfo.DriveType == DriveType.Removable && driveInfo.IsReady) { if (MessageBox.Show(Locales.Strings.compPatch_msgSelectDriveConfirm, //This will apply compatibility bypass settings on the selected USB drive.Continue ? "Apply Bypass Patch", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) { try { _isoHandler.CreateUnattendXml(selectedPath); // Bypass patch applied successfully! MessageBox.Show(Locales.Strings.compPatch_msgSuccess, "Apply Bypass Patch", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateStatusLabel(Locales.Strings.compPatch_msgSuccess); } catch (Exception ex) { // Failed to apply bypass patch: UpdateStatusLabel($"{Locales.Strings.compPatch_msgFailedEx} {ex.Message}"); } } else { UpdateStatusLabel(Locales.Strings.compPatch_debugCancel); // Bypass patch canceled by user. } } else { // The selected path is not a removable drive. Please select a USB drive. MessageBox.Show(Locales.Strings.compPatch_msgNotRemovableDrive, "Invalid Selection", MessageBoxButtons.OK, MessageBoxIcon.Error); // User attempted to select a non-removable drive. UpdateStatusLabel(Locales.Strings.compPatch_debugNotRemovableDrive); } } else { UpdateStatusLabel(Locales.Strings.compPatch_debugNoUSBDrive); // No USB drive selected for patching. } } } /// /// Opens the "Can I Upgrade" view. /// private void HandleCanIUpgradeView() { CanIUpgradeView canIUpgradeView = new CanIUpgradeView(); SwitchView.SetView(canIUpgradeView, panelContainer); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { string raw = Locales.Strings.msgClosing; string message = Regex.Unescape(raw); DialogResult result = MessageBox.Show( message, "Support @Belim", MessageBoxButtons.YesNo, MessageBoxIcon.Information ); if (result == DialogResult.Yes) { System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { FileName = "https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG", UseShellExecute = true }); } } private void chkAdvancedMode_CheckedChanged(object sender, EventArgs e) { if (chkAdvancedMode.Checked) { var result = MessageBox.Show( "You are enabling an advanced setup mode. This option adds extra setup parameters that may improve compatibility on unsupported hardware. " + "\r\nSuccess may vary depending on your system and drivers.\n\nDo you want to continue?", "Advanced Mode Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.No) { chkAdvancedMode.Checked = false; } } } } } ================================================ FILE: Flyby11-deprecated/Flyby11/MainForm.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyby11-deprecated/Flyby11/ProblemsForm.Designer.cs ================================================ namespace Flyby11 { partial class ProblemsForm { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); this.dataGridViewIssues = new System.Windows.Forms.DataGridView(); this.ErrorCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Link = new System.Windows.Forms.DataGridViewLinkColumn(); ((System.ComponentModel.ISupportInitialize)(this.dataGridViewIssues)).BeginInit(); this.SuspendLayout(); // // dataGridViewIssues // this.dataGridViewIssues.AllowUserToAddRows = false; this.dataGridViewIssues.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.dataGridViewIssues.BackgroundColor = System.Drawing.Color.WhiteSmoke; this.dataGridViewIssues.BorderStyle = System.Windows.Forms.BorderStyle.None; this.dataGridViewIssues.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; this.dataGridViewIssues.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; this.dataGridViewIssues.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridViewIssues.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.ErrorCode, this.Link}); this.dataGridViewIssues.Dock = System.Windows.Forms.DockStyle.Fill; this.dataGridViewIssues.GridColor = System.Drawing.SystemColors.Control; this.dataGridViewIssues.Location = new System.Drawing.Point(0, 0); this.dataGridViewIssues.Name = "dataGridViewIssues"; this.dataGridViewIssues.ReadOnly = true; this.dataGridViewIssues.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Control; dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI Variable Display", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.WindowText; dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; this.dataGridViewIssues.RowHeadersDefaultCellStyle = dataGridViewCellStyle2; this.dataGridViewIssues.RowHeadersVisible = false; this.dataGridViewIssues.Size = new System.Drawing.Size(645, 377); this.dataGridViewIssues.TabIndex = 0; this.dataGridViewIssues.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridViewIssues_CellContentClick); // // ErrorCode // this.ErrorCode.FillWeight = 149.2386F; this.ErrorCode.HeaderText = "ErrorCode"; this.ErrorCode.Name = "ErrorCode"; this.ErrorCode.ReadOnly = true; // // Link // this.Link.FillWeight = 50.76142F; this.Link.HeaderText = "Link"; this.Link.Name = "Link"; this.Link.ReadOnly = true; // // ProblemsForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(645, 377); this.Controls.Add(this.dataGridViewIssues); this.Name = "ProblemsForm"; this.ShowIcon = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Troubleshoot compatibility issues"; this.Load += new System.EventHandler(this.ProblemsForm_Load); ((System.ComponentModel.ISupportInitialize)(this.dataGridViewIssues)).EndInit(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.DataGridView dataGridViewIssues; private System.Windows.Forms.DataGridViewTextBoxColumn ErrorCode; private System.Windows.Forms.DataGridViewLinkColumn Link; } } ================================================ FILE: Flyby11-deprecated/Flyby11/ProblemsForm.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows.Forms; namespace Flyby11 { public partial class ProblemsForm : Form { private readonly Dictionary _issues = new Dictionary() { {"Can't upgrade to Windows 11 – Error 0x80888002","https://github.com/builtbybel/Flyby11/discussions/135"}, { "Upgrading without losing all programs and settings", "https://github.com/builtbybel/Flyby11/discussions/54"}, { "Upgrade Driver issue 0xC1900101", "https://github.com/builtbybel/Flyby11/issues/157"}, { "We are enable to complete your request at this time", "https://github.com/builtbybel/Flyby11/issues/158"}, { "Upgrade succeeded, but future updates not possible ", "https://github.com/builtbybel/Flyby11/discussions/144"}, { "We couldn't install Windows Server - We've set your PC back the way it was Error 0xC1900101 - 0x20017", "https://github.com/builtbybel/Flyby11/issues/103 "}, { "Mounting ISO fails", "https://github.com/builtbybel/Flyby11/issues/156"}, { "Can't find your issue? Browse the community discussions for help", "https://github.com/builtbybel/Flyby11/discussions"}, }; public ProblemsForm() { InitializeComponent(); } private void ProblemsForm_Load(object sender, EventArgs e) { foreach (var kv in _issues) { dataGridViewIssues.Rows.Add(kv.Key, "Details…"); } } private void dataGridViewIssues_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (dataGridViewIssues.Columns[e.ColumnIndex] is DataGridViewLinkColumn && e.RowIndex >= 0) { var code = dataGridViewIssues.Rows[e.RowIndex].Cells["ErrorCode"].Value.ToString(); if (_issues.TryGetValue(code, out var url)) { System.Diagnostics.Process.Start(new ProcessStartInfo { FileName = url, UseShellExecute = true }); } } } } } ================================================ FILE: Flyby11-deprecated/Flyby11/ProblemsForm.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True True ================================================ FILE: Flyby11-deprecated/Flyby11/Program.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyby11 { internal static class Program { /// /// Der Haupteinstiegspunkt für die Anwendung. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } } } ================================================ FILE: Flyby11-deprecated/Flyby11/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Allgemeine Informationen über eine Assembly werden über die folgenden // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, // die einer Assembly zugeordnet sind. [assembly: AssemblyTitle("Flyby11")] [assembly: AssemblyDescription("Bypassing Windows 11 hardware requirements")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("A Belim app creation")] [assembly: AssemblyProduct("Flyby11")] [assembly: AssemblyCopyright("Copyright © 2025 A Belim app creation")] [assembly: AssemblyTrademark("Builtbybel")] [assembly: AssemblyCulture("")] // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. [assembly: ComVisible(false)] // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird [assembly: Guid("503af34b-7544-4c43-a099-2b948c3ff49a")] // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: // // Hauptversion // Nebenversion // Buildnummer // Revision // [assembly: AssemblyVersion("3.10.510")] [assembly: AssemblyFileVersion("3.10.510")] ================================================ FILE: Flyby11-deprecated/Flyby11/Properties/Resources.Designer.cs ================================================ //------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. // Laufzeitversion:4.0.30319.42000 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. // //------------------------------------------------------------------------------ namespace Flyby11.Properties { using System; /// /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. /// // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Flyby11.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } } } ================================================ FILE: Flyby11-deprecated/Flyby11/Properties/Resources.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyby11-deprecated/Flyby11/Properties/Settings.Designer.cs ================================================ //------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. // Laufzeitversion:4.0.30319.42000 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. // //------------------------------------------------------------------------------ namespace Flyby11.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.12.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); public static Settings Default { get { return defaultInstance; } } } } ================================================ FILE: Flyby11-deprecated/Flyby11/Properties/Settings.settings ================================================  ================================================ FILE: Flyby11-deprecated/Flyby11/SwitchView.cs ================================================ using System.Windows.Forms; namespace Views { public static class SwitchView { public static Control PreviousView { get; private set; } public static Control DefaultView { get; set; } // Store the default view (panelMain) // Switch to a new view public static void SetView(Control newView, Panel targetPanel) { // If there's already a view in the panel, save it as PreviousView if (targetPanel.Controls.Count > 0) { // Only save the previous view if it's not the default view (panelMain) if (PreviousView == null) { PreviousView = targetPanel.Controls[0]; // Store current view as PreviousView } } newView.Dock = DockStyle.Fill; targetPanel.Controls.Clear(); targetPanel.Controls.Add(newView); // Add new view to the panel } // Go back to the previous view public static void GoBack(Panel targetPanel) { if (PreviousView != null) { targetPanel.Controls.Clear(); // Clear the current view targetPanel.Controls.Add(PreviousView); // Add the previous view back PreviousView.Dock = DockStyle.Fill; PreviousView = null; // Reset PreviousView after returning to it } else if (DefaultView != null) { // If there's no PreviousView, return to the default (panelMain) targetPanel.Controls.Clear(); targetPanel.Controls.Add(DefaultView); DefaultView.Dock = DockStyle.Fill; } } } } ================================================ FILE: Flyby11-deprecated/Flyby11/app.manifest ================================================  true true ================================================ FILE: Flyby11-deprecated/Flyby11.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.12.35527.113 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flyby11", "Flyby11\Flyby11.csproj", "{503AF34B-7544-4C43-A099-2B948C3FF49A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CpuCheckNative", "CpuCheckNative\CpuCheckNative.vcxproj", "{A2038E07-E21F-4B05-B811-3052A2B014BC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|Any CPU.Build.0 = Debug|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|x64.ActiveCfg = Debug|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|x64.Build.0 = Debug|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|x86.ActiveCfg = Debug|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|x86.Build.0 = Debug|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|Any CPU.ActiveCfg = Release|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|Any CPU.Build.0 = Release|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|x64.ActiveCfg = Release|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|x64.Build.0 = Release|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|x86.ActiveCfg = Release|Any CPU {503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|x86.Build.0 = Release|Any CPU {A2038E07-E21F-4B05-B811-3052A2B014BC}.Debug|Any CPU.ActiveCfg = Debug|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Debug|Any CPU.Build.0 = Debug|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Debug|x64.ActiveCfg = Debug|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Debug|x64.Build.0 = Debug|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Debug|x86.ActiveCfg = Debug|Win32 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Debug|x86.Build.0 = Debug|Win32 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Release|Any CPU.ActiveCfg = Release|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Release|Any CPU.Build.0 = Release|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Release|x64.ActiveCfg = Release|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Release|x64.Build.0 = Release|x64 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Release|x86.ActiveCfg = Release|Win32 {A2038E07-E21F-4B05-B811-3052A2B014BC}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Flyoobe/App.config ================================================ ================================================ FILE: Flyoobe/Features/Ads/FileExlorerAds.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { internal class FileExplorerAds : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"; private const string valueName = "ShowSyncProviderNotifications"; private const int recommendedValue = 0; public override string ID() { return "Disable File Explorer Ads"; } public override string Info() { return "This feature will disable ads in File Explorer."; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); Logger.Log("File Explorer Ads disabled", LogLevel.Info); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); Logger.Log("File Explorer Ads enabled", LogLevel.Info); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/FinishSetupAds.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { internal class FinishSetupAds : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\UserProfileEngagement"; private const string valueName = "ScoobeSystemSettingEnabled"; private const int recommendedValue = 0; public override string ID() => "Disable Finish Setup Ads"; public override string Info() => "This feature will disable the \"Lets finish setting up your device\" and other advertising."; public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/LockScreenAds.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { internal class LockScreenAds : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"; private const string valueName = "RotatingLockScreenOverlayEnabled"; private const string valueName2 = "SubscribedContent-338387Enabled"; private const int recommendedValue = 0; public override string ID() => "Disable Lock Screen Tips and Ads"; public override string Info() => "This feature will disable tips and ads on the lock screen."; public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue) && Utils.IntEquals(keyName, valueName2, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/PersonalizedAds.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { public class PersonalizedAds : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo"; private const string valueName = "Enabled"; private const int recommendedValue = 0; public override string ID() => "Disable Personalized Ads"; public override string Info() => "This feature will disable personalized ads."; public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/SettingsAds.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { internal class SettingsAds : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"; private const string valueName = "SubscribedContent-338393Enabled"; private const string valueName2 = "SubscribedContent-353694Enabled"; private const string valueName3 = "SubscribedContent-353696Enabled"; private const int recommendedValue = 0; public override string ID() => "Disable Settings Ads"; public override string Info() => "This feature will disable ads in settings."; public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} + {valueName2} + {valueName3} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue) && Utils.IntEquals(keyName, valueName2, recommendedValue) && Utils.IntEquals(keyName, valueName3, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, 0, Microsoft.Win32.RegistryValueKind.DWord); Registry.SetValue(keyName, valueName3, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, 1, Microsoft.Win32.RegistryValueKind.DWord); Registry.SetValue(keyName, valueName3, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/StartmenuAds.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { internal class StartmenuAds : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"; private const string valueName = "Start_IrisRecommendations"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable Start menu Ads"; } public override string Info() { return "This feature will disable ads in the start menu."; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/TailoredExperiences.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { internal class TailoredExperiences : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Privacy"; private const string valueName = "TailoredExperiencesWithDiagnosticDataEnabled"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable Tailored experiences"; } public override string Info() { return "Tailored Experiences allows Microsoft to get information from you to deliver personalized tips, ads, and recommendations. Many people would call this telemetry, or even spying."; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/TipsAndSuggestions.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { internal class TipsAndSuggestions : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"; private const string valueName = "SubscribedContent-338389Enabled"; private const int recommendedValue = 0; public override string ID() => "Disable General Tips and Ads"; public override string Info() => "This feature will disable general tips and ads."; public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Ads/WelcomeExperienceAds.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Ads { public class WelcomeExperienceAds : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"; private const string valueName = "SubscribedContent-310093Enabled"; private const int recommendedValue = 0; public override string ID() => "Disable Welcome Experience Ads"; public override string Info() => "This feature will disable ads in the welcome experience."; public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/BrowserSignin.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class BrowserSignin : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "BrowserSignin"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Disable Browser sign in and sync services"; public override string Info() => "This setting controls whether a user can sign into Microsoft Edge with an account to use services such as sync and single sign on"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/DefaultTopSites.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class DefaultTopSites : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "NewTabPageHideDefaultTopSites"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Don't Show Sponsored links in new tab page"; public override string Info() => "Hide default top sites from the new tab page in Microsoft Edge"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/DefautBrowserSetting.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class DefautBrowserSetting : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "DefaultBrowserSettingEnabled"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Disable Microsoft Edge as default browser"; public override string Info() => "Force Edge to stop asking to change default browser"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/EdgeCollections.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class EdgeCollections : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "EdgeCollectionsEnabled"; private const int recommendedValue = 0; public override string ID() => "Disable Access to Collections feature"; public override string Info() => "Enables users to access the Collections feature, allowing them to gather, organize, share, and export content more efficiently with Office integration"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/EdgeShoppingAssistant.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class EdgeShoppingAssistant : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "EdgeShoppingAssistantEnabled"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Disable Shopping assistant"; public override string Info() => "Shopping in Microsoft Edge feature will automatically find you the best prices and coupons from across the web as you shop"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/FirstRunExperience.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class FirstRunExperience : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "HideFirstRunExperience"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Don't Show First Run Experience"; public override string Info() => "Hide home screen and 'Getting Started' on initial launch (from version 80 onwards)"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/GamerMode.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class GamerMode : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "GamerModeEnabled"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Disable Gamer Mode"; public override string Info() => "Microsoft Edge Gamer Mode allows gamers to personalize their browser with gaming themes and gives them the option of enabling Efficiency Mode for PC gaming, the Gaming feed on new tabs, sidebar apps for gamers, and more"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/ImportOnEachLaunch.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class ImportOnEachLaunch : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "ImportOnEachLaunch"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Don't Allow to Import of data from other browsers on each launch"; public override string Info() => "Allow import of data from other browsers on each Microsoft Edge launch"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/StartupBoost.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class StartupBoost : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "StartupBoostEnabled"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Disable Start Boost"; public override string Info() => "Enables Microsoft Edge processes to initialize at operating system startup and restart in the background after the last browser window has been closed"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/TabPageQuickLinks.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class TabPageQuickLinks : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "NewTabPageQuickLinksEnabled"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Don't Show Quick links in new tab page"; public override string Info() => "By default, when you open a new tab, you see a Bing search bar, Bing image of the day set as the page background. For supported websites, Quick Links on the New Tab page can display recent updates right in the tile"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Edge/UserFeedback.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Edge { public class UserFeedback : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge"; private const string valueName = "UserFeedbackAllowed"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() => "Don't Submit user feedback option"; public override string Info() => "Allow the submission of feedback, suggestions, or customer surveys, as well as reporting issues with the browser"; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/FeatureBase.cs ================================================ using System.Threading.Tasks; namespace Flyoobe { public abstract class FeatureBase { public abstract string ID(); public abstract string Info(); public abstract string GetFeatureDetails(); public abstract string SupportedOS(); public abstract Task CheckFeature(); public abstract Task DoFeature(); public abstract bool UndoFeature(); public abstract bool IsRecommended { get; } } } ================================================ FILE: Flyoobe/Features/FeatureLoader.cs ================================================ using Flyoobe; // for FeatureNode using Settings.Ads; using Settings.Edge; using Settings.Gaming; using Settings.Personalization; using Settings.Privacy; using Settings.System; using Settings.UI; using System.Collections.Generic; namespace Features { /// /// Loads all available feature categories and their corresponding tweak nodes. /// Each tweak inherits from FeatureBase and represents a system setting or cleanup action. /// public static class FeatureLoader { public static List Load() { return new List { new FeatureNode("System") { Children = new List { new FeatureNode(new BSODDetails()), new FeatureNode(new VerboseStatus()), new FeatureNode(new SpeedUpShutdown()), new FeatureNode(new NetworkThrottling()), new FeatureNode(new SystemResponsiveness()), new FeatureNode(new MenuShowDelay()), new FeatureNode(new TaskbarEndTask()), new FeatureNode(new DisableHibernation()) } }, new FeatureNode("MS Edge") { Children = new List { new FeatureNode(new BrowserSignin()), new FeatureNode(new DefaultTopSites()), new FeatureNode(new DefautBrowserSetting()), new FeatureNode(new EdgeCollections()), new FeatureNode(new EdgeShoppingAssistant()), new FeatureNode(new FirstRunExperience()), new FeatureNode(new GamerMode()), new FeatureNode(new ImportOnEachLaunch()), new FeatureNode(new StartupBoost()), new FeatureNode(new TabPageQuickLinks()), new FeatureNode(new UserFeedback()) } }, new FeatureNode("UI") { Children = new List { new FeatureNode(new FullContextMenus()), new FeatureNode(new WLockScreen()), new FeatureNode(new SearchboxTaskbarMode()), new FeatureNode(new ShowOrHideMostUsedApps()), new FeatureNode(new ShowTaskViewButton()), new FeatureNode(new DisableSearchBoxSuggestions()), new FeatureNode(new DisableBingSearch()), new FeatureNode(new StartLayout()), new FeatureNode(new Transparency()), new FeatureNode(new DisableSnapAssistFlyout()) } }, new FeatureNode("Gaming") { Children = new List { new FeatureNode(new GameDVR()), new FeatureNode(new PowerThrottling()), new FeatureNode(new VisualFX()) } }, new FeatureNode("Privacy") { Children = new List { new FeatureNode(new ActivityHistory()), new FeatureNode(new LocationTracking()), new FeatureNode(new PrivacyExperience()), new FeatureNode(new Telemetry()) } }, new FeatureNode("Ads") { Children = new List { new FeatureNode(new FileExplorerAds()), new FeatureNode(new FinishSetupAds()), new FeatureNode(new LockScreenAds()), new FeatureNode(new PersonalizedAds()), new FeatureNode(new SettingsAds()), new FeatureNode(new StartmenuAds()), new FeatureNode(new TailoredExperiences()), new FeatureNode(new TipsAndSuggestions()), new FeatureNode(new WelcomeExperienceAds()) } }, }; } } } ================================================ FILE: Flyoobe/Features/FeatureManager.cs ================================================ using Features; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Flyoobe { /// /// Manages all available features and categories. /// Provides methods to query, apply, and undo tweaks. /// public class FeatureManager { // List of all loaded features (root nodes with category and children) public List AllFeatures { get; private set; } public FeatureManager() { // Load features from loader once during construction AllFeatures = FeatureLoader.Load(); } /// /// Returns all available top-level categories. /// public List GetCategories() { return AllFeatures.Select(f => f.Category).ToList(); } /// /// Returns all tweaks under a specific category. /// public List GetFeaturesByCategory(string category) { return AllFeatures.FirstOrDefault(f => f.Category == category)?.Children ?? new List(); } /// /// Applies (executes) a selected tweak asynchronously. /// public async Task ApplyFeature(FeatureNode node) { return await node.Feature.DoFeature(); } /// /// Undoes a tweak if supported. /// public bool UndoFeature(FeatureNode node) { return node.Feature.UndoFeature(); } /// /// Returns the short informational description of the feature. /// public string GetFeatureInfo(FeatureNode node) { return node.Feature?.Info() ?? ""; } /// /// Checks if the tweak is currently enabled (active). /// public async Task IsEnabled(FeatureNode node) { return await node.Feature.CheckFeature(); } /// /// Collects all features from all categories that are marked as "Recommended" /// Use quick settings option. /// public List GetAllRecommendedFeatures() { var recommended = new List(); foreach (var categoryNode in AllFeatures) { foreach (var featureNode in categoryNode.Children) { if (featureNode.Feature.IsRecommended) { recommended.Add(featureNode); } } } return recommended; } } } ================================================ FILE: Flyoobe/Features/FeatureNode.cs ================================================ using System.Collections.Generic; namespace Flyoobe { public class FeatureNode { public string Category { get; set; } public FeatureBase Feature { get; set; } public List Children { get; set; } = new List(); public FeatureNode(string category) { Category = category; } public FeatureNode(FeatureBase feature) { Feature = feature; } public override string ToString() { return Feature?.ID() ?? Category; } } } ================================================ FILE: Flyoobe/Features/Gaming/GameDVR.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Gaming { internal class GameDVR : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\System\GameConfigStore"; // 0 = Enabled, 2 = Disabled private const string keyName2 = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\ApplicationManagement\AllowGameDVR"; private const string valueName = "GameDVR_Enabled"; private const string valueName2 = "GameDVR_FSEBehaviorMode"; private const string valueName3 = "value"; public override string GetFeatureDetails() { return $"{keyName} |Value: {valueName} | {valueName2} | {keyName2} | {valueName3} "; } public override string ID() { return "Disable Game DVR"; } public override string Info() { return "This feature will disable Game DVR."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, 0) && Utils.IntEquals(keyName, valueName2, 2) && Utils.IntEquals(keyName2, valueName3, 0)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, 2, RegistryValueKind.DWord); Registry.SetValue(keyName2, valueName3, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, 0, RegistryValueKind.DWord); Registry.SetValue(keyName2, valueName3, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Gaming/PowerThrotteling.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Gaming { internal class PowerThrottling : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerThrottling"; private const string valueName = "PowerThrottlingOff"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable Power Throttling"; } public override string Info() { return "This feature will disable Power Throttling."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Gaming/VisualFX.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Gaming { internal class VisualFX : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects"; private const string valueName = "VisualFXSetting"; private const int recommendedValue = 2; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable Visual Effects"; } public override string Info() { return "Turns off visual effects like animations and shadows in Windows to boost performance."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, 0)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 2, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Privacy/ActivityHistory.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Privacy { internal class ActivityHistory : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System"; private const string valueName = "PublishUserActivities"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable activity history"; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override string Info() { return "Disable activity history (prevents Windows from tracking and storing your activity)"; } public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Privacy/LocationTracking.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Privacy { internal class LocationTracking : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors"; private const string valueName = "DisableLocation"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable location tracking"; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string Info() { return "Disable location tracking (prevents Windows from accessing your location)"; } public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Privacy/PrivacyExperience.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Privacy { public class PrivacyExperience : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\OOBE"; private const string valueName = "DisablePrivacyExperience"; private const int recommendedValue = 0; public override string ID() => "Disable Privacy Settings Experience at sign-in"; public override string Info() => "This feature will disable Privacy Settings Experience at sign-in."; public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override Task CheckFeature() { bool result = !Utils.IntEquals(keyName, valueName, recommendedValue); return Task.FromResult(result); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/Privacy/Telemetry.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Privacy { public class Telemetry : FeatureBase { private const string dataCollection = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\DataCollection"; private const string diagTrack = @"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\DiagTrack"; public override string ID() => "Turn off Telemetry data collection"; public override string Info() => "This feature will turn off telemetry data collection and prevent the data from being sent to Microsoft."; public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override string GetFeatureDetails() { return $"{dataCollection} | {diagTrack}"; } public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(dataCollection, "AllowTelemetry", 0) && Utils.IntEquals(diagTrack, "Start", 4) ); } public override Task DoFeature() { try { Registry.SetValue(dataCollection, "AllowTelemetry", 0, RegistryValueKind.DWord); Registry.SetValue(diagTrack, "Start", 4, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(dataCollection, "AllowTelemetry", 1, RegistryValueKind.DWord); Registry.SetValue(diagTrack, "Start", 2, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/System/BSODDetails.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.System { internal class BSODDetails : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl"; private const string valueName1 = "DisplayParameters"; private const string valueName2 = "DisableEmoticon"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Values: {valueName1}, {valueName2} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Show BSOD details instead of sad smiley"; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override string Info() { return "This method displays the full classic BSOD with technical error details instead of the simplified sad face version."; } public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName1, recommendedValue) && Utils.IntEquals(keyName, valueName2, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName1, recommendedValue, RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName1, 0, RegistryValueKind.DWord); Registry.SetValue(keyName, valueName2, 0, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/System/Hibernation.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Diagnostics; using System.Threading.Tasks; namespace Settings.System { internal class DisableHibernation : FeatureBase { private const string powerKey = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power"; private const string hibernateValueName = "HibernateEnabled"; private const int disabledValue = 0; private const int enabledValue = 1; // Key to hide/show the Hibernate option in the power menu Alt+F4 dialog private const string flyoutMenuKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FlyoutMenuSettings"; private const string showHibernateOptionName = "ShowHibernateOption"; public override string GetFeatureDetails() { return "Disables hibernation by setting registry values and running powercfg, and hides/shows the Hibernate option in the power menu."; } public override string ID() { return "Disable Hibernation"; } public override string Info() { return "Hibernation is mostly useful for laptops to save battery by storing your session before shutdown. On desktops, it is rarely needed and uses disk space. Disabling it frees resources and avoids confusion by hiding the Hibernate option in the power menu."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { bool hibernateDisabled = Utils.IntEquals(powerKey, hibernateValueName, disabledValue); bool optionHidden = Utils.IntEquals(flyoutMenuKey, showHibernateOptionName, 0); return Task.FromResult(hibernateDisabled && optionHidden); } public override Task DoFeature() { try { Registry.SetValue(powerKey, hibernateValueName, disabledValue, RegistryValueKind.DWord); Registry.SetValue(flyoutMenuKey, showHibernateOptionName, 0, RegistryValueKind.DWord); RunCommand("powercfg", "/hibernate off"); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Error disabling hibernation: " + ex.Message, LogLevel.Error); return Task.FromResult(false); } } public override bool UndoFeature() { try { Registry.SetValue(powerKey, hibernateValueName, enabledValue, RegistryValueKind.DWord); Registry.SetValue(flyoutMenuKey, showHibernateOptionName, 1, RegistryValueKind.DWord); RunCommand("powercfg", "/hibernate on"); bool hibernateEnabled = Utils.IntEquals(powerKey, hibernateValueName, enabledValue); bool optionShown = Utils.IntEquals(flyoutMenuKey, showHibernateOptionName, 1); return hibernateEnabled && optionShown; } catch (Exception ex) { Logger.Log("Error enabling hibernation: " + ex.Message, LogLevel.Error); return false; } } private void RunCommand(string fileName, string arguments) { using (var process = new Process()) { process.StartInfo.FileName = fileName; process.StartInfo.Arguments = arguments; process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.Start(); process.WaitForExit(); } } } } ================================================ FILE: Flyoobe/Features/System/MenuShowDelay.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.System { internal class MenuShowDelay : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Control Panel\Desktop"; private const string valueName = "MenuShowDelay"; private const string recommendedValue = "10"; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: \"{recommendedValue}\" (faster menu response)"; } public override string ID() { return "Speed Up Menu Show Delay"; } public override string Info() { return "Speeds up the appearance of menus and submenus by lowering the default delay. This improves the perceived responsiveness of the UI."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.StringEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.String); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, "400", RegistryValueKind.String); // Default is 400 on Windows 11 return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/System/NetworkThrottling.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.System { internal class NetworkThrottling : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile"; private const string valueName = "NetworkThrottlingIndex"; private const int recommendedValue = -1; // 0xFFFFFFFF public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: 0xFFFFFFFF (decimal: {uint.MaxValue})"; } public override string ID() { return "Disable Network Throttling"; } public override string Info() { return "Disables the Windows network throttling mechanism to potentially improve performance for streaming, gaming, or real-time applications."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, unchecked((int)0xFFFFFFFF))); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, unchecked((int)0xFFFFFFFF), RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 10, RegistryValueKind.DWord); // Default is 10 return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/System/SpeedUpShutdown.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.System { internal class SpeedUpShutdown : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control"; private const string valueName = "WaitToKillServiceTimeout"; private const string recommendedValue = "1000"; // Set to 1000 ms (1 second) public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue} ms"; } public override string ID() { return "Speed Up Shutdown Time"; } public override string Info() { return "This feature reduces the WaitToKillServiceTimeout value, which speeds up the shutdown process by reducing the time Windows waits for services to stop."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.StringEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.String); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Error in SpeedUpShutdown: " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, "5000", RegistryValueKind.String); // Default value return true; } catch (Exception ex) { Logger.Log("Error in SpeedUpShutdown (Undo): " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/System/SystemResponsiveness.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.System { internal class SystemResponsiveness : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile"; private const string valueName = "SystemResponsiveness"; private const int recommendedValue = 10; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Optimize System Responsiveness"; } public override string Info() { return "Enhances system responsiveness by prioritizing CPU resources for foreground tasks, improving performance during active use."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 20, RegistryValueKind.DWord); // Default is typically 20 on Windows 11 return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/System/TaskbarEndTask.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.System { internal class TaskbarEndTask : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings"; private const string valueName = "TaskbarEndTask"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Enable End Task"; } public override string Info() { return "Adds 'End Task' to the Windows 11 taskbar context menu, allowing you to directly kill unresponsive apps."; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Failed to enable End Task: " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Failed to disable End Task: " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/System/VerboseStatus.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.System { internal class VerboseStatus : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; private const string valueName = "VerboseStatus"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Enable Verbose Logon status messages"; } public override string Info() { return "This method allows you to see what processes are hanging when shutting down and turning on the machine."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/UI/BingSearch.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.UI { internal class DisableBingSearch : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Search"; private const string valueName = "BingSearchEnabled"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable Bing Search"; } public override string Info() { return "This feature disables Bing integration in Windows Search."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Error in DisableBingSearch: " + ex.Message, LogLevel.Error); return Task.FromResult(false); } } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Error undoing DisableBingSearch: " + ex.Message, LogLevel.Error); return false; } } } } ================================================ FILE: Flyoobe/Features/UI/FullContextMenus.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class FullContextMenus : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\SOFTWARE\CLASSES\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"; public override string GetFeatureDetails() { return $"{keyName}"; } public override string ID() { return "Show Full context menus in Windows 11"; } public override string Info() { return "This feature will enable full context menus"; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { try { object value = Registry.GetValue(keyName, "", null); return Task.FromResult(value != null); // Return true if value is not null } catch (Exception ex) { Logger.Log("Error occurred while checking: " + ex.Message, LogLevel.Error); return Task.FromResult(false); } } public override Task DoFeature() { try { Registry.SetValue(keyName, "", "", RegistryValueKind.String); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Error occurred while enabling: " + ex.Message, LogLevel.Error); return Task.FromResult(false); } } public override bool UndoFeature() { try { Registry.CurrentUser.DeleteSubKeyTree(@"Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}", false); return true; } catch (Exception ex) { Logger.Log("Error occurred while disabling: " + ex.Message, LogLevel.Error); return false; } } } } ================================================ FILE: Flyoobe/Features/UI/SearchBoxSuggestions.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.UI { internal class DisableSearchBoxSuggestions : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer"; private const string valueName = "DisableSearchBoxSuggestions"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable Search Box Suggestions"; } public override string Info() { return "This feature disables Bing search and web suggestions in the Windows Start Menu."; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => true; public override Task CheckFeature() { return Task.FromResult(Utils.IntEquals(keyName, valueName, recommendedValue)); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Error in DisableSearchBoxSuggestions: " + ex.Message, LogLevel.Error); return Task.FromResult(false); } } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); // 0 = Enable suggestions return true; } catch (Exception ex) { Logger.Log("Error undoing DisableSearchBoxSuggestions: " + ex.Message, LogLevel.Error); return false; } } } } ================================================ FILE: Flyoobe/Features/UI/SearchboxTaskbarMode.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class SearchboxTaskbarMode : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Search"; private const string valueName = "SearchboxTaskbarMode"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Hide search box on taskbar"; } public override string Info() { return "This feature will hide search box on taskbar"; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 2, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/UI/ShowOrHideMostUsedApps.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class ShowOrHideMostUsedApps : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Explorer"; private const string valueName = "ShowOrHideMostUsedApps"; private const int recommendedValue = 2; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Hide Most used apps in start menu"; } public override string Info() { return "This feature will hide Most used apps in start menu for all users"; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/UI/ShowTaskViewButton.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class ShowTaskViewButton : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"; private const string valueName = "ShowTaskViewButton"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended: {recommendedValue} (Task View off – cleaner taskbar, unless you use it often)"; } public override string ID() { return "Hide Task view button on taskbar"; } public override string Info() { return "This feature will hide the Task view button on taskbar"; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/UI/SnapAssistFlyout.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class DisableSnapAssistFlyout : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"; private const string valueName = "EnableSnapAssistFlyout"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Disable Snap Assist Flyout"; } public override string Info() { return "This feature disables the Snap Assist flyout, which appears when you snap a window."; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Error in DisableSnapAssistFlyout: " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Error in DisableSnapAssistFlyout (Undo): " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/UI/StartLayout.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class StartLayout : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"; private const string valueName = "Start_Layout"; private const int recommendedValue = 1; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Pin more Apps on start menu"; } public override string Info() { return "This feature will allow pinning more Apps on start menu"; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/UI/Transparency.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class Transparency : FeatureBase { private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"; private const string valueName = "EnableTransparency"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Suggestion: {recommendedValue} (No transparency – smoother performance, still stylish)"; } public override string ID() { return "Disable Transparency Effects"; } public override string Info() { return "This feature disables transparency effects for Start menu, taskbar, and other surfaces."; } public override string SupportedOS() => "Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { return Task.FromResult( Utils.IntEquals(keyName, valueName, recommendedValue) ); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Error in DisableTransparency: " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Error in DisableTransparency (Undo): " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Features/UI/WLockScreen.cs ================================================ using Microsoft.Win32; using Flyoobe; using System; using System.Threading.Tasks; namespace Settings.Personalization { internal class WLockScreen : FeatureBase { private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Personalization"; private const string valueName = "NoLockScreen"; private const int recommendedValue = 0; public override string GetFeatureDetails() { return $"{keyName} | Value: {valueName} | Recommended Value: {recommendedValue}"; } public override string ID() { return "Don't use personalized lock screen"; } public override string Info() { return "This feature will disable the personalized lock screen."; } public override string SupportedOS() => "Windows 10, Windows 11"; public override bool IsRecommended => false; public override Task CheckFeature() { bool result = !Utils.IntEquals(keyName, valueName, recommendedValue); return Task.FromResult(result); } public override Task DoFeature() { try { Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord); return Task.FromResult(true); } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return Task.FromResult(false); } public override bool UndoFeature() { try { Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord); return true; } catch (Exception ex) { Logger.Log("Code red in " + ex.Message, LogLevel.Error); } return false; } } } ================================================ FILE: Flyoobe/Flyoobe.csproj ================================================ Debug AnyCPU {50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C} WinExe Flyoobe FlyOOBE v4.8 512 true true x64 true full false bin\Debug\ DEBUG;TRACE prompt 4 AnyCPU pdbonly true bin\Release\ TRACE prompt 4 app.manifest AppIcon.ico ..\..\..\..\..\..\Program Files (x86)\Windows Kits\8.1\References\CommonConfiguration\Neutral\Annotated\Windows.winmd Component UserControl OobeControl.cs UserControl LoggerControlView.cs Form True True Resources.resx UserControl ToolHubControlView.cs UserControl ToolHubItemControl.cs UserControl AccountControlView.cs UserControl AiControlView.cs UserControl AppsControlView.cs UserControl AppSettingsControlView.cs UserControl DefaultsControlView.cs UserControl ExperienceControlView.cs UserControl DeviceControlView.cs Form MainForm.cs UserControl HomeControlView.cs UserControl HomeItemControl.cs UserControl InstallerControlView.cs UserControl NetworkControlView.cs UserControl PersonalizationControlView.cs UserControl AdvancedControlView.cs UserControl UpdatesControlView.cs AdvancedControlView.cs OobeControl.cs ToolHubControlView.cs ToolHubItemControl.cs AccountControlView.cs AiControlView.cs AppsControlView.cs AppSettingsControlView.cs DefaultsControlView.cs ExperienceControlView.cs DeviceControlView.cs MainForm.cs ResXFileCodeGenerator Designer Resources.Designer.cs HomeControlView.cs HomeItemControl.cs InstallerControlView.cs LoggerControlView.cs NetworkControlView.cs PersonalizationControlView.cs UpdatesControlView.cs SettingsSingleFileGenerator Settings.Designer.cs True Settings.settings True {B596CC9F-56E5-419E-A622-E01BB457431E} 2 0 0 tlbimp False True ================================================ FILE: Flyoobe/Helper/BackgroundHelper.cs ================================================ using System; using System.IO; using System.Linq; using System.Drawing; using System.Windows.Forms; using System.Drawing.Drawing2D; public static class BackgroundHelper { // Path to save selected background setting private static string settings = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app", "FlyOOBE.txt"); private static string current = "None"; /// /// Loads the saved background style (if available) and applies it to the given panel. /// public static void LoadOrAskBackground( Panel panel, Label lblHeader, Button btnBack = null, Button btnRefresh = null, Button btnActivity = null) { Directory.CreateDirectory(Path.GetDirectoryName(settings)); string chosen = File.Exists(settings) ? File.ReadAllLines(settings).FirstOrDefault(x => x.StartsWith("background=", StringComparison.OrdinalIgnoreCase)) : null; chosen = chosen != null ? chosen.Substring("background=".Length).Trim() : "None"; if (string.IsNullOrEmpty(chosen) || chosen == "None") return; ApplyBackground(panel, chosen, lblHeader, btnBack, btnRefresh, btnActivity); } /// /// Opens a simple dialog to choose a background gradient. /// public static void ChooseBackground(Panel panel, Label lblHeader) { string[] styles = { "None", "Soft Gradient", "Sunset Glow", "Acrylic Blue", "Mica Purple", "Neon Mint", "Emerald Flow", // Darker Styles "Cyberpunk Violet", "Aurora Night", "Zen Blueberry", "Midnight Plasma", "Lime Circuit", "Carbon Sunset", // Copilot Styles "Copilot Pastel", "Copilot Neon", "Copilot Chaos", }; using (Form dlg = new Form()) { dlg.Text = "Choose your background"; dlg.Size = new Size(260, 300); dlg.StartPosition = FormStartPosition.CenterScreen; dlg.ShowIcon = false; ListBox list = new ListBox { Dock = DockStyle.Fill }; list.Items.AddRange(styles); Button ok = new Button { Text = "OK", Dock = DockStyle.Bottom }; ok.Click += (s, e) => dlg.DialogResult = DialogResult.OK; dlg.Controls.Add(list); dlg.Controls.Add(ok); if (dlg.ShowDialog() == DialogResult.OK && list.SelectedItem != null) { string sel = list.SelectedItem.ToString(); SaveBackgroundSetting(sel); if (sel != "None") ApplyBackground(panel, sel, lblHeader); else panel.Invalidate(); } } } /// /// Writes the selected background to settings file. /// private static void SaveBackgroundSetting(string sel) { string[] lines = File.Exists(settings) ? File.ReadAllLines(settings) : new[] { "# FlyOOBE Settings file" }; bool found = false; for (int i = 0; i < lines.Length; i++) { if (lines[i].StartsWith("background=", StringComparison.OrdinalIgnoreCase)) { lines[i] = "background=" + sel; found = true; break; } } if (!found) { var l = lines.ToList(); l.Add("background=" + sel); lines = l.ToArray(); } File.WriteAllLines(settings, lines); } /// /// Applies the selected background gradient and adjusts all foreground UI colors /// so that dark backgrounds use white text and light backgrounds use black text. /// private static void ApplyBackground(Panel panel, string style, Label lblHeader, Button btnBack = null, Button btnRefresh = null, Button btnActivity = null) { current = style; panel.Paint -= Panel_Paint; panel.Paint += Panel_Paint; panel.Tag = style; panel.Resize -= (s, e) => panel.Invalidate(); panel.Resize += (s, e) => panel.Invalidate(); panel.Invalidate(); bool dark = style.Contains("Cyberpunk") || style.Contains("Aurora") || style.Contains("Zen") || style.Contains("Midnight") || style.Contains("Lime") || style.Contains("Carbon") || style.Contains("Dark Mode") || style.Contains("Mica") || style.Contains("Sunset Glow"); Color txt = dark ? Color.White : Color.FromArgb(40, 40, 40); Color btnBackColor = dark ? Color.FromArgb(50, 50, 50) : Color.FromArgb(230, 230, 230); if (lblHeader != null) lblHeader.ForeColor = txt; // Apply button color changes ApplyButtonStyle(btnBack, txt); ApplyButtonStyle(btnRefresh, txt); ApplyButtonStyle(btnActivity, txt); } private static void ApplyButtonStyle(Button btn, Color txt) { if (btn == null) return; btn.ForeColor = txt; } /// /// Paint event handler for panel background rendering. /// private static void Panel_Paint(object sender, PaintEventArgs e) { Panel p = (Panel)sender; string style = p.Tag as string; if (string.IsNullOrEmpty(style) || style == "None") return; Rectangle r = p.ClientRectangle; using (LinearGradientBrush b = CreateBrush(style, r)) { if (b != null) { e.Graphics.SmoothingMode = SmoothingMode.HighQuality; e.Graphics.FillRectangle(b, r); } } } /// /// Creates the gradient brush for each style. /// private static LinearGradientBrush CreateBrush(string style, Rectangle r) { // --- Soft, clean themes --- if (style == "Soft Gradient") return new LinearGradientBrush(r, Color.FromArgb(255, 230, 245), Color.FromArgb(200, 210, 255), 75f); if (style == "Sunset Glow") return new LinearGradientBrush(r, Color.FromArgb(255, 120, 90), Color.FromArgb(190, 60, 120), 60f); if (style == "Acrylic Blue") return new LinearGradientBrush(r, Color.FromArgb(90, 170, 255), Color.FromArgb(30, 80, 180), 45f); if (style == "Mica Purple") return new LinearGradientBrush(r, Color.FromArgb(170, 140, 255), Color.FromArgb(50, 30, 100), 80f); if (style == "Neon Mint") return new LinearGradientBrush(r, Color.FromArgb(120, 255, 210), Color.FromArgb(0, 200, 150), 70f); if (style == "Emerald Flow") return new LinearGradientBrush(r, Color.FromArgb(60, 220, 170), Color.FromArgb(10, 120, 90), 50f); // dark styles if (style == "Cyberpunk Violet") return new LinearGradientBrush(r, Color.FromArgb(255, 0, 200), // Neon Magenta Color.FromArgb(0, 30, 90), // Deep dark blue-violet 45f); if (style == "Aurora Night") return new LinearGradientBrush(r, Color.FromArgb(40, 10, 60), // Deep violet base Color.FromArgb(0, 220, 255), // Cyan-turquoise glow 80f); if (style == "Zen Blueberry") return new LinearGradientBrush(r, Color.FromArgb(40, 60, 120), // Navy blue base Color.FromArgb(140, 180, 255), // Light blue highlight 60f); if (style == "Midnight Plasma") return new LinearGradientBrush(r, Color.FromArgb(20, 10, 40), // Almost black purple Color.FromArgb(180, 0, 150), // Bright magenta-violet 70f); if (style == "Lime Circuit") return new LinearGradientBrush(r, Color.FromArgb(20, 50, 30), // Dark green background Color.FromArgb(0, 255, 100), // Vibrant neon lime 75f); if (style == "Carbon Sunset") return new LinearGradientBrush(r, Color.FromArgb(30, 30, 30), // Carbon gray Color.FromArgb(255, 80, 60), // Warm neon orange 50f); if (style == "Dark Mode") return new LinearGradientBrush(r, Color.FromArgb(30, 30, 30), // Base carbon Color.FromArgb(45, 45, 45), // Slight highlight 90f); // --- Copilot Themes --- if (style == "Copilot Pastel") return new LinearGradientBrush(r, Color.FromArgb(190, 215, 255), // Soft Copilot blue Color.FromArgb(230, 200, 255), // Gentle purple tint 65f); if (style == "Copilot Neon") return new LinearGradientBrush(r, Color.FromArgb(0, 160, 255), // Bright Copilot blue Color.FromArgb(200, 0, 255), // Neon magenta accent 55f); if (style == "Copilot Chaos") { return new LinearGradientBrush(r, Color.FromArgb(255, 0, 255), // Hot pink Color.FromArgb(0, 255, 255), // Neon cyan 15f); } return null; } } ================================================ FILE: Flyoobe/Helper/DonationHelper.cs ================================================ using System.Diagnostics; using System.IO; using System.Linq; using System.Windows.Forms; namespace Flyoobe { public static class DonationHelper { // Path to the donation status file private static readonly string filePath = Path.Combine("app", "FlyOOBE.txt"); // Donation flag to be inserted/read from the file private const string donationFlag = "#donated=true"; /// /// Checks if the user has already donated. /// Returns true if the donation flag is found in the file. /// public static bool HasDonated() { if (!File.Exists(filePath)) return false; var lines = File.ReadAllLines(filePath); return lines.Any(line => line.Trim().Equals(donationFlag)); } /// /// Updates the donation status by writing or removing the flag in the file. /// Ensures the "app" directory exists before writing. /// /// True if the user has donated; false otherwise. public static void SetDonationStatus(bool donated) { Directory.CreateDirectory(Path.GetDirectoryName(filePath)); if (!File.Exists(filePath)) { File.WriteAllText(filePath, donated ? donationFlag : string.Empty); return; } var lines = File.ReadAllLines(filePath).ToList(); // Remove any existing donation flags lines.RemoveAll(l => l.Trim().StartsWith("#donated")); if (donated) lines.Add(donationFlag); File.WriteAllLines(filePath, lines); } /// /// Displays a donation prompt message box. /// Opens the PayPal donation page if the user agrees. /// public static void ShowDonationPrompt() { string message = "Thank you for using my app!\n\n" + "I developed this application in my free time to help you upgrade from Windows 10 to Windows 11 – even on PCs that, according to Microsoft's hardware requirements, would normally not be supported.\n\n" + "My app helps you avoid purchasing a new computer and actively contributes to reducing unnecessary electronic waste.\n\n" + "Normally, I do not charge anything for my projects – neither for development nor for support.\n" + "Since this app is significantly more comprehensive, offers more features, and requires ongoing maintenance, I would be grateful for any voluntary contribution to support my work – but everything remains free and available to everyone, regardless.\n\n" + "Of course, only if you want to and can afford it.\n\n" + "Would you like to donate via PayPal now?"; var result = MessageBox.Show(message, "Support @DummyLink", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (result == DialogResult.Yes) { Process.Start(new ProcessStartInfo { FileName = "https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG", UseShellExecute = true }); } } } } ================================================ FILE: Flyoobe/Helper/Logger.cs ================================================ using System; using System.Collections.Generic; using System.Drawing; namespace Flyoobe { public enum LogLevel { Info, Warning, Error } public static class Logger { // The active log view control where log messages are displayed private static LoggerControlView loggerControlInstance; // Temporary storage for logs before the UI is ready (e.g., during app startup) private static readonly List<(string Message, Color Color)> logBuffer = new List<(string, Color)>(); // Reference to the view navigation system so we can switch to the log view on demand private static ViewNavigator navigator; // Optional: name of the current log "section" (helps group logs visually) private static string currentSection; /// /// Sets the LoggerControlView instance dynamically. /// public static void SetLoggerControl(LoggerControlView loggerControl) { if (loggerControl == null) throw new ArgumentNullException(nameof(loggerControl), "LoggerControlView cannot be null."); loggerControlInstance = loggerControl; // Flush any buffered logs to the UI foreach (var log in logBuffer) { loggerControlInstance.AddLog(log.Message, log.Color); } // logBuffer.Clear(); // keep buffer if history retention needed } /// /// Logs a message using the given LogLevel. /// Each level has its own color. /// public static void Log(string message, LogLevel level = LogLevel.Info) { Color color; switch (level) { case LogLevel.Warning: color = Color.Olive; break; case LogLevel.Error: color = Color.Firebrick; break; default: color = Color.Black; break; } Log(message, color); } /// /// Logs a message with an explicit color. /// public static void Log(string message, Color color) { string timestampedMessage = $"{DateTime.Now:HH:mm:ss} - {message}"; if (loggerControlInstance != null) { loggerControlInstance.AddLog(timestampedMessage, color); } else { // LoggerControlView not ready yet, so store temporarily logBuffer.Add((timestampedMessage, color)); } } /// /// Registers the ViewNavigator so the log view can be shown when needed. /// public static void AttachNavigator(ViewNavigator nav) { navigator = nav; } /// /// Shows the log view. /// public static void ShowLogView() { if (navigator != null) navigator.ShowView("Activity"); } /// /// Starts a new log section, visually separated in the log window. /// Example: Logger.BeginSection("Extension/Tool Name"); /// public static void BeginSection(string sectionName) { if (string.IsNullOrWhiteSpace(sectionName)) sectionName = "Unnamed Section"; // Visually separate sections with a blank line and a header line string header = $"===== {sectionName.ToUpper()} ({DateTime.Now:HH:mm:ss}) ====="; currentSection = sectionName; if (loggerControlInstance != null) { loggerControlInstance.AddLog(string.Empty, Color.Black); loggerControlInstance.AddLog(header, Color.DarkSlateBlue); loggerControlInstance.AddLog(string.Empty, Color.Black); } else { logBuffer.Add((string.Empty, Color.Black)); logBuffer.Add((header, Color.DarkSlateBlue)); logBuffer.Add((string.Empty, Color.Black)); } } } } ================================================ FILE: Flyoobe/Helper/UIHelper.cs ================================================ using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; public static class UIHelper { /// /// Set the default size for the main form. /// public static void SetDefaultFormSize(Form form, int width = 1050, int height = 700) { form.Size = new Size(width, height); } /// /// Enable rounded corners with a border for a panel. /// Corners and border are automatically redrawn on resize. /// public static void EnableRoundedPanel(Panel panel, int radius = 12, int borderThickness = 1) { panel.Resize += (s, e) => ApplyRegion(panel, radius); panel.Paint += (s, e) => { using (var path = CreatePath(panel, radius)) using (var pen = new Pen(Color.Gainsboro, borderThickness)) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.DrawPath(pen, path); } }; // Initial apply ApplyRegion(panel, radius); } /// /// Apply the rounded region to the panel. /// private static void ApplyRegion(Control ctrl, int radius) { using (var path = CreatePath(ctrl, radius)) { ctrl.Region = new Region(path); } } /// /// Build a rounded rectangle path for given control size. /// private static GraphicsPath CreatePath(Control ctrl, int radius) { var path = new GraphicsPath(); path.StartFigure(); path.AddArc(new Rectangle(0, 0, radius, radius), 180, 90); path.AddArc(new Rectangle(ctrl.Width - radius, 0, radius, radius), 270, 90); path.AddArc(new Rectangle(ctrl.Width - radius, ctrl.Height - radius, radius, radius), 0, 90); path.AddArc(new Rectangle(0, ctrl.Height - radius, radius, radius), 90, 90); path.CloseFigure(); return path; } } ================================================ FILE: Flyoobe/Helper/Utils.cs ================================================ using Microsoft.Win32; using System; using System.Security.Principal; namespace Flyoobe { internal static class Utils { private const string GitHubUrl = "https://github.com/builtbybel/Flyoobe"; /// /// Checks if a registry value equals a specified integer. /// public static bool IntEquals(string keyName, string valueName, int expectedValue) { try { object value = Registry.GetValue(keyName, valueName, null); return value is int intValue && intValue == expectedValue; } catch (Exception ex) { Logger.Log($"Registry check failed for {keyName}\\{valueName}: {ex.Message}", LogLevel.Error); return false; } } /// /// Checks if a registry value equals a specified string. /// public static bool StringEquals(string keyName, string valueName, string expectedValue) { try { object value = Registry.GetValue(keyName, valueName, null); return value is string strValue && strValue == expectedValue; } catch (Exception ex) { Logger.Log($"Registry check failed for {keyName}\\{valueName}: {ex.Message}", LogLevel.Error); return false; } } /// /// Checks if the application is running with administrative privileges. /// /// public static bool IsRunningAsAdmin() { using (var identity = WindowsIdentity.GetCurrent()) { var principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } /// /// Detects if the current OS is Windows 11 or newer. /// public static bool DetectWindows11() { object buildObj = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentBuildNumber", null); if (buildObj != null && int.TryParse(buildObj.ToString(), out int build)) { return build >= 22000; // Windows 11 starts at build 22000 } return false; // If unable to detect, assume not Windows 11 } } } ================================================ FILE: Flyoobe/IView.cs ================================================ /// /// Represents a UI view that can refresh its displayed content. /// Every view hosted by the navigator implements this. /// public interface IView { /// /// Refreshes the view. Used when the user clicks refresh or returns to the page. /// void RefreshView(); } /// /// Implement this on views that support global search filtering. /// The MainForm calls this whenever the global search text changes. /// public interface IHasSearch { /// /// Called whenever the user types into the global search box. /// The view should filter or highlight content based on the given text. /// /// The search query string (may be empty). void OnGlobalSearchChanged(string text); } ================================================ FILE: Flyoobe/InstallView/AdvancedControlView.Designer.cs ================================================ namespace Flyoobe { partial class AdvancedControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.panel1 = new System.Windows.Forms.Panel(); this.btnQuickRepair = new System.Windows.Forms.Button(); this.btnCreateUsb = new System.Windows.Forms.Button(); this.lblOneClick = new System.Windows.Forms.Label(); this.panelInstall = new System.Windows.Forms.Panel(); this.lblBadgeDl = new System.Windows.Forms.Label(); this.lblBadgeIso = new System.Windows.Forms.Label(); this.cboSource = new System.Windows.Forms.ComboBox(); this.btnHomepage = new System.Windows.Forms.Button(); this.lblBadgeExternal = new System.Windows.Forms.Label(); this.btnDownload = new System.Windows.Forms.Button(); this.btnRun = new System.Windows.Forms.Button(); this.lblBadgeNative = new System.Windows.Forms.Label(); this.lblHint = new System.Windows.Forms.Label(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.panel1.SuspendLayout(); this.panelInstall.SuspendLayout(); this.SuspendLayout(); // // panel1 // this.panel1.AutoScroll = true; this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.panel1.Controls.Add(this.btnQuickRepair); this.panel1.Controls.Add(this.btnCreateUsb); this.panel1.Controls.Add(this.lblOneClick); this.panel1.Controls.Add(this.panelInstall); this.panel1.Controls.Add(this.lblHint); this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Location = new System.Drawing.Point(0, 0); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(835, 457); this.panel1.TabIndex = 11; // // btnQuickRepair // this.btnQuickRepair.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnQuickRepair.BackColor = System.Drawing.Color.Transparent; this.btnQuickRepair.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(138)))), ((int)(((byte)(211))))); this.btnQuickRepair.FlatAppearance.BorderSize = 2; this.btnQuickRepair.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnQuickRepair.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnQuickRepair.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F); this.btnQuickRepair.ForeColor = System.Drawing.Color.Black; this.btnQuickRepair.Location = new System.Drawing.Point(512, 417); this.btnQuickRepair.Name = "btnQuickRepair"; this.btnQuickRepair.Size = new System.Drawing.Size(138, 27); this.btnQuickRepair.TabIndex = 337; this.btnQuickRepair.Text = "🪟 Quick Repair"; this.btnQuickRepair.UseVisualStyleBackColor = false; // // btnCreateUsb // this.btnCreateUsb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCreateUsb.BackColor = System.Drawing.Color.Transparent; this.btnCreateUsb.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(138)))), ((int)(((byte)(211))))); this.btnCreateUsb.FlatAppearance.BorderSize = 2; this.btnCreateUsb.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnCreateUsb.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnCreateUsb.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F); this.btnCreateUsb.ForeColor = System.Drawing.Color.Black; this.btnCreateUsb.Location = new System.Drawing.Point(656, 417); this.btnCreateUsb.Name = "btnCreateUsb"; this.btnCreateUsb.Size = new System.Drawing.Size(138, 27); this.btnCreateUsb.TabIndex = 338; this.btnCreateUsb.Text = " 💿 Create Install USB"; this.btnCreateUsb.UseVisualStyleBackColor = false; // // lblOneClick // this.lblOneClick.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.lblOneClick.AutoEllipsis = true; this.lblOneClick.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.lblOneClick.ForeColor = System.Drawing.Color.Black; this.lblOneClick.Location = new System.Drawing.Point(418, 420); this.lblOneClick.Name = "lblOneClick"; this.lblOneClick.Size = new System.Drawing.Size(89, 27); this.lblOneClick.TabIndex = 336; this.lblOneClick.Text = "One-click:"; this.lblOneClick.UseCompatibleTextRendering = true; // // panelInstall // this.panelInstall.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelInstall.AutoScroll = true; this.panelInstall.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.panelInstall.Controls.Add(this.lblBadgeDl); this.panelInstall.Controls.Add(this.lblBadgeIso); this.panelInstall.Controls.Add(this.cboSource); this.panelInstall.Controls.Add(this.btnHomepage); this.panelInstall.Controls.Add(this.lblBadgeExternal); this.panelInstall.Controls.Add(this.btnDownload); this.panelInstall.Controls.Add(this.btnRun); this.panelInstall.Controls.Add(this.lblBadgeNative); this.panelInstall.Location = new System.Drawing.Point(42, 141); this.panelInstall.Name = "panelInstall"; this.panelInstall.Size = new System.Drawing.Size(752, 242); this.panelInstall.TabIndex = 335; // // lblBadgeDl // this.lblBadgeDl.AutoEllipsis = true; this.lblBadgeDl.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.lblBadgeDl.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9.25F); this.lblBadgeDl.ForeColor = System.Drawing.Color.Black; this.lblBadgeDl.Location = new System.Drawing.Point(306, 13); this.lblBadgeDl.Name = "lblBadgeDl"; this.lblBadgeDl.Size = new System.Drawing.Size(130, 26); this.lblBadgeDl.TabIndex = 338; this.lblBadgeDl.Text = "⬇️ Direct download"; this.lblBadgeDl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // lblBadgeIso // this.lblBadgeIso.AutoEllipsis = true; this.lblBadgeIso.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.lblBadgeIso.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9.25F); this.lblBadgeIso.ForeColor = System.Drawing.Color.Black; this.lblBadgeIso.Location = new System.Drawing.Point(194, 13); this.lblBadgeIso.Name = "lblBadgeIso"; this.lblBadgeIso.Size = new System.Drawing.Size(106, 26); this.lblBadgeIso.TabIndex = 337; this.lblBadgeIso.Text = "💿 Needs ISO"; this.lblBadgeIso.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // cboSource // this.cboSource.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.cboSource.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cboSource.FlatStyle = System.Windows.Forms.FlatStyle.System; this.cboSource.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 11.25F); this.cboSource.FormattingEnabled = true; this.cboSource.Location = new System.Drawing.Point(11, 61); this.cboSource.Name = "cboSource"; this.cboSource.Size = new System.Drawing.Size(733, 28); this.cboSource.TabIndex = 334; // // btnHomepage // this.btnHomepage.BackColor = System.Drawing.Color.Transparent; this.btnHomepage.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btnHomepage.FlatAppearance.BorderSize = 2; this.btnHomepage.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnHomepage.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnHomepage.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnHomepage.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.btnHomepage.ForeColor = System.Drawing.Color.Black; this.btnHomepage.Location = new System.Drawing.Point(111, 95); this.btnHomepage.Name = "btnHomepage"; this.btnHomepage.Size = new System.Drawing.Size(94, 31); this.btnHomepage.TabIndex = 6; this.btnHomepage.Text = "Web"; this.btnHomepage.UseCompatibleTextRendering = true; this.btnHomepage.UseVisualStyleBackColor = false; // // lblBadgeExternal // this.lblBadgeExternal.AutoEllipsis = true; this.lblBadgeExternal.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.lblBadgeExternal.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9.25F); this.lblBadgeExternal.ForeColor = System.Drawing.Color.Black; this.lblBadgeExternal.Location = new System.Drawing.Point(97, 13); this.lblBadgeExternal.Name = "lblBadgeExternal"; this.lblBadgeExternal.Size = new System.Drawing.Size(91, 26); this.lblBadgeExternal.TabIndex = 336; this.lblBadgeExternal.Text = "🧰 External"; this.lblBadgeExternal.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // btnDownload // this.btnDownload.BackColor = System.Drawing.Color.Transparent; this.btnDownload.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btnDownload.FlatAppearance.BorderSize = 2; this.btnDownload.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnDownload.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnDownload.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnDownload.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.btnDownload.ForeColor = System.Drawing.Color.Black; this.btnDownload.Location = new System.Drawing.Point(11, 95); this.btnDownload.Name = "btnDownload"; this.btnDownload.Size = new System.Drawing.Size(94, 31); this.btnDownload.TabIndex = 11; this.btnDownload.Text = "Download"; this.btnDownload.UseCompatibleTextRendering = true; this.btnDownload.UseVisualStyleBackColor = false; // // btnRun // this.btnRun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnRun.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnRun.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnRun.FlatAppearance.BorderSize = 2; this.btnRun.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnRun.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnRun.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnRun.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnRun.ForeColor = System.Drawing.Color.Black; this.btnRun.Location = new System.Drawing.Point(582, 95); this.btnRun.Name = "btnRun"; this.btnRun.Size = new System.Drawing.Size(162, 31); this.btnRun.TabIndex = 10; this.btnRun.Text = "Run"; this.btnRun.UseCompatibleTextRendering = true; this.btnRun.UseVisualStyleBackColor = false; // // lblBadgeNative // this.lblBadgeNative.AutoEllipsis = true; this.lblBadgeNative.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.lblBadgeNative.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9.25F); this.lblBadgeNative.ForeColor = System.Drawing.Color.Black; this.lblBadgeNative.Location = new System.Drawing.Point(10, 13); this.lblBadgeNative.Name = "lblBadgeNative"; this.lblBadgeNative.Size = new System.Drawing.Size(81, 26); this.lblBadgeNative.TabIndex = 335; this.lblBadgeNative.Text = "🪟 Native"; this.lblBadgeNative.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // lblHint // this.lblHint.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblHint.AutoEllipsis = true; this.lblHint.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.lblHint.ForeColor = System.Drawing.Color.Black; this.lblHint.Location = new System.Drawing.Point(42, 32); this.lblHint.Name = "lblHint"; this.lblHint.Size = new System.Drawing.Size(744, 87); this.lblHint.TabIndex = 9; this.lblHint.Text = "Info"; this.lblHint.UseCompatibleTextRendering = true; // // AdvancedControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.panel1); this.Name = "AdvancedControlView"; this.Size = new System.Drawing.Size(835, 457); this.panel1.ResumeLayout(false); this.panelInstall.ResumeLayout(false); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Button btnHomepage; private System.Windows.Forms.Button btnDownload; private System.Windows.Forms.Button btnRun; private System.Windows.Forms.Label lblHint; private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.ComboBox cboSource; private System.Windows.Forms.Panel panelInstall; private System.Windows.Forms.Label lblBadgeNative; private System.Windows.Forms.Label lblBadgeDl; private System.Windows.Forms.Label lblBadgeIso; private System.Windows.Forms.Label lblBadgeExternal; private System.Windows.Forms.Button btnQuickRepair; private System.Windows.Forms.Button btnCreateUsb; private System.Windows.Forms.Label lblOneClick; } } ================================================ FILE: Flyoobe/InstallView/AdvancedControlView.cs ================================================ using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { public partial class AdvancedControlView : UserControl, IView, IHasSearch { // Providers & per-provider last selections private readonly List _providers = new List(); // Store last selections (ISO/exe) per provider ID private readonly Dictionary _lastByProvider = new Dictionary(StringComparer.OrdinalIgnoreCase); public AdvancedControlView() { InitializeComponent(); InitProviderCombo(); WireUpTooltips(); HookUpEvents(); UpdateHint(); } private void InitProviderCombo() { // Register install sources _providers.Add(new NativeResetProvider()); _providers.Add(new RufusProvider()); _providers.Add(new MctProvider()); _providers.Add(new VentoyProvider()); _providers.Add(new InPlaceRepairProvider()); _providers.Add(new RunSetupFromIsoProvider()); _providers.Add(new MountIsoProvider()); _providers.Add(new RebootToUefiProvider()); _providers.Add(new BootMenuInfoProvider()); _providers.Add(new BackupDriversProvider()); // Bind providers to dropdown if (cboSource != null) { cboSource.DropDownStyle = ComboBoxStyle.DropDownList; cboSource.DisplayMember = nameof(IInstallProvider.DisplayName); cboSource.DataSource = _providers; cboSource.FormattingEnabled = true; cboSource.Format += (s, e) => { var p = e.ListItem as IInstallProvider; if (p == null) { e.Value = e.ListItem?.ToString(); return; } var badgeTool = p.IsExternalTool ? "🧰" : "🪟"; var badgeIso = p.TypicallyNeedsIso ? " 💿" : string.Empty; var badgeDl = !string.IsNullOrEmpty(p.DirectDownloadUrl) ? " ⬇️" : string.Empty; e.Value = $"{badgeTool}{badgeIso}{badgeDl} {p.DisplayName}"; }; // In InitProviderCombo(): nur EIN Aufruf statt zweier cboSource.SelectedIndexChanged += (s, e) => { UpdateHint(); UpdateBadgeLegend(SelectedProvider); // update badges }; if (cboSource.Items.Count > 0) cboSource.SelectedIndex = 0; // Initial legend UpdateBadgeLegend(SelectedProvider); } } // Reset all badges and highlight active ones. private void UpdateBadgeLegend(IInstallProvider p) { // local helper to style a "badge" label void Style(Label lbl, System.Drawing.Color back, System.Drawing.Color fore) { if (lbl == null) return; lbl.BackColor = back; lbl.ForeColor = fore; lbl.Padding = new Padding(6, 2, 6, 2); } // base (dim) + highlight colors var dimBack = System.Drawing.Color.FromArgb(240, 240, 240); var dimFore = System.Drawing.Color.Black; var hiBack = System.Drawing.Color.FromArgb(204, 222, 246); // blue badge var hiFore = System.Drawing.Color.Black; // reset all badges Style(lblBadgeNative, dimBack, dimFore); Style(lblBadgeExternal, dimBack, dimFore); Style(lblBadgeIso, dimBack, dimFore); Style(lblBadgeDl, dimBack, dimFore); if (p == null) return; // highlight active badges if (p.IsExternalTool) Style(lblBadgeExternal, hiBack, hiFore); else Style(lblBadgeNative, hiBack, hiFore); if (p.TypicallyNeedsIso) Style(lblBadgeIso, hiBack, hiFore); if (!string.IsNullOrEmpty(p.DirectDownloadUrl)) Style(lblBadgeDl, hiBack, hiFore); } public void RefreshView() { FilterProviders(""); } // -------------------------------------------------------------------------------- // Event wiring // -------------------------------------------------------------------------------- private void HookUpEvents() { // Install section if (btnRun != null) btnRun.Click += async (s, e) => await RunSelectedAsync(); if (btnHomepage != null) btnHomepage.Click += (s, e) => OpenHomepage(); if (btnDownload != null) btnDownload.Click += async (s, e) => await DownloadProviderAsync(); // One-click actions if (btnQuickRepair != null) btnQuickRepair.Click += async (s, e) => await RunQuickAsync("winreset"); // NativeResetProvider.Id if (btnCreateUsb != null) btnCreateUsb.Click += async (s, e) => await RunQuickAsync("mct"); // MctProvider.Id } private void WireUpTooltips() { if (toolTip1 == null) return; // Install toolTip1.SetToolTip(cboSource, "Choose the install source (Rufus, MCT, Ventoy, ...)."); toolTip1.SetToolTip(btnRun, "Open provider options (if any) and run the selected tool."); toolTip1.SetToolTip(btnHomepage, "Open the provider's official website."); toolTip1.SetToolTip(btnDownload, "Download the provider binary if a direct URL is available."); } private void UpdateHint() { if (lblHint == null) return; var p = SelectedProvider; lblHint.Text = p?.Hint ?? string.Empty; } // -------------------------------------------------------------------------------- // Provider selection helpers // -------------------------------------------------------------------------------- private IInstallProvider SelectedProvider => cboSource?.SelectedItem as IInstallProvider; private LastSelections GetLast(IInstallProvider p) { if (p == null) return null; if (!_lastByProvider.TryGetValue(p.Id, out var last)) { last = new LastSelections(); _lastByProvider[p.Id] = last; } return last; } // -------------------------------------------------------------------------------- // Install: run selected provider // -------------------------------------------------------------------------------- private async System.Threading.Tasks.Task RunSelectedAsync() { var p = SelectedProvider; if (p == null) return; var last = GetLast(p); // Let provider collect options / handle itself. var args = p.ShowOptionsAndBuildArgs(this, last); if (args == null) return; // canceled or fully handled inside provider if (p.IsExternalTool) { // External: resolve/browse EXE as before var exePath = ToolHelpers.ResolveToolPath(last.LastExePath, p.ExactExeNames, p.WildcardExePatterns); if (exePath == null) { using (var ofd = new OpenFileDialog { Title = $"Select {p.DisplayName} executable", Filter = "Executables (*.exe)|*.exe|All files (*.*)|*.*" }) { try { var downloads = System.IO.Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"); if (System.IO.Directory.Exists(downloads)) ofd.InitialDirectory = downloads; } catch { } if (ofd.ShowDialog(this) != DialogResult.OK) return; exePath = ofd.FileName; last.LastExePath = exePath; } } ToolHelpers.Run(exePath, args, asAdmin: true); } else { // Native/built-in: run by command name without file picker (UseShellExecute=true) var cmd = (p.ExactExeNames != null && p.ExactExeNames.Length > 0) ? p.ExactExeNames[0] // e.g., "systemreset.exe" : null; if (string.IsNullOrEmpty(cmd)) { MessageBox.Show(this, "No command specified for native provider.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } ToolHelpers.Run(cmd, args, asAdmin: true); } } private void OpenHomepage() { var p = SelectedProvider; if (p == null) return; if (string.IsNullOrEmpty(p.HomepageUrl)) { MessageBox.Show(this, $"No homepage is defined for {p.DisplayName}.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } ToolHelpers.OpenUri(p.HomepageUrl); } private async Task DownloadProviderAsync() { var p = SelectedProvider; if (p == null) return; if (string.IsNullOrEmpty(p.DirectDownloadUrl)) { MessageBox.Show(this, $"Direct download is not available for {p.DisplayName}. Please visit the homepage instead.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } var fileName = p.Id + ".exe"; // simple default filename await ToolHelpers.DownloadAsync(this, p.DirectDownloadUrl, fileName); } // -------------------------------------------------------------------------------- // Finds a provider by its Id in the already-registered _providers list (Quick-click) // -------------------------------------------------------------------------------- private IInstallProvider FindProviderById(string id) { if (string.IsNullOrEmpty(id)) return null; foreach (var p in _providers) if (string.Equals(p.Id, id, StringComparison.OrdinalIgnoreCase)) return p; return null; } // Selects the provider in the combo (for UI consistency) and runs it via existing pipeline private async System.Threading.Tasks.Task RunQuickAsync(string providerId) { var p = FindProviderById(providerId); if (p == null) { MessageBox.Show(this, $"Provider '{providerId}' not available.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } // Select in UI so hint/badges update if (cboSource != null) cboSource.SelectedItem = p; // Reuse your normal execution path await RunSelectedAsync(); } // -------------------------------------------------------------------------------- // Wires the search box to filter the providers list on-the-fly // -------------------------------------------------------------------------------- // Filters the combo by DisplayName/Id/Hint (case-insensitive). private void FilterProviders(string query) { if (cboSource == null) return; // filtered view on the fly var list = string.IsNullOrEmpty(query) ? _providers : _providers.FindAll(p => (p.DisplayName ?? "").IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0 || (p.Id ?? "").IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0 || (p.Hint ?? "").IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0); // Rebind cboSource.DataSource = null; cboSource.DataSource = list; cboSource.DisplayMember = nameof(IInstallProvider.DisplayName); if (cboSource.Items.Count > 0) cboSource.SelectedIndex = 0; } /// /// Called when the global search text changes from the MainForm. /// public void OnGlobalSearchChanged(string text) { FilterProviders(text ?? ""); } } } ================================================ FILE: Flyoobe/InstallView/AdvancedControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 17, 17 ================================================ FILE: Flyoobe/InstallView/BackupDriversProvider.cs ================================================ using System; using System.Diagnostics; using System.IO; using System.Windows.Forms; namespace Flyoobe { // Provider that exports all installed drivers into a fixed subfolder named "DriversBackup" // INSIDE the parent folder chosen by the user, using: // pnputil.exe /export-driver * \DriversBackup // Behavior: // - Prompts user to choose a parent folder (defaults to C:\). // - Always creates/uses "\DriversBackup". // - Runs pnputil elevated. // - Shows a completion summary with INF package count. public sealed class BackupDriversProvider : IInstallProvider { public string Id => "drivers-backup"; public string DisplayName => "Backup installed drivers (choose folder)"; public string HomepageUrl => null; public string DirectDownloadUrl => null; public string[] ExactExeNames => new[] { "pnputil.exe" }; public string[] WildcardExePatterns => Array.Empty(); public bool TypicallyNeedsIso => false; public bool IsExternalTool => false; public string Hint => "Exports all currently installed device drivers (INF + binaries) to a folder you choose. " + "After a clean install, point Device Manager to that folder to restore drivers even without internet."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { // Default suggestion for the parent, the actual export target will be \DriversBackup var defaultParent = @"C:\"; string parentPath; // pick the PARENT folder where the 'DriversBackup' subfolder will be created using (var fbd = new FolderBrowserDialog { Description = "Choose the PARENT folder. A 'DriversBackup' subfolder will be created inside it.", ShowNewFolderButton = true, SelectedPath = defaultParent }) { var dlgResult = fbd.ShowDialog(owner); if (dlgResult != DialogResult.OK || string.IsNullOrWhiteSpace(fbd.SelectedPath)) return null; //user cancelled parentPath = fbd.SelectedPath.Trim(); try { //Normalize parent path parentPath = Path.GetFullPath(parentPath); } catch { //Keep raw selection if normalization fails (we'll error out later if invalid) } } // Build the fixed subfolder path: \DriversBackup (always appended) string target = Path.Combine(parentPath, "DriversBackup"); // Confirm before running the elevated export if (!ToolHelpers.Confirm(owner, "Export all installed drivers to:\r\n\r\n" + target + "\r\n\r\nThis will run 'pnputil /export-driver *' with administrative rights.")) return null; // Ensure the target DriversBackup folder exists try { Directory.CreateDirectory(target); } catch (Exception ex) { MessageBox.Show(owner, "Could not create target folder:\r\n" + target + "\r\n\r\n" + ex.Message, "Folder error", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } try { // Start pnputil as an elevated process targeting the 'DriversBackup' subfolder var psi = new ProcessStartInfo { FileName = "pnputil.exe", Arguments = "/export-driver * \"" + target + "\"", UseShellExecute = true, Verb = "runas", // force elevation CreateNoWindow = true }; using (var proc = Process.Start(psi)) { if (proc == null) { MessageBox.Show(owner, "Could not start pnputil.exe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } proc.WaitForExit(); } // Count exported INF files to provide a quick summary int infCount = 0; try { infCount = Directory.GetFiles(target, "*.inf", SearchOption.AllDirectories).Length; } catch { // Ignore counting errors; we can still show success without the count } MessageBox.Show(owner, "Driver export completed.\r\n\r\n" + $"Target: {target}\r\n" + $"Exported driver packages: {infCount}\r\n\r\n" + "Tip: After reinstall, in Device Manager choose 'Update driver' → 'Browse my computer' " + "and select this folder to restore drivers.", "Export complete", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show(owner, "Failed to run pnputil:\r\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return null; // returning null indicates no further action needed } } } ================================================ FILE: Flyoobe/InstallView/BootMenuInfoProvider.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; //HATING WMI NEEDS IMPROVEMENT! namespace Flyoobe { // Just Pure info provider: shows common Boot Menu / BIOS keys by vendor. // No tool launch; the provider only displays a small dialog with helpful hints. public sealed class BootMenuInfoProvider : IInstallProvider { public string Id => "bootmenu-info"; public string DisplayName => "Boot Menu keys (info)"; public string HomepageUrl => null; public string DirectDownloadUrl => null; public string[] ExactExeNames => Array.Empty(); public string[] WildcardExePatterns => Array.Empty(); public bool TypicallyNeedsIso => false; public bool IsExternalTool => false; public string Hint => "Shows common Boot Menu and BIOS/UEFI keys for popular manufacturers. " + "Helpful when you want to boot from a USB installer."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { // Build and show info dialog; nothing to run afterwards. using (var dlg = new BootMenuInfoDialog()) { dlg.ShowDialog(owner); } return null; } // ------------------ self-contained dialog (no designer) ------------------ private sealed class BootMenuInfoDialog : Form { private readonly TextBox _txt; private readonly Button _btnCopy; private readonly Button _btnRecovery; private readonly Button _btnClose; public BootMenuInfoDialog() { Text = "Boot Menu keys (info)"; StartPosition = FormStartPosition.CenterParent; FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false; AutoSize = true; AutoSizeMode = AutoSizeMode.GrowAndShrink; Padding = new Padding(12); // Main multiline textbox (read-only) _txt = new TextBox { Multiline = true, ReadOnly = true, ScrollBars = ScrollBars.Vertical, WordWrap = false, Width = 520, Height = 360 }; // Buttons _btnCopy = new Button { Text = "Copy to clipboard", AutoSize = true }; _btnRecovery = new Button { Text = "Open Recovery settings", AutoSize = true }; _btnClose = new Button { Text = "Close", AutoSize = true, DialogResult = DialogResult.OK }; _btnCopy.Click += (s, e) => { try { Clipboard.SetText(_txt.Text); } catch { } }; _btnRecovery.Click += (s, e) => { ToolHelpers.OpenUri("ms-settings:recovery"); }; var btnPanel = new FlowLayoutPanel { FlowDirection = FlowDirection.RightToLeft, AutoSize = true, Dock = DockStyle.Fill, Margin = new Padding(0, 8, 0, 0) }; btnPanel.Controls.Add(_btnClose); btnPanel.Controls.Add(_btnRecovery); btnPanel.Controls.Add(_btnCopy); var root = new TableLayoutPanel { ColumnCount = 1, AutoSize = true, Dock = DockStyle.Fill }; root.Controls.Add(_txt); root.Controls.Add(btnPanel); Controls.Add(root); AcceptButton = _btnClose; CancelButton = _btnClose; // Populate content _txt.Text = BuildContent(); } // Returns vendor + model (if available) and a table of common keys. private string BuildContent() { // Known keys by vendor (not exhaustive, but practical) var map = new List<(string Vendor, string BootMenu, string BiosSetup)> { ("Acer", "F12", "F2"), ("ASUS", "Esc or F8", "Del or F2"), ("Dell", "F12", "F2"), ("HP", "Esc or F9", "Esc or F10"), ("Lenovo", "F12 (Fn+F12)", "F1 or F2"), ("MSI", "F11", "Del"), ("Gigabyte", "F12", "Del"), ("ASRock", "F11", "F2 or Del"), ("Toshiba", "F12", "F2"), ("Sony", "F11 or Assist", "F2"), ("Samsung", "Esc or F12", "F2"), ("Microsoft", "Vol-Down + Power (Surface)", "Vol-Up + Power (UEFI)") }; // Try to read Manufacturer/Model (WMI) var (manufacturer, model) = GetSystemVendor(); var sb = new StringBuilder(); // Header sb.AppendLine("Boot Menu & BIOS/UEFI keys"); sb.AppendLine("---------------------------"); if (!string.IsNullOrWhiteSpace(manufacturer) || !string.IsNullOrWhiteSpace(model)) { sb.AppendLine($"Detected: {TrimOrUnknown(manufacturer)} {TrimOrUnknown(model)}"); } else { sb.AppendLine("Detected: (unknown manufacturer/model)"); } sb.AppendLine(); // If we have a known vendor, show it first var primary = map.FirstOrDefault(x => manufacturer != null && manufacturer.IndexOf(x.Vendor, StringComparison.OrdinalIgnoreCase) >= 0); if (!string.IsNullOrEmpty(primary.Vendor)) { sb.AppendLine($"★ Recommended for your device ({primary.Vendor}):"); sb.AppendLine($" Boot Menu: {primary.BootMenu}"); sb.AppendLine($" BIOS/UEFI: {primary.BiosSetup}"); sb.AppendLine(); } // Table of common keys sb.AppendLine("Common keys by vendor:"); sb.AppendLine("Vendor | Boot Menu | BIOS/UEFI"); sb.AppendLine("--------------+-------------------+----------------"); foreach (var entry in map) { sb.AppendLine( $"{entry.Vendor.PadRight(12)}| {entry.BootMenu.PadRight(18)}| {entry.BiosSetup}"); } sb.AppendLine(); sb.AppendLine("Tips:"); sb.AppendLine("- Press and hold the key right after power-on, before the Windows logo."); sb.AppendLine("- On some laptops you may need to hold Fn with the function key (e.g., Fn+F12)."); sb.AppendLine("- If you cannot reach the menu, use 'Open Recovery settings' and choose Advanced startup → UEFI Firmware Settings."); return sb.ToString(); } private static (string Manufacturer, string Model) GetSystemVendor() { try { using (var searcher = new ManagementObjectSearcher("SELECT Manufacturer, Model FROM Win32_ComputerSystem")) { foreach (ManagementObject mo in searcher.Get()) { var m = (mo["Manufacturer"] as string) ?? ""; var model = (mo["Model"] as string) ?? ""; return (m.Trim(), model.Trim()); } } } catch { /* WMI not available or permission issue */ } return (null, null); } private static string TrimOrUnknown(string s) => string.IsNullOrWhiteSpace(s) ? "(unknown)" : s.Trim(); } } } ================================================ FILE: Flyoobe/InstallView/InPlaceRepairProvider.cs ================================================ using System.IO; using System.Windows.Forms; namespace Flyoobe { // Runs setup.exe from a mounted Windows ISO with upgrade parameters. public sealed class InPlaceRepairProvider : IInstallProvider { public string Id => "inplace"; public string DisplayName => "Repair upgrade (keeps apps & files)"; public string HomepageUrl => null; public string DirectDownloadUrl => null; public string[] ExactExeNames => new[] { "setup.exe" }; // for documentation only public string[] WildcardExePatterns => System.Array.Empty(); public bool TypicallyNeedsIso => true; public bool IsExternalTool => false; public string Hint => "Starts Windows Setup from a mounted ISO in automatic repair mode. " + "This reinstalls Windows while keeping your apps, settings, and personal files. " + "Recommended if your system is broken but you want to keep everything."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { var setupPath = FindSetupExeOnMountedDrives(); if (setupPath == null) { MessageBox.Show(owner, "No 'setup.exe' found. Please mount a Windows ISO first.", "Setup not found", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; } if (!ToolHelpers.Confirm(owner, "Start repair upgrade via setup.exe? The PC will restart during the process.")) return null; // Start directly and handle here ToolHelpers.Run(setupPath, "/auto upgrade /dynamicupdate enable", asAdmin: true); return null; // handled > host should not run anything else } private static string FindSetupExeOnMountedDrives() { try { foreach (var di in DriveInfo.GetDrives()) { if (di.DriveType == DriveType.CDRom || di.DriveType == DriveType.Removable || di.DriveType == DriveType.Fixed) { var p = Path.Combine(di.Name, "setup.exe"); if (File.Exists(p)) return p; } } } catch { } return null; } } } ================================================ FILE: Flyoobe/InstallView/InstallProviders.cs ================================================ using System.Windows.Forms; namespace Flyoobe { /// /// Shared "last selection" holder reused by providers (ISO/exe). /// public sealed class LastSelections { public string LastIsoPath { get; set; } public string LastExePath { get; set; } } /// /// Contract for install sources like Rufus, MCT, Ventoy, ... /// public interface IInstallProvider { string Id { get; } string DisplayName { get; } string HomepageUrl { get; } // may be null string DirectDownloadUrl { get; } // may be null string[] ExactExeNames { get; } // e.g. "rufus.exe" string[] WildcardExePatterns { get; } // e.g. "rufus*.exe" bool TypicallyNeedsIso { get; } // hint for UI bool IsExternalTool { get; } // if true > resolve/browse EXE; if false > launch by command name (no file picker) /// /// Short hint shown in the UI. /// string Hint { get; } /// /// Show provider-specific options dialog (if any) and build CLI args. /// Return null if user cancelled. /// string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last); } } ================================================ FILE: Flyoobe/InstallView/MctProvider.cs ================================================ using System.Text; using System.Windows.Forms; namespace Flyoobe { public sealed class MctProvider : IInstallProvider { public string Id => "mct"; public string DisplayName => "Media Creation Tool (Windows 11 Version 25H2)"; public string HomepageUrl => "https://www.microsoft.com/software-download/windows11"; public string DirectDownloadUrl => "https://go.microsoft.com/fwlink/?linkid=2156295"; public string[] ExactExeNames => new[] { "MediaCreationTool_Win11.exe" }; public string[] WildcardExePatterns => new[] { "MediaCreationTool*.exe" }; public bool IsExternalTool => true; // needs browsing/resolving public bool TypicallyNeedsIso => false; public string Hint => "The Media Creation Tool can download and create media itself. ISO is not mandatory."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { using (var dlg = new MctOptionsDialog()) { if (dlg.ShowDialog(owner) != DialogResult.OK) return null; // Keep GUI visible: only partial switches var sb = new StringBuilder(); if (dlg.AcceptEula) sb.Append("/Eula Accept "); if (!string.IsNullOrWhiteSpace(dlg.SelectedArchitecture)) sb.Append("/MediaArch ").Append(dlg.SelectedArchitecture).Append(' '); if (!string.IsNullOrWhiteSpace(dlg.LanguageCode)) sb.Append("/MediaLangCode ").Append(dlg.LanguageCode.ToLowerInvariant()).Append(' '); if (dlg.RetailMode) sb.Append("/Retail "); if (dlg.Selfhost) sb.Append("/Selfhost "); return sb.ToString().Trim(); } } // --- Provider-local dialog (no designer) ------------------------------------------------------ private sealed class MctOptionsDialog : Form { private ComboBox cmbArch; private TextBox txtLang; private CheckBox chkEula; private CheckBox chkRetail; private CheckBox chkSelfhost; private Button btnOk; private Button btnCancel; public string SelectedArchitecture => (cmbArch.SelectedItem as string) ?? "x64"; public string LanguageCode => string.IsNullOrWhiteSpace(txtLang.Text) ? "en-us" : txtLang.Text.Trim().ToLowerInvariant(); public bool AcceptEula => chkEula.Checked; public bool RetailMode => chkRetail.Checked; public bool Selfhost => chkSelfhost.Checked; public MctOptionsDialog() { Text = "Media Creation Tool – Preset Options"; StartPosition = FormStartPosition.CenterParent; FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false; AutoSize = true; AutoSizeMode = AutoSizeMode.GrowAndShrink; Padding = new Padding(12); var layout = new TableLayoutPanel { ColumnCount = 2, AutoSize = true, Dock = DockStyle.Fill }; layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); // Architecture layout.Controls.Add(new Label { Text = "Architecture:", AutoSize = true, Margin = new Padding(0, 6, 8, 6) }, 0, 0); cmbArch = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 160 }; cmbArch.Items.AddRange(new object[] { "x64", "x86", "Both" }); cmbArch.SelectedIndex = 0; layout.Controls.Add(cmbArch, 1, 0); // Language layout.Controls.Add(new Label { Text = "Language code:", AutoSize = true, Margin = new Padding(0, 6, 8, 6) }, 0, 1); var defLang = System.Globalization.CultureInfo.CurrentUICulture?.Name?.ToLowerInvariant() ?? "en-us"; txtLang = new TextBox { Width = 200, Text = defLang }; layout.Controls.Add(txtLang, 1, 1); // Options chkEula = new CheckBox { Text = "Accept EULA", Checked = true, AutoSize = true }; chkRetail = new CheckBox { Text = "Retail mode", Checked = false, AutoSize = true }; chkSelfhost = new CheckBox { Text = "Selfhost", Checked = false, AutoSize = true }; var opts = new FlowLayoutPanel { FlowDirection = FlowDirection.LeftToRight, AutoSize = true }; opts.Controls.Add(chkEula); opts.Controls.Add(chkRetail); opts.Controls.Add(chkSelfhost); layout.Controls.Add(new Label { Text = "Options:", AutoSize = true, Margin = new Padding(0, 6, 8, 6) }, 0, 2); layout.Controls.Add(opts, 1, 2); // Buttons var pnlButtons = new FlowLayoutPanel { FlowDirection = FlowDirection.RightToLeft, AutoSize = true, Margin = new Padding(0, 12, 0, 0) }; btnOk = new Button { Text = "OK", DialogResult = DialogResult.OK, AutoSize = true }; btnCancel = new Button { Text = "Cancel", DialogResult = DialogResult.Cancel, AutoSize = true, Margin = new Padding(6, 0, 0, 0) }; pnlButtons.Controls.Add(btnOk); pnlButtons.Controls.Add(btnCancel); layout.Controls.Add(pnlButtons, 0, 3); layout.SetColumnSpan(pnlButtons, 2); Controls.Add(layout); AcceptButton = btnOk; CancelButton = btnCancel; } } } } ================================================ FILE: Flyoobe/InstallView/MountIsoProvider.cs ================================================ using System.Windows.Forms; namespace Flyoobe { // Lets the user pick an ISO and mounts it via PowerShell (Mount-DiskImage). public sealed class MountIsoProvider : IInstallProvider { public string Id => "mountiso"; public string DisplayName => "Mount ISO… (built-in)"; public string HomepageUrl => null; public string DirectDownloadUrl => null; public string[] ExactExeNames => System.Array.Empty(); public string[] WildcardExePatterns => System.Array.Empty(); public bool TypicallyNeedsIso => false; public bool IsExternalTool => false; public string Hint => "Pick a Windows ISO and mount it using PowerShell."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { using (var ofd = new OpenFileDialog { Filter = "ISO files (*.iso)|*.iso|All files (*.*)|*.*" }) { if (ofd.ShowDialog(owner) != DialogResult.OK) return null; var isoPath = ofd.FileName; var ps = "-NoProfile -Command \"Mount-DiskImage -ImagePath '" + isoPath + "' -PassThru | Out-Null\""; if (!ToolHelpers.Run("powershell.exe", ps, asAdmin: true)) { MessageBox.Show(owner, "Could not mount ISO. Try manual mount via Explorer (Right-click → Mount).", "Mount failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); } // remember last ISO for other providers (just optional) if (last != null) last.LastIsoPath = isoPath; } return null; // handled } } } ================================================ FILE: Flyoobe/InstallView/NativeResetProvider.cs ================================================ using Flyoobe; using System; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames; public sealed class NativeResetProvider : IInstallProvider { public string Id => "winreset"; public string DisplayName => "Windows Reset (built-in)"; public string HomepageUrl => "ms-settings:recovery"; public string DirectDownloadUrl => null; public string[] ExactExeNames => new[] { "systemreset.exe" }; // only Doku public string[] WildcardExePatterns => Array.Empty(); public bool TypicallyNeedsIso => false; public bool IsExternalTool => false; public string Hint => "Built-in Windows reset. Inside the wizard choose 'Keep my files' or 'Remove everything' and optionally 'Cloud download'."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { using (var dlg = new ResetOptionsDialog()) { if (dlg.ShowDialog(owner) != DialogResult.OK) return null; // canceled > host does not do anything switch (dlg.SelectedMode) { case ResetMode.ResetWizard: if (!ToolHelpers.Confirm(owner, "Start 'Reset this PC'? This may remove apps/data depending on your selection.")) return null; if (!ToolHelpers.Run("systemreset.exe", "-factoryreset", true)) ToolHelpers.Run("systemreset.exe", "", true); return null; //RunSelectedAsync() should not start anything else case ResetMode.RebootToWinRE: ToolHelpers.Run("shutdown.exe", "/r /o /t 0 /f", true); return null; case ResetMode.OpenSettings: ToolHelpers.OpenUri("ms-settings:recovery"); return null; default: return null; } } } private enum ResetMode { ResetWizard, RebootToWinRE, OpenSettings } private sealed class ResetOptionsDialog : Form { private RadioButton rbWizard, rbWinre, rbSettings; private Button btnOk, btnCancel; public ResetMode SelectedMode => rbWizard.Checked ? ResetMode.ResetWizard : rbWinre.Checked ? ResetMode.RebootToWinRE : ResetMode.OpenSettings; public ResetOptionsDialog() { Text = "Windows Reset options"; StartPosition = FormStartPosition.CenterParent; FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false; AutoSize = true; AutoSizeMode = AutoSizeMode.GrowAndShrink; Padding = new Padding(12); var root = new TableLayoutPanel { ColumnCount = 1, AutoSize = true, Dock = DockStyle.Fill }; rbWizard = new RadioButton { Text = "Open Reset wizard (systemreset.exe -factoryreset)", Checked = true, AutoSize = true }; rbWinre = new RadioButton { Text = "Reboot into Advanced Startup (WinRE)", AutoSize = true }; rbSettings = new RadioButton { Text = "Open Recovery Settings", AutoSize = true }; root.Controls.Add(rbWizard); root.Controls.Add(rbWinre); root.Controls.Add(rbSettings); root.Controls.Add(new Label { AutoSize = true, MaximumSize = new System.Drawing.Size(520, 0), Margin = new Padding(0, 8, 0, 0), Text = "Note: Windows does not provide supported CLI switches to pre-select 'Keep my files', 'Remove everything' or 'Cloud download'. Choose them in the wizard." }); var pnlButtons = new FlowLayoutPanel { FlowDirection = FlowDirection.RightToLeft, AutoSize = true, Margin = new Padding(0, 12, 0, 0) }; btnOk = new Button { Text = "OK", DialogResult = DialogResult.OK, AutoSize = true }; btnCancel = new Button { Text = "Cancel", DialogResult = DialogResult.Cancel, AutoSize = true, Margin = new Padding(6, 0, 0, 0) }; pnlButtons.Controls.Add(btnOk); pnlButtons.Controls.Add(btnCancel); root.Controls.Add(pnlButtons); Controls.Add(root); AcceptButton = btnOk; CancelButton = btnCancel; } } } ================================================ FILE: Flyoobe/InstallView/RebootToUefiProvider.cs ================================================ using System; using System.Windows.Forms; namespace Flyoobe { // Native provider to reboot directly into UEFI/BIOS setup using "shutdown.exe /r /fw /t 0". // If /fw is not supported on the machine, we offer a fallback to Recovery Settings (WinRE path to UEFI Firmware Settings). public sealed class RebootToUefiProvider : IInstallProvider { public string Id => "uefi-reboot"; public string DisplayName => "Reboot into UEFI firmware (BIOS)"; public string HomepageUrl => null; public string DirectDownloadUrl => null; public string[] ExactExeNames => new[] { "shutdown.exe" }; // informational public string[] WildcardExePatterns => Array.Empty(); public bool TypicallyNeedsIso => false; public bool IsExternalTool => false; public string Hint => "Restarts the PC straight into UEFI/BIOS setup (if supported by the firmware). " + "Useful to change boot order before a clean install."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { // Confirm with the user (explicit reboot). if (!ToolHelpers.Confirm(owner, "Reboot into UEFI/BIOS now? The PC will restart immediately.")) { return null; // canceled } // Try the native fast path first: /r /fw /t 0 var ok = ToolHelpers.Run("shutdown.exe", "/r /fw /t 0", asAdmin: true); if (!ok) { // Not supported or blocked on this device > offer a fallback.... var choice = MessageBox.Show(owner, "Direct firmware reboot was not supported on this device.\r\n\r\n" + "Open Recovery settings so you can choose 'UEFI Firmware Settings' after a restart?", "UEFI reboot fallback", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); if (choice == DialogResult.OK) { // Settings > System > Recovery (so we can go to Advanced startup > UEFI Firmware Settings) ToolHelpers.OpenUri("ms-settings:recovery"); } } // We handled everything here; host should not try to launch an external EXE. return null; } } } ================================================ FILE: Flyoobe/InstallView/RufusProvider.cs ================================================ using System.IO; using System.Text; using System.Windows.Forms; namespace Flyoobe { public sealed class RufusProvider : IInstallProvider { public string Id => "rufus"; public string DisplayName => "Rufus"; public string HomepageUrl => "https://rufus.ie"; public string DirectDownloadUrl => "https://github.com/pbatard/rufus/releases/download/v4.9/rufus-4.9.exe"; // keep homepage public string[] ExactExeNames => new[] { "rufus.exe" }; public string[] WildcardExePatterns => new[] { "rufus*.exe" }; public bool IsExternalTool => true; // needs browsing/resolving public bool TypicallyNeedsIso => true; public string Hint => "Rufus requires you to provide a Windows ISO file. It will create a bootable USB stick."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { // Ask / ensure ISO first var isoPath = EnsureIso(owner, last); if (isoPath == null) return null; // user cancelled // Show provider-local dialog and build CLI args using (var dlg = new RufusOptionsDialog(System.Globalization.CultureInfo.CurrentUICulture?.Name ?? "en-US")) { if (dlg.ShowDialog(owner) != DialogResult.OK) return null; // Build CLI: -g -i -l -f -x -w var sb = new StringBuilder(); sb.Append("-g "); sb.Append("-i \"").Append(isoPath).Append("\" "); if (!string.IsNullOrWhiteSpace(dlg.SelectedLocale)) sb.Append("-l ").Append(dlg.SelectedLocale).Append(' '); if (!string.IsNullOrWhiteSpace(dlg.SelectedFilesystem)) sb.Append("-f ").Append(dlg.SelectedFilesystem).Append(' '); if (dlg.ExtraDevices) sb.Append("-x "); if (dlg.WaitTensOfSeconds > 0) sb.Append("-w ").Append(dlg.WaitTensOfSeconds).Append(' '); return sb.ToString().Trim(); } } private static string EnsureIso(IWin32Window owner, LastSelections last) { // Reuse last ISO if available if (!string.IsNullOrEmpty(last.LastIsoPath) && File.Exists(last.LastIsoPath)) { var res = MessageBox.Show(owner, "Use last selected ISO?\n\n" + last.LastIsoPath, "Rufus", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (res == DialogResult.Cancel) return null; if (res == DialogResult.Yes) return last.LastIsoPath; } // Ask for ISO using (var ofd = new OpenFileDialog { Title = "Select Windows ISO", Filter = "ISO (*.iso)|*.iso|All files (*.*)|*.*" }) { if (ofd.ShowDialog(owner) != DialogResult.OK) return null; last.LastIsoPath = ofd.FileName; return ofd.FileName; } } // --- Provider-local dialog (no Designer needed) -------------------------------- // Keeping this dialog private to avoid leaking UI details outside the provider. private sealed class RufusOptionsDialog : Form { private ComboBox cmbFilesystem; private ComboBox cmbLocale; private CheckBox chkExtra; private NumericUpDown numWait; private Button btnOk; private Button btnCancel; public string SelectedFilesystem => (cmbFilesystem.SelectedItem as string) ?? "ntfs"; public string SelectedLocale => string.IsNullOrWhiteSpace(cmbLocale.Text) ? "en-US" : cmbLocale.Text.Trim(); public bool ExtraDevices => chkExtra.Checked; public int WaitTensOfSeconds => (int)numWait.Value; public RufusOptionsDialog(string defaultLocale) { // Minimal, self-contained WinForms dialog Text = "Rufus options"; StartPosition = FormStartPosition.CenterParent; FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false; AutoSize = true; AutoSizeMode = AutoSizeMode.GrowAndShrink; Padding = new Padding(12); var layout = new TableLayoutPanel { ColumnCount = 2, RowCount = 5, AutoSize = true, Dock = DockStyle.Fill }; layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); // Filesystem layout.Controls.Add(new Label { Text = "Filesystem:", AutoSize = true, Margin = new Padding(0, 6, 8, 6) }, 0, 0); cmbFilesystem = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 160 }; cmbFilesystem.Items.AddRange(new object[] { "ntfs", "fat32", "exfat" }); cmbFilesystem.SelectedIndex = 0; layout.Controls.Add(cmbFilesystem, 1, 0); // Locale layout.Controls.Add(new Label { Text = "Locale:", AutoSize = true, Margin = new Padding(0, 6, 8, 6) }, 0, 1); cmbLocale = new ComboBox { DropDownStyle = ComboBoxStyle.DropDown, Width = 160 }; cmbLocale.Items.AddRange(new object[] { "en-US", "de-DE", "fr-FR", "it-IT", "es-ES" }); if (!string.IsNullOrEmpty(defaultLocale) && !cmbLocale.Items.Contains(defaultLocale)) cmbLocale.Items.Insert(0, defaultLocale); cmbLocale.Text = string.IsNullOrEmpty(defaultLocale) ? "en-US" : defaultLocale; layout.Controls.Add(cmbLocale, 1, 1); // Extra devices layout.Controls.Add(new Label { Text = "List extra devices (-x):", AutoSize = true, Margin = new Padding(0, 6, 8, 6) }, 0, 2); chkExtra = new CheckBox { Checked = false, AutoSize = true }; layout.Controls.Add(chkExtra, 1, 2); // Wait layout.Controls.Add(new Label { Text = "Wait (-w) (tens of seconds):", AutoSize = true, Margin = new Padding(0, 6, 8, 6) }, 0, 3); numWait = new NumericUpDown { Minimum = 0, Maximum = 120, Value = 0, Width = 80 }; layout.Controls.Add(numWait, 1, 3); // Buttons var panelButtons = new FlowLayoutPanel { FlowDirection = FlowDirection.RightToLeft, AutoSize = true, Dock = DockStyle.Fill, Margin = new Padding(0, 12, 0, 0) }; btnOk = new Button { Text = "OK", DialogResult = DialogResult.OK, AutoSize = true }; btnCancel = new Button { Text = "Cancel", DialogResult = DialogResult.Cancel, AutoSize = true, Margin = new Padding(6, 0, 0, 0) }; panelButtons.Controls.Add(btnOk); panelButtons.Controls.Add(btnCancel); layout.Controls.Add(panelButtons, 0, 4); layout.SetColumnSpan(panelButtons, 2); Controls.Add(layout); AcceptButton = btnOk; CancelButton = btnCancel; } } } } ================================================ FILE: Flyoobe/InstallView/RunSetupFromIsoProvider.cs ================================================ using System.IO; using System.Windows.Forms; namespace Flyoobe { // Launches setup.exe from mounted ISO without parameters. public sealed class RunSetupFromIsoProvider : IInstallProvider { public string Id => "setupfromiso"; public string DisplayName => "Run Windows Setup from ISO (full wizard)"; public string HomepageUrl => null; public string DirectDownloadUrl => null; public string[] ExactExeNames => new[] { "setup.exe" }; public string[] WildcardExePatterns => System.Array.Empty(); public bool TypicallyNeedsIso => true; public bool IsExternalTool => false; public string Hint => "Opens the full Windows Setup wizard from a mounted ISO. " + "You can choose between Upgrade or Clean install and set partitions manually. " + "Recommended if you want complete control over the installation process."; public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { var setup = FindSetupExeOnMountedDrives(); if (setup == null) { MessageBox.Show(owner, "No mounted Windows ISO with 'setup.exe' found.", "Setup missing", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; } if (!ToolHelpers.Confirm(owner, "Run setup.exe from the mounted ISO?")) return null; ToolHelpers.Run(setup, "", asAdmin: true); return null; } private static string FindSetupExeOnMountedDrives() { try { foreach (var di in DriveInfo.GetDrives()) { if (di.DriveType == DriveType.CDRom || di.DriveType == DriveType.Removable || di.DriveType == DriveType.Fixed) { var p = Path.Combine(di.Name, "setup.exe"); if (File.Exists(p)) return p; } } } catch { } return null; } } } ================================================ FILE: Flyoobe/InstallView/ToolHelper.cs ================================================ using System; using System.Diagnostics; using System.IO; using System.Net; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { internal static class ToolHelpers { /// Try last path, app base, CWD, then PATH (wildcards allowed). public static string ResolveToolPath(string lastPath, string[] exactFileNames, string[] patterns) { try { if (!string.IsNullOrEmpty(lastPath) && File.Exists(lastPath)) return lastPath; var baseDir = AppDomain.CurrentDomain.BaseDirectory; var cwd = Environment.CurrentDirectory; // exact files in base/cwd if (exactFileNames != null) { foreach (var f in exactFileNames) { var p1 = Path.Combine(baseDir, f); if (File.Exists(p1)) return p1; var p2 = Path.Combine(cwd, f); if (File.Exists(p2)) return p2; } } // wildcards in base/cwd if (patterns != null) { foreach (var pat in patterns) { var m1 = SafeGetFiles(baseDir, pat); if (m1?.Length > 0) return m1[0]; var m2 = SafeGetFiles(cwd, pat); if (m2?.Length > 0) return m2[0]; } } // PATH dirs (wildcards) var env = Environment.GetEnvironmentVariable("PATH"); if (!string.IsNullOrEmpty(env) && patterns != null) { foreach (var dir in env.Split(Path.PathSeparator)) { foreach (var pat in patterns) { var m = SafeGetFiles(dir, pat); if (m?.Length > 0) return m[0]; } } } } catch { } return null; } private static string[] SafeGetFiles(string dir, string pattern) { try { return Directory.GetFiles(dir, pattern); } catch { return null; } } public static bool Confirm(IWin32Window owner, string msg) => MessageBox.Show(owner, msg, "Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK; public static bool Run(string file, string args, bool asAdmin) { try { var psi = new ProcessStartInfo { FileName = file, Arguments = args ?? "", UseShellExecute = true }; if (asAdmin) psi.Verb = "runas"; Process.Start(psi); return true; } catch (Exception ex) { MessageBox.Show("Start failed:\n" + file + " " + args + "\n\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } public static void OpenUri(string uri) { try { Process.Start(new ProcessStartInfo(uri) { UseShellExecute = true }); } catch (Exception ex) { MessageBox.Show("Could not open link: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } public static async Task DownloadAsync(IWin32Window owner, string url, string defaultFileName) { using (var sfd = new SaveFileDialog { FileName = defaultFileName, Filter = "Programs (*.exe)|*.exe|All files (*.*)|*.*" }) { if (sfd.ShowDialog(owner) != DialogResult.OK) return false; try { try { ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; } catch { } using (var wc = new WebClient()) { Cursor.Current = Cursors.WaitCursor; await wc.DownloadFileTaskAsync(new Uri(url), sfd.FileName); } MessageBox.Show("Download complete: " + sfd.FileName, "Done", MessageBoxButtons.OK, MessageBoxIcon.Information); return true; } catch (Exception ex) { MessageBox.Show("Download failed: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } finally { Cursor.Current = Cursors.Default; } } } } } ================================================ FILE: Flyoobe/InstallView/VentoyProvider.cs ================================================ using System.Windows.Forms; namespace Flyoobe { public sealed class VentoyProvider : IInstallProvider { public string Id => "ventoy"; public string DisplayName => "Ventoy"; public string HomepageUrl => "https://www.ventoy.net/en/download.html"; public string DirectDownloadUrl => null; // Ventoy ships as ZIP/installer, no stable EXE direct link public string[] ExactExeNames => new[] { "Ventoy2Disk.exe" }; public string[] WildcardExePatterns => new[] { "Ventoy*Disk*.exe" }; public bool IsExternalTool => true; // needs browsing/resolving public bool TypicallyNeedsIso => false; // Custom hint for the UI public string Hint => "Ventoy creates a USB drive where you can later copy multiple ISO files. " + "You don't need to select an ISO during setup."; // Add advanced CLI support!? public string ShowOptionsAndBuildArgs(IWin32Window owner, LastSelections last) { // Ventoy doesn't really use CLI args for normal installation. // Just launch the GUI and let the user configure inside. return string.Empty; } } } ================================================ FILE: Flyoobe/MainForm.Designer.cs ================================================ namespace Flyoobe { partial class MainForm { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.lblHeader = new System.Windows.Forms.Label(); this.panelHost = new System.Windows.Forms.Panel(); this.btnRefresh = new System.Windows.Forms.Button(); this.btnBack = new System.Windows.Forms.Button(); this.toolTip = new System.Windows.Forms.ToolTip(this.components); this.btnActivity = new System.Windows.Forms.Button(); this.panelForm = new System.Windows.Forms.Panel(); this.textSearch = new System.Windows.Forms.TextBox(); this.btnSettings = new NavButton(); this.btnExtensions = new NavButton(); this.btnOobe = new NavButton(); this.btnHome = new NavButton(); this.panelForm.SuspendLayout(); this.SuspendLayout(); // // lblHeader // this.lblHeader.AutoEllipsis = true; this.lblHeader.BackColor = System.Drawing.Color.Transparent; this.lblHeader.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 13.75F, System.Drawing.FontStyle.Bold); this.lblHeader.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); this.lblHeader.Location = new System.Drawing.Point(37, 52); this.lblHeader.Name = "lblHeader"; this.lblHeader.Size = new System.Drawing.Size(214, 23); this.lblHeader.TabIndex = 512; this.lblHeader.Text = "Home"; this.lblHeader.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.lblHeader.UseCompatibleTextRendering = true; // // panelHost // this.panelHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelHost.AutoScroll = true; this.panelHost.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.panelHost.Location = new System.Drawing.Point(17, 92); this.panelHost.Name = "panelHost"; this.panelHost.Size = new System.Drawing.Size(811, 436); this.panelHost.TabIndex = 333; // // btnRefresh // this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnRefresh.AutoSize = true; this.btnRefresh.BackColor = System.Drawing.Color.Transparent; this.btnRefresh.Cursor = System.Windows.Forms.Cursors.Hand; this.btnRefresh.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(235)))), ((int)(((byte)(235))))); this.btnRefresh.FlatAppearance.BorderSize = 0; this.btnRefresh.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White; this.btnRefresh.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White; this.btnRefresh.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnRefresh.Font = new System.Drawing.Font("Segoe MDL2 Assets", 10.25F); this.btnRefresh.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.btnRefresh.Location = new System.Drawing.Point(738, 14); this.btnRefresh.Name = "btnRefresh"; this.btnRefresh.Size = new System.Drawing.Size(30, 27); this.btnRefresh.TabIndex = 332; this.btnRefresh.TabStop = false; this.btnRefresh.Text = "..."; this.toolTip.SetToolTip(this.btnRefresh, "Refresh"); this.btnRefresh.UseVisualStyleBackColor = false; this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click); // // btnBack // this.btnBack.BackColor = System.Drawing.Color.Transparent; this.btnBack.Cursor = System.Windows.Forms.Cursors.Hand; this.btnBack.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(235)))), ((int)(((byte)(235))))); this.btnBack.FlatAppearance.BorderSize = 0; this.btnBack.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.btnBack.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnBack.Font = new System.Drawing.Font("Segoe MDL2 Assets", 11.25F); this.btnBack.Location = new System.Drawing.Point(17, 14); this.btnBack.Name = "btnBack"; this.btnBack.Size = new System.Drawing.Size(30, 27); this.btnBack.TabIndex = 511; this.btnBack.Text = "..."; this.btnBack.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; this.btnBack.UseVisualStyleBackColor = false; // // toolTip // this.toolTip.IsBalloon = true; // // btnActivity // this.btnActivity.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnActivity.AutoSize = true; this.btnActivity.BackColor = System.Drawing.Color.Transparent; this.btnActivity.Cursor = System.Windows.Forms.Cursors.Hand; this.btnActivity.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(235)))), ((int)(((byte)(235))))); this.btnActivity.FlatAppearance.BorderSize = 0; this.btnActivity.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White; this.btnActivity.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White; this.btnActivity.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnActivity.Font = new System.Drawing.Font("Segoe MDL2 Assets", 11.25F); this.btnActivity.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.btnActivity.Location = new System.Drawing.Point(784, 14); this.btnActivity.Name = "btnActivity"; this.btnActivity.Size = new System.Drawing.Size(30, 27); this.btnActivity.TabIndex = 522; this.btnActivity.TabStop = false; this.btnActivity.Text = "..."; this.toolTip.SetToolTip(this.btnActivity, "Activity"); this.btnActivity.UseVisualStyleBackColor = false; this.btnActivity.Click += new System.EventHandler(this.btnActivity_Click); // // panelForm // this.panelForm.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelForm.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(244)))), ((int)(((byte)(240))))); this.panelForm.Controls.Add(this.lblHeader); this.panelForm.Controls.Add(this.panelHost); this.panelForm.Controls.Add(this.btnActivity); this.panelForm.Controls.Add(this.textSearch); this.panelForm.Controls.Add(this.btnBack); this.panelForm.Controls.Add(this.btnRefresh); this.panelForm.Location = new System.Drawing.Point(84, 5); this.panelForm.Name = "panelForm"; this.panelForm.Size = new System.Drawing.Size(841, 550); this.panelForm.TabIndex = 513; // // textSearch // this.textSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.textSearch.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.textSearch.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.textSearch.Location = new System.Drawing.Point(267, 46); this.textSearch.Name = "textSearch"; this.textSearch.Size = new System.Drawing.Size(280, 29); this.textSearch.TabIndex = 517; this.textSearch.Text = "Search"; this.textSearch.Click += new System.EventHandler(this.textSearch_Click); this.textSearch.TextChanged += new System.EventHandler(this.textSearch_TextChanged); // // btnSettings // this.btnSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnSettings.BackColor = System.Drawing.Color.Transparent; this.btnSettings.Cursor = System.Windows.Forms.Cursors.Hand; this.btnSettings.FlatAppearance.BorderSize = 0; this.btnSettings.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White; this.btnSettings.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White; this.btnSettings.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnSettings.Font = new System.Drawing.Font("Segoe UI", 9F); this.btnSettings.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnSettings.IconGlyph = ""; this.btnSettings.LabelText = "Settings"; this.btnSettings.Location = new System.Drawing.Point(8, 492); this.btnSettings.Name = "btnSettings"; this.btnSettings.Size = new System.Drawing.Size(70, 61); this.btnSettings.TabIndex = 529; this.btnSettings.UseVisualStyleBackColor = false; // // btnExtensions // this.btnExtensions.BackColor = System.Drawing.Color.Transparent; this.btnExtensions.Cursor = System.Windows.Forms.Cursors.Hand; this.btnExtensions.FlatAppearance.BorderSize = 0; this.btnExtensions.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White; this.btnExtensions.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White; this.btnExtensions.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnExtensions.Font = new System.Drawing.Font("Segoe UI", 9F); this.btnExtensions.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnExtensions.IconGlyph = ""; this.btnExtensions.LabelText = "Extensions"; this.btnExtensions.Location = new System.Drawing.Point(8, 146); this.btnExtensions.Name = "btnExtensions"; this.btnExtensions.Size = new System.Drawing.Size(70, 61); this.btnExtensions.TabIndex = 528; this.btnExtensions.UseVisualStyleBackColor = false; // // btnOobe // this.btnOobe.BackColor = System.Drawing.Color.Transparent; this.btnOobe.Cursor = System.Windows.Forms.Cursors.Hand; this.btnOobe.FlatAppearance.BorderSize = 0; this.btnOobe.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White; this.btnOobe.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White; this.btnOobe.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnOobe.Font = new System.Drawing.Font("Segoe UI", 9F); this.btnOobe.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnOobe.IconGlyph = ""; this.btnOobe.LabelText = "OOBE"; this.btnOobe.Location = new System.Drawing.Point(8, 79); this.btnOobe.Name = "btnOobe"; this.btnOobe.Size = new System.Drawing.Size(70, 61); this.btnOobe.TabIndex = 527; this.btnOobe.UseVisualStyleBackColor = false; // // btnHome // this.btnHome.BackColor = System.Drawing.Color.Transparent; this.btnHome.Cursor = System.Windows.Forms.Cursors.Hand; this.btnHome.FlatAppearance.BorderSize = 0; this.btnHome.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White; this.btnHome.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White; this.btnHome.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnHome.Font = new System.Drawing.Font("Segoe UI", 9F); this.btnHome.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnHome.IconGlyph = ""; this.btnHome.LabelText = "Home"; this.btnHome.Location = new System.Drawing.Point(8, 12); this.btnHome.Name = "btnHome"; this.btnHome.Size = new System.Drawing.Size(70, 61); this.btnHome.TabIndex = 526; this.btnHome.UseVisualStyleBackColor = false; // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(235)))), ((int)(((byte)(235))))); this.ClientSize = new System.Drawing.Size(934, 565); this.Controls.Add(this.btnSettings); this.Controls.Add(this.btnExtensions); this.Controls.Add(this.btnOobe); this.Controls.Add(this.btnHome); this.Controls.Add(this.panelForm); this.Name = "MainForm"; this.ShowIcon = false; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.Load += new System.EventHandler(this.MainForm_Load); this.Shown += new System.EventHandler(this.MainForm_Shown); this.panelForm.ResumeLayout(false); this.panelForm.PerformLayout(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button btnRefresh; private System.Windows.Forms.Panel panelHost; private System.Windows.Forms.ToolTip toolTip; private System.Windows.Forms.Button btnBack; private System.Windows.Forms.Panel panelForm; private System.Windows.Forms.Label lblHeader; private System.Windows.Forms.TextBox textSearch; private System.Windows.Forms.Button btnActivity; private NavButton btnHome; private NavButton btnOobe; private NavButton btnExtensions; private NavButton btnSettings; } } ================================================ FILE: Flyoobe/MainForm.cs ================================================ using Flyoobe.Views; using System; using System.Windows.Forms; namespace Flyoobe { public partial class MainForm : Form { private ViewNavigator _navigator; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // Set default form size UIHelper.SetDefaultFormSize(this); // Create navigator _navigator = new ViewNavigator( panelHost, name => { this.Text = "FlyOOBE"; lblHeader.Text = name; }, btnBack ); // Register all views RegisterViews(); // Show initial view _navigator.ShowView("Home"); // Set default active nav ActivateNav(btnHome); // Wire navigation buttons WireNavButtons(); } private void MainForm_Shown(object sender, EventArgs e) { // Rounded panel UIHelper.EnableRoundedPanel(panelForm, 20, 1); UIHelper.EnableRoundedPanel(panelHost, 20, 0); // Set background BackgroundHelper.LoadOrAskBackground( panelForm, lblHeader, btnBack, btnRefresh, btnActivity ); // Initialize Logger view InitializeLogger(); } private void RegisterViews() { // Register main pages _navigator.RegisterView("Home", () => new HomeControlView(_navigator)); _navigator.RegisterView("Settings", () => new AppSettingsControlView(panelForm, lblHeader, btnBack, btnRefresh, btnActivity)); _navigator.RegisterView("Extensions", () => new ToolHub.ToolHubControlView()); // Register OOBE pages directly, central navigator handles routing _navigator.RegisterView("Device", () => new DeviceControlView()); _navigator.RegisterView("Personalization", () => new PersonalizationControlView()); _navigator.RegisterView("Browser", () => new DefaultsControlView()); _navigator.RegisterView("AI", () => new AiControlView()); _navigator.RegisterView("Network", () => new NetworkControlView()); _navigator.RegisterView("Account", () => new AccountControlView()); _navigator.RegisterView("Apps", () => new AppsControlView()); _navigator.RegisterView("Experience", () => new ExperienceControlView()); _navigator.RegisterView("Installer", () => new InstallerControlView()); _navigator.RegisterView("Updates", () => new UpdatesControlView()); _navigator.RegisterView("Advanced", () => new AdvancedControlView()); } private void WireNavButtons() { // Navigation icons btnHome.IconGlyph = "\uEA8A"; btnOobe.IconGlyph = "\uE71D"; btnExtensions.IconGlyph = "\uEA86"; btnSettings.IconGlyph = "\uE713"; // Header command bar icons btnActivity.Text = "\uEA8F"; btnBack.Text = "\uE72B"; btnRefresh.Text = "\uE72C"; // Click bindings btnHome.Click += (s, e) => { ActivateNav(btnHome); _navigator.ShowView("Home"); }; btnOobe.Click += (s, e) => { ActivateNav(btnOobe); _navigator.ShowView("Device"); // First OOBE page }; btnExtensions.Click += (s, e) => { ActivateNav(btnExtensions); _navigator.ShowView("Extensions"); }; btnSettings.Click += (s, e) => { ActivateNav(btnSettings); _navigator.ShowView("Settings"); }; } private void InitializeLogger() { // Logger View _navigator.RegisterView("Activity", () => { var view = new LoggerControlView(); Logger.SetLoggerControl(view); // connect logger output to this view return view; }); Logger.AttachNavigator(_navigator); // startup logs Logger.Log($"FlyOOBE {Program.GetAppVersion()} is airborne!", LogLevel.Info); Logger.Log("OOBEE warming up the engines... 🚀", LogLevel.Info); Logger.Log("Code. Fly. Repeat. Source & updates:", LogLevel.Info); Logger.Log("GitHub → https://github.com/builtbybel/Flyoobe", LogLevel.Info); Logger.Log("X (Twitter) → https://x.com/builtbybel", LogLevel.Info); Logger.Log("FlyOOBE – built for speed, built by bel.", LogLevel.Info); } private void btnRefresh_Click(object sender, EventArgs e) { textSearch.Text = ""; // Clear global search box // Inform the active view about the reset (fixes search reset issue!) if (_navigator.CurrentView is IHasSearch searchable) searchable.OnGlobalSearchChanged(string.Empty); // If the current view implements IView, trigger its RefreshView method if (_navigator.CurrentView is IView view) { view.RefreshView(); } } private void btnActivity_Click(object sender, EventArgs e) { Logger.ShowLogView(); } /// /// Sets the visual "active" state for the navigation bar. /// Only one NavButton can be active at any time. /// /// The button that should be highlighted as active. private void ActivateNav(NavButton active) { // Reset all navigation buttons to inactive state btnHome.SetActive(false); btnOobe.SetActive(false); btnExtensions.SetActive(false); btnSettings.SetActive(false); // Activate the selected button active.SetActive(true); } // Global search private void textSearch_TextChanged(object sender, EventArgs e) { var view = _navigator.CurrentView as IHasSearch; if (view != null) view.OnGlobalSearchChanged(textSearch.Text); } private void textSearch_Click(object sender, EventArgs e) { textSearch.Clear(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (!DonationHelper.HasDonated()) { DonationHelper.ShowDonationPrompt(); } } } } ================================================ FILE: Flyoobe/MainForm.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 29, 13 ================================================ FILE: Flyoobe/NavButton.cs ================================================ using System.Drawing; using System.Windows.Forms; public class NavButton : Button { public string IconGlyph { get; set; } = ""; public string LabelText { get; set; } = ""; private const int IconTextSpacing = 5; // distance between icon and text // Marks whether the button is currently active public bool IsActive { get; private set; } = false; // Active and inactive colors private static readonly Color ActiveColor = Color.FromArgb(91, 95, 194); private static readonly Color InactiveColor = Color.DimGray; public NavButton() { FlatStyle = FlatStyle.Flat; FlatAppearance.BorderSize = 0; Cursor = Cursors.Hand; TextAlign = ContentAlignment.MiddleCenter; Font = new Font("Segoe UI", 9f, FontStyle.Regular); ForeColor = InactiveColor; // default BackColor = Color.Transparent; } public void SetActive(bool active) { IsActive = active; ForeColor = active ? ActiveColor : InactiveColor; Invalidate(); // repaint } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); var g = pe.Graphics; var iconColor = IsActive ? ActiveColor : InactiveColor; var textColor = iconColor; // Fonts for icon and label using (var iconFont = new Font("Segoe MDL2 Assets", 15.25f)) using (var textFont = new Font("Segoe UI", 7.5f)) using (var brush = new SolidBrush(iconColor)) { // Measure both elements var iconSize = g.MeasureString(IconGlyph, iconFont); var textSize = g.MeasureString(LabelText, textFont); // If active > ONLY icon, no text if (IsActive) { g.DrawString( IconGlyph, iconFont, new SolidBrush(iconColor), new PointF( (Width - iconSize.Width) / 2, (Height - iconSize.Height) / 2 ) ); return; // let us Skip drawing text } // --- inactive state > icon + text --- // float totalHeight = iconSize.Height + IconTextSpacing + textSize.Height; float startY = (Height - totalHeight) / 2; // Draw icon g.DrawString( IconGlyph, iconFont, brush, new PointF( (Width - iconSize.Width) / 2, startY ) ); // Draw text g.DrawString( LabelText, textFont, brush, new PointF( (Width - textSize.Width) / 2, startY + iconSize.Height + IconTextSpacing ) ); } } } ================================================ FILE: Flyoobe/OobeControl.Designer.cs ================================================ namespace Flyoobe { partial class OobeControl { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.panelNav = new System.Windows.Forms.Panel(); this.panelContent = new System.Windows.Forms.Panel(); this.SuspendLayout(); // // panelNav // this.panelNav.Dock = System.Windows.Forms.DockStyle.Left; this.panelNav.Location = new System.Drawing.Point(0, 0); this.panelNav.Name = "panelNav"; this.panelNav.Size = new System.Drawing.Size(149, 679); this.panelNav.TabIndex = 0; // // panelContent // this.panelContent.Dock = System.Windows.Forms.DockStyle.Fill; this.panelContent.Location = new System.Drawing.Point(149, 0); this.panelContent.Name = "panelContent"; this.panelContent.Size = new System.Drawing.Size(408, 679); this.panelContent.TabIndex = 1; // // OobeControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.panelContent); this.Controls.Add(this.panelNav); this.Name = "OobeControl"; this.Size = new System.Drawing.Size(557, 679); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Panel panelNav; private System.Windows.Forms.Panel panelContent; } } ================================================ FILE: Flyoobe/OobeControl.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { public partial class OobeControl : UserControl { public Panel ContentPanel => panelContent; public Panel SidebarPanel => panelNav; public OobeControl() { InitializeComponent(); } } } ================================================ FILE: Flyoobe/OobeControl.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Program.cs ================================================ using System; using System.Reflection; using System.Windows.Forms; namespace Flyoobe { internal static class Program { /// /// The main entry point for the application. /// [STAThread] private static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } /// /// Retrieves the version of the app /// /// The application version in the format "major.minor.build" public static string GetAppVersion() { // Get the version of the current executing assembly Version version = Assembly.GetExecutingAssembly().GetName().Version; // Return the version in the format "major.minor.build" return $"{version.Major}.{version.Minor}.{version.Build}"; } } } ================================================ FILE: Flyoobe/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.InteropServices; // Allgemeine Informationen über eine Assembly werden über die folgenden // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, // die einer Assembly zugeordnet sind. [assembly: AssemblyTitle("FlyOOBE")] [assembly: AssemblyDescription("FlyOOBE")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("A Belim app creation")] [assembly: AssemblyProduct("FlyOOBE")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("Builtbybel")] [assembly: AssemblyCulture("")] // Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von // COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. [assembly: ComVisible(false)] // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird [assembly: Guid("50ca0d4d-45ad-4e03-bfc5-64fff4cda36c")] // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: // // Hauptversion // Nebenversion // Buildnummer // Revision // [assembly: AssemblyVersion("2.2.812")] [assembly: AssemblyFileVersion("2.2.812")] ================================================ FILE: Flyoobe/Properties/Resources.Designer.cs ================================================ //------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. // Laufzeitversion:4.0.30319.42000 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. // //------------------------------------------------------------------------------ namespace Flyoobe.Properties { using System; /// /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. /// // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Flyoobe.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } } } ================================================ FILE: Flyoobe/Properties/Resources.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Properties/Settings.Designer.cs ================================================ //------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. // Laufzeitversion:4.0.30319.42000 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. // //------------------------------------------------------------------------------ namespace Flyoobe.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); public static Settings Default { get { return defaultInstance; } } } } ================================================ FILE: Flyoobe/Properties/Settings.settings ================================================  ================================================ FILE: Flyoobe/ToolHubView/ToolHubCategory.cs ================================================ namespace Flyoobe.ToolHub { /// /// Defines logical groups for setup tools. /// Used to display filtered tools in the ToolHubControlView. /// public enum ToolHubCategory { All, Tool, Pre, Mid, Post } } ================================================ FILE: Flyoobe/ToolHubView/ToolHubControlView.Designer.cs ================================================ namespace Flyoobe.ToolHub { partial class ToolHubControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.flowLayoutPanelTools = new System.Windows.Forms.FlowLayoutPanel(); this.contextDropDown = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuInstallUrl = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuInstallLocal = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuWriteExtension = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuExtensionDirectory = new System.Windows.Forms.ToolStripMenuItem(); this.btnAdd = new System.Windows.Forms.Button(); this.lblStatus = new System.Windows.Forms.Label(); this.comboFilter = new System.Windows.Forms.ComboBox(); this.contextDropDown.SuspendLayout(); this.SuspendLayout(); // // flowLayoutPanelTools // this.flowLayoutPanelTools.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.flowLayoutPanelTools.AutoScroll = true; this.flowLayoutPanelTools.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.flowLayoutPanelTools.Location = new System.Drawing.Point(28, 94); this.flowLayoutPanelTools.Name = "flowLayoutPanelTools"; this.flowLayoutPanelTools.Size = new System.Drawing.Size(804, 343); this.flowLayoutPanelTools.TabIndex = 0; // // contextDropDown // this.contextDropDown.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.contextDropDown.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuInstallUrl, this.toolStripMenuInstallLocal, this.toolStripMenuWriteExtension, this.toolStripMenuExtensionDirectory}); this.contextDropDown.Name = "contextMenuStripAdd"; this.contextDropDown.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.contextDropDown.Size = new System.Drawing.Size(172, 112); // // toolStripMenuInstallUrl // this.toolStripMenuInstallUrl.Font = new System.Drawing.Font("Segoe UI Variable Display", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.toolStripMenuInstallUrl.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0); this.toolStripMenuInstallUrl.Name = "toolStripMenuInstallUrl"; this.toolStripMenuInstallUrl.Size = new System.Drawing.Size(171, 22); this.toolStripMenuInstallUrl.Text = "Install from Url..."; this.toolStripMenuInstallUrl.Click += new System.EventHandler(this.toolStripMenuInstallUrl_Click); // // toolStripMenuInstallLocal // this.toolStripMenuInstallLocal.Font = new System.Drawing.Font("Segoe UI Variable Display", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.toolStripMenuInstallLocal.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0); this.toolStripMenuInstallLocal.Name = "toolStripMenuInstallLocal"; this.toolStripMenuInstallLocal.Size = new System.Drawing.Size(171, 22); this.toolStripMenuInstallLocal.Text = "Install from file..."; this.toolStripMenuInstallLocal.Click += new System.EventHandler(this.toolStripMenuInstallLocal_Click); // // toolStripMenuWriteExtension // this.toolStripMenuWriteExtension.Font = new System.Drawing.Font("Segoe UI Variable Display", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.toolStripMenuWriteExtension.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0); this.toolStripMenuWriteExtension.Name = "toolStripMenuWriteExtension"; this.toolStripMenuWriteExtension.Size = new System.Drawing.Size(171, 22); this.toolStripMenuWriteExtension.Text = "Write an extension"; this.toolStripMenuWriteExtension.Click += new System.EventHandler(this.toolStripMenuWriteExtension_Click); // // toolStripMenuExtensionDirectory // this.toolStripMenuExtensionDirectory.Font = new System.Drawing.Font("Segoe UI Variable Display", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.toolStripMenuExtensionDirectory.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0); this.toolStripMenuExtensionDirectory.Name = "toolStripMenuExtensionDirectory"; this.toolStripMenuExtensionDirectory.Size = new System.Drawing.Size(171, 22); this.toolStripMenuExtensionDirectory.Text = "Extension folder..."; this.toolStripMenuExtensionDirectory.Click += new System.EventHandler(this.toolStripMenuExtensionDirectory_Click); // // btnAdd // this.btnAdd.Anchor = System.Windows.Forms.AnchorStyles.Top; this.btnAdd.AutoEllipsis = true; this.btnAdd.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnAdd.Cursor = System.Windows.Forms.Cursors.Hand; this.btnAdd.FlatAppearance.BorderColor = System.Drawing.Color.WhiteSmoke; this.btnAdd.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(83)))), ((int)(((byte)(167))))); this.btnAdd.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(83)))), ((int)(((byte)(167))))); this.btnAdd.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnAdd.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 9.25F, System.Drawing.FontStyle.Bold); this.btnAdd.ForeColor = System.Drawing.Color.White; this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnAdd.Location = new System.Drawing.Point(342, 11); this.btnAdd.Name = "btnAdd"; this.btnAdd.Size = new System.Drawing.Size(156, 32); this.btnAdd.TabIndex = 350; this.btnAdd.Text = "Browse for Extensions"; this.btnAdd.UseVisualStyleBackColor = false; this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); // // lblStatus // this.lblStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblStatus.AutoEllipsis = true; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblStatus.Location = new System.Drawing.Point(3, 57); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(829, 23); this.lblStatus.TabIndex = 0; this.lblStatus.Text = "Loading..."; this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.lblStatus.UseCompatibleTextRendering = true; this.lblStatus.Visible = false; // // comboFilter // this.comboFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.comboFilter.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.comboFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboFilter.FlatStyle = System.Windows.Forms.FlatStyle.System; this.comboFilter.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10F); this.comboFilter.ForeColor = System.Drawing.Color.Black; this.comboFilter.FormattingEnabled = true; this.comboFilter.Location = new System.Drawing.Point(730, 63); this.comboFilter.Name = "comboFilter"; this.comboFilter.Size = new System.Drawing.Size(71, 25); this.comboFilter.TabIndex = 351; this.comboFilter.TabStop = false; this.comboFilter.SelectedIndexChanged += new System.EventHandler(this.comboFilter_SelectedIndexChanged); // // ToolHubControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.Controls.Add(this.comboFilter); this.Controls.Add(this.lblStatus); this.Controls.Add(this.btnAdd); this.Controls.Add(this.flowLayoutPanelTools); this.Name = "ToolHubControlView"; this.Size = new System.Drawing.Size(835, 457); this.contextDropDown.ResumeLayout(false); this.ResumeLayout(false); } #endregion private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelTools; private System.Windows.Forms.ContextMenuStrip contextDropDown; private System.Windows.Forms.ToolStripMenuItem toolStripMenuInstallUrl; private System.Windows.Forms.ToolStripMenuItem toolStripMenuInstallLocal; private System.Windows.Forms.ToolStripMenuItem toolStripMenuWriteExtension; private System.Windows.Forms.ToolStripMenuItem toolStripMenuExtensionDirectory; private System.Windows.Forms.Button btnAdd; private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.ComboBox comboFilter; } } ================================================ FILE: Flyoobe/ToolHubView/ToolHubControlView.cs ================================================ using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe.ToolHub { public partial class ToolHubControlView : UserControl, IView, IHasSearch { private ToolHubCategory _category; // The category this view represents private readonly List _allTools = new List(); // Caches UI controls for each tool so they are not recreated every time. private readonly Dictionary _controlCache = new Dictionary(); // Pending tool selection (if any) to apply after loading private string _pendingSelectTool = null; // Overloaded constructor with category filter public ToolHubControlView(ToolHubCategory category = ToolHubCategory.All) { InitializeComponent(); _category = category; comboFilter.Items.AddRange(new object[] { "All", "Tool", "Pre", "Mid", "Post" }); //comboFilter.SelectedItem = _category.ToString(); // Prevent the SelectedIndexChanged event from firing during initial setup, // because changing SelectedIndex will otherwise trigger LoadTools() too early. comboFilter.SelectedIndexChanged -= comboFilter_SelectedIndexChanged; comboFilter.SelectedIndex = 0; // Set default filter UI state without applying filtering logic yet comboFilter.SelectedIndexChanged += comboFilter_SelectedIndexChanged; LoadTools(); } private async void LoadTools() { lblStatus.Visible = true; // Prevent flicker during bulk UI update flowLayoutPanelTools.SuspendLayout(); flowLayoutPanelTools.Controls.Clear(); _controlCache.Clear(); _allTools.Clear(); // Define the scripts directory relative to the executable path string scriptDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "scripts"); // If the directory does not exist, create it if (!Directory.Exists(scriptDirectory)) { Directory.CreateDirectory(scriptDirectory); flowLayoutPanelTools.ResumeLayout(); return; } // Get all .ps1 files in the folder (async to avoid UI freeze) string[] scriptFiles = await Task.Run(() => Directory.GetFiles(scriptDirectory, "*.ps1")); // Parse metadata and construct tool definitions in background var loadedTools = await Task.Run(() => { var list = new List(); // Loop through each script and create a tool item foreach (var scriptPath in scriptFiles) { string fileName = Path.GetFileNameWithoutExtension(scriptPath); // Use file name as title string icon = PickIconForScript(fileName); // Choose an icon based on the name // Read metadata (description, options, category, etc.) var meta = ReadMetadataFromScript(scriptPath); // Skip tools not matching the current category if (_category != ToolHubCategory.All && meta.category != _category) continue; // Create tool definition var tool = new ToolHubDefinition(fileName, meta.description, icon, scriptPath); tool.Options.AddRange(meta.options); tool.UseConsole = meta.useConsole; tool.UseLog = meta.useLog; tool.SupportsInput = meta.inputEnabled; tool.InputPlaceholder = meta.inputPh; tool.PoweredByText = meta.poweredByText; tool.PoweredByUrl = meta.poweredByUrl; list.Add(tool); // Save for search/filter } return list; }); // Create UI controls now, but only once (no recreation during filtering) foreach (var tool in loadedTools) { var control = new ToolHubItemControl(tool); _controlCache[tool] = control; // Cache it so filtering is instant flowLayoutPanelTools.Controls.Add(control); _allTools.Add(tool); } lblStatus.Visible = false; flowLayoutPanelTools.ResumeLayout(); // After everything is loaded, apply the pending selection (if any) if (!string.IsNullOrEmpty(_pendingSelectTool)) { SelectTool(_pendingSelectTool); _pendingSelectTool = null; } } /// /// Reads metadata from a script header, such as description, category, and options. /// Example in .ps1: /// # Description: Cleans pre-installed apps /// # Category: Post /// # Options: Light;Full /// # Host: log /// // Parses script header metadata (first ~15 lines) and returns all fields. private (string description, List options, ToolHubCategory category, bool useConsole, bool useLog, bool inputEnabled, string inputPh, string poweredByText, string poweredByUrl) ReadMetadataFromScript(string scriptPath) { string description = "No description available."; var options = new List(); ToolHubCategory category = ToolHubCategory.All; bool useConsole = false; bool useLog = false; bool inputEnabled = false; string inputPh = string.Empty; string poweredByText = string.Empty; string poweredByUrl = string.Empty; try { // Only scan the first lines for metadata. // Extensions put their headers (# Description, # Host, # Options) at the top, // so we dont waste time parsing a huge script body. var lines = File.ReadLines(scriptPath).Take(15); foreach (var line in lines) { if (string.IsNullOrWhiteSpace(line)) continue; if (line.StartsWith("# Description:", StringComparison.OrdinalIgnoreCase)) { description = line.Substring(14).Trim(); } else if (line.StartsWith("# Category:", StringComparison.OrdinalIgnoreCase)) { string raw = line.Substring(11).Trim().ToLowerInvariant(); if (raw == "pre") category = ToolHubCategory.Pre; else if (raw == "mid") category = ToolHubCategory.Mid; else if (raw == "tool") category = ToolHubCategory.Tool; else if (raw == "post") category = ToolHubCategory.Post; else category = ToolHubCategory.All; } else if (line.StartsWith("# Options:", StringComparison.OrdinalIgnoreCase)) { // Parse dropdown options options = line.Substring(10) .Split(';') .Select(x => x.Trim()) .Where(x => !string.IsNullOrEmpty(x)) // ignore empty entries .ToList(); } else if (line.StartsWith("# Host:", StringComparison.OrdinalIgnoreCase)) { // Parse host type var raw = line.Substring(7).Trim().ToLowerInvariant(); if (raw == "console") // standard console window useConsole = true; else if (raw == "log") // custom log viewer useLog = true; // "embedded"/"silent" == both false } else if (line.StartsWith("# Input:", StringComparison.OrdinalIgnoreCase)) { var raw = line.Substring(8).Trim().ToLowerInvariant(); inputEnabled = (raw == "true" || raw == "yes" || raw == "1"); } else if (line.StartsWith("# InputPlaceholder:", StringComparison.OrdinalIgnoreCase)) { inputPh = line.Substring(19).Trim(); } // PoweredBy metadata (optional) else if (line.StartsWith("# PoweredBy:", StringComparison.OrdinalIgnoreCase)) poweredByText = line.Substring(12).Trim(); // 11 chars + 1 for : else if (line.StartsWith("# PoweredUrl:", StringComparison.OrdinalIgnoreCase)) poweredByUrl = line.Substring(13).Trim(); // 12 chars + 1 for : // Use the first regular comment as description (if none yet) else if (line.StartsWith("#")) { if (description == "No description available.") description = line.TrimStart('#').Trim(); } } } catch { // Ignore errors and keep defaults } return (description, options, category, useConsole, useLog, inputEnabled, inputPh, poweredByText, poweredByUrl); } private string PickIconForScript(string name) { name = name.ToLower(); // Basic keyword-based icon picking using Segoe MDL2 Assets if (name.Contains("debloat")) return "\uE74D"; // Trash icon (cleanup) if (name.Contains("network")) return "\uE701"; // Network icon (network tools) if (name.Contains("explorer")) return "\uE8B7"; // File Explorer icon (file management) if (name.Contains("update")) return "\uE895"; // Update icon (system updates) if (name.Contains("context")) return "\uE8A5"; // Menu icon (context menu tweaks) // Additional general categories if (name.Contains("backup")) return "\uE8C7"; // Save icon (backup tools) if (name.Contains("security")) return "\uE72E"; // Shield icon (security tools) if (name.Contains("performance")) return "\uE7B8"; // Speedometer icon (performance) if (name.Contains("privacy")) return "\uF552"; // Privacy icon (privacy settings) if (name.Contains("app")) return "\uED35"; // App icon (application management) if (name.Contains("setup")) return "\uE8FB"; // Install icon (installers) return "\uE7C5"; // Wrench icon (default for uncategorized tools) } private void DisplayFilteredTools(string filter) { flowLayoutPanelTools.SuspendLayout(); flowLayoutPanelTools.Controls.Clear(); string f = filter?.ToLowerInvariant() ?? ""; foreach (var kv in _controlCache) { var tool = kv.Key; var control = kv.Value; bool show = string.IsNullOrWhiteSpace(f) || tool.Title.ToLower().Contains(f) || tool.Description.ToLower().Contains(f); if (show) flowLayoutPanelTools.Controls.Add(control); } flowLayoutPanelTools.ResumeLayout(); } /// /// Selects a tool in the ToolHub by its display title. /// If the tools are not loaded yet (asynchronous loading), the selection request is stored /// and applied automatically once loading finishes. /// /// The display title of the tool to select. public void SelectTool(string toolName) { // If controls havent been created yet (async load still ongoing), // defer selection until after loading completes. if (_controlCache.Count == 0) { _pendingSelectTool = toolName; return; } // Show only the tool matching the requested title and hide all others foreach (var kv in _controlCache) { var tool = kv.Key; var control = kv.Value; bool match = string.Equals(tool.Title, toolName, StringComparison.OrdinalIgnoreCase); control.Visible = match; if (match) { // Highlight selected tool control.BackColor = Color.FromArgb(230, 240, 255); } else { // Reset background of non-selected tools control.BackColor = SystemColors.Control; } } } public void RefreshView() { flowLayoutPanelTools.Controls.Clear(); LoadTools(); } /// /// Applies global search input to the tool list. /// public void OnGlobalSearchChanged(string text) { DisplayFilteredTools(text); } private void btnAdd_Click(object sender, EventArgs e) { contextDropDown.Show(btnAdd, new Point(0, btnAdd.Height)); } private async void toolStripMenuInstallUrl_Click(object sender, EventArgs e) { await ToolHub.ExtensionsHelper.InstallFromUrlAsync(this); } private void toolStripMenuInstallLocal_Click(object sender, EventArgs e) { ToolHub.ExtensionsHelper.ImportLocalFile(this); } private void toolStripMenuWriteExtension_Click(object sender, EventArgs e) { ToolHub.ExtensionsHelper.OpenExtensionGuide(); } private void toolStripMenuExtensionDirectory_Click(object sender, EventArgs e) { ToolHub.ExtensionsHelper.OpenScriptsFolder(this); } private void comboFilter_SelectedIndexChanged(object sender, EventArgs e) { switch (comboFilter.SelectedItem.ToString()) { case "Tool": _category = ToolHubCategory.Tool; break; case "Pre": _category = ToolHubCategory.Pre; break; case "Mid": _category = ToolHubCategory.Mid; break; case "Post": _category = ToolHubCategory.Post; break; default: _category = ToolHubCategory.All; break; } LoadTools(); // re-render based on new category } } } ================================================ FILE: Flyoobe/ToolHubView/ToolHubControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 6, 20 ================================================ FILE: Flyoobe/ToolHubView/ToolHubDefinition.cs ================================================ using System.Collections.Generic; namespace Flyoobe.ToolHub { public class ToolHubDefinition { public string Title { get; } public string Description { get; } public string Icon { get; } public string ScriptPath { get; } public List Options { get; } = new List(); // Dropdown options public bool UseConsole { get; set; } = false; // Console host public bool UseLog { get; set; } // optional log viewer // Optional free-text input support for a tool (e.g., ViVe ID list, custom args) public bool SupportsInput { get; set; } public string InputPlaceholder { get; set; } // Optional "Powered by" attribution public string PoweredByText { get; set; } // e.g. "Powered by Chris Titus Tech" public string PoweredByUrl { get; set; } public ToolHubDefinition(string title, string description, string icon, string scriptPath) { Title = title; Description = description; Icon = icon; ScriptPath = scriptPath; // Defaults for optional features SupportsInput = false; InputPlaceholder = string.Empty; // Defaults for "Powered by" PoweredByText = string.Empty; PoweredByUrl = string.Empty; } } } ================================================ FILE: Flyoobe/ToolHubView/ToolHubHelper.cs ================================================ using System; using System.Diagnostics; using System.IO; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe.ToolHub { /// /// Provides helper methods for installing and managing extension scripts (.ps1). /// public static class ExtensionsHelper { /// /// Switch the current view to the Extensions page (ToolHubControlView). /// public static void SwitchToExtensionsView(ViewNavigator navigator) { if (navigator == null) return; // safeguard navigator.ShowView("Extensions"); } /// /// Refresh the ToolHubControlView /// /// public static void SwitchAndRefreshToExtensionsView(ViewNavigator navigator) { if (navigator == null) return; navigator.ShowView("Extensions"); // Only refresh if the current view is ToolHubControlView if (navigator.CurrentView is ToolHubControlView extView) { extView.RefreshView(); } } /// /// Install an extension from a direct .ps1 URL. /// public static async Task InstallFromUrlAsync(IWin32Window owner, ViewNavigator navigator = null) { using (var dlg = new InputDialog("Install from URL", "Paste a direct .ps1 URL:")) { if (dlg.ShowDialog(owner) != DialogResult.OK) return; var url = dlg.InputText?.Trim(); if (string.IsNullOrWhiteSpace(url) || !url.EndsWith(".ps1", StringComparison.OrdinalIgnoreCase)) { MessageBox.Show(owner, "Please provide a direct link to a .ps1 file.", "Invalid URL", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { string content; using (var hc = new HttpClient()) content = await hc.GetStringAsync(url); if (!content.TrimStart().StartsWith("#")) { if (MessageBox.Show(owner, "This file has no header comments. Install anyway?", "No metadata", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) return; } var scriptsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "scripts"); Directory.CreateDirectory(scriptsDir); var name = Path.GetFileName(new Uri(url).LocalPath); var dest = Path.Combine(scriptsDir, name); if (File.Exists(dest)) { if (MessageBox.Show(owner, $"{name} already exists. Overwrite?", "File exists", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) return; } File.WriteAllText(dest, content, Encoding.UTF8); MessageBox.Show(owner, $"Installed: {name}", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); // Switch and refresh SwitchAndRefreshToExtensionsView(navigator); } catch (Exception ex) { MessageBox.Show(owner, "Install failed: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } /// /// Import a local .ps1 file into the extensions folder. /// public static void ImportLocalFile(IWin32Window owner, ViewNavigator navigator = null) { using (var ofd = new OpenFileDialog()) { ofd.Filter = "PowerShell scripts (*.ps1)|*.ps1"; ofd.Title = "Select an extension script"; if (ofd.ShowDialog(owner) != DialogResult.OK) return; try { var scriptsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "scripts"); Directory.CreateDirectory(scriptsDir); var dest = Path.Combine(scriptsDir, Path.GetFileName(ofd.FileName)); File.Copy(ofd.FileName, dest, overwrite: true); MessageBox.Show(owner, $"Imported: {Path.GetFileName(dest)}", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); // Switch and refresh SwitchAndRefreshToExtensionsView(navigator); } catch (Exception ex) { MessageBox.Show(owner, "Import failed: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } /// /// Open the extensions scripts folder in Explorer. /// public static void OpenScriptsFolder(IWin32Window owner) { string scriptDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "scripts"); Directory.CreateDirectory(scriptDirectory); try { Process.Start("explorer.exe", scriptDirectory); } catch (Exception ex) { MessageBox.Show(owner, "Could not open folder: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// /// Open the online guide for writing extensions. /// public static void OpenExtensionGuide() { Process.Start(new ProcessStartInfo { FileName = "https://github.com/builtbybel/Flyoobe/blob/main/Flyoobe.Extensions/Write-an-Extension.md", UseShellExecute = true }); } } } ================================================ FILE: Flyoobe/ToolHubView/ToolHubItemControl.Designer.cs ================================================ namespace Flyoobe.ToolHub { partial class ToolHubItemControl { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.labelTitle = new System.Windows.Forms.Label(); this.labelDescription = new System.Windows.Forms.Label(); this.labelIcon = new System.Windows.Forms.Label(); this.btnRun = new System.Windows.Forms.Button(); this.labelStatus = new System.Windows.Forms.Label(); this.progressBar = new System.Windows.Forms.ProgressBar(); this.comboOptions = new System.Windows.Forms.ComboBox(); this.textInput = new System.Windows.Forms.TextBox(); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.linkPoweredBy = new System.Windows.Forms.LinkLabel(); this.btnUninstall = new System.Windows.Forms.Button(); this.SuspendLayout(); // // labelTitle // this.labelTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.labelTitle.AutoEllipsis = true; this.labelTitle.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 11.75F, System.Drawing.FontStyle.Bold); this.labelTitle.ForeColor = System.Drawing.Color.Black; this.labelTitle.Location = new System.Drawing.Point(50, 11); this.labelTitle.Name = "labelTitle"; this.labelTitle.Size = new System.Drawing.Size(237, 22); this.labelTitle.TabIndex = 23; this.labelTitle.Text = "Title"; this.labelTitle.UseCompatibleTextRendering = true; // // labelDescription // this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.labelDescription.AutoEllipsis = true; this.labelDescription.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10F); this.labelDescription.ForeColor = System.Drawing.Color.Black; this.labelDescription.Location = new System.Drawing.Point(17, 92); this.labelDescription.Name = "labelDescription"; this.labelDescription.Size = new System.Drawing.Size(396, 50); this.labelDescription.TabIndex = 24; this.labelDescription.Text = "Description"; this.labelDescription.UseCompatibleTextRendering = true; // // labelIcon // this.labelIcon.AutoEllipsis = true; this.labelIcon.Font = new System.Drawing.Font("Segoe MDL2 Assets", 13F); this.labelIcon.ForeColor = System.Drawing.Color.Black; this.labelIcon.Location = new System.Drawing.Point(17, 14); this.labelIcon.Name = "labelIcon"; this.labelIcon.Size = new System.Drawing.Size(29, 30); this.labelIcon.TabIndex = 25; this.labelIcon.Text = "..."; // // btnRun // this.btnRun.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(125)))), ((int)(((byte)(215))))); this.btnRun.Cursor = System.Windows.Forms.Cursors.Hand; this.btnRun.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnRun.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(92)))), ((int)(((byte)(197))))); this.btnRun.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(92)))), ((int)(((byte)(197))))); this.btnRun.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnRun.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnRun.ForeColor = System.Drawing.Color.White; this.btnRun.Location = new System.Drawing.Point(305, 23); this.btnRun.Name = "btnRun"; this.btnRun.Size = new System.Drawing.Size(97, 30); this.btnRun.TabIndex = 26; this.btnRun.Text = "Run"; this.btnRun.UseCompatibleTextRendering = true; this.btnRun.UseVisualStyleBackColor = false; this.btnRun.Click += new System.EventHandler(this.btnRun_Click); // // labelStatus // this.labelStatus.BackColor = System.Drawing.Color.Transparent; this.labelStatus.Dock = System.Windows.Forms.DockStyle.Bottom; this.labelStatus.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelStatus.Location = new System.Drawing.Point(0, 199); this.labelStatus.Name = "labelStatus"; this.labelStatus.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0); this.labelStatus.Size = new System.Drawing.Size(420, 17); this.labelStatus.TabIndex = 27; this.labelStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // progressBar // this.progressBar.Dock = System.Windows.Forms.DockStyle.Top; this.progressBar.Location = new System.Drawing.Point(0, 0); this.progressBar.Name = "progressBar"; this.progressBar.Size = new System.Drawing.Size(420, 5); this.progressBar.TabIndex = 28; // // comboOptions // this.comboOptions.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(222)))), ((int)(((byte)(218))))); this.comboOptions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboOptions.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.comboOptions.FormattingEnabled = true; this.comboOptions.Location = new System.Drawing.Point(17, 171); this.comboOptions.Name = "comboOptions"; this.comboOptions.Size = new System.Drawing.Size(396, 25); this.comboOptions.TabIndex = 29; // // textInput // this.textInput.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F); this.textInput.Location = new System.Drawing.Point(20, 145); this.textInput.Name = "textInput"; this.textInput.Size = new System.Drawing.Size(393, 22); this.textInput.TabIndex = 30; // // contextMenuStrip1 // this.contextMenuStrip1.Name = "contextMenuStrip1"; this.contextMenuStrip1.Size = new System.Drawing.Size(61, 4); // // linkPoweredBy // this.linkPoweredBy.AutoSize = true; this.linkPoweredBy.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; this.linkPoweredBy.LinkColor = System.Drawing.Color.RoyalBlue; this.linkPoweredBy.Location = new System.Drawing.Point(50, 33); this.linkPoweredBy.Name = "linkPoweredBy"; this.linkPoweredBy.Size = new System.Drawing.Size(55, 13); this.linkPoweredBy.TabIndex = 31; this.linkPoweredBy.TabStop = true; this.linkPoweredBy.Text = "linkLabel1"; this.linkPoweredBy.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkPoweredBy_LinkClicked); // // btnUninstall // this.btnUninstall.BackColor = System.Drawing.Color.LightSalmon; this.btnUninstall.Cursor = System.Windows.Forms.Cursors.Hand; this.btnUninstall.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(253)))), ((int)(((byte)(174)))), ((int)(((byte)(205))))); this.btnUninstall.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); this.btnUninstall.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); this.btnUninstall.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnUninstall.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 9.25F, System.Drawing.FontStyle.Bold); this.btnUninstall.ForeColor = System.Drawing.Color.Black; this.btnUninstall.Location = new System.Drawing.Point(50, 51); this.btnUninstall.Name = "btnUninstall"; this.btnUninstall.Size = new System.Drawing.Size(97, 20); this.btnUninstall.TabIndex = 32; this.btnUninstall.Text = "Uninstall"; this.btnUninstall.UseCompatibleTextRendering = true; this.btnUninstall.UseVisualStyleBackColor = false; this.btnUninstall.Click += new System.EventHandler(this.btnUninstall_Click); // // ToolHubItemControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(254)))), ((int)(((byte)(252)))), ((int)(((byte)(251))))); this.Controls.Add(this.btnUninstall); this.Controls.Add(this.linkPoweredBy); this.Controls.Add(this.textInput); this.Controls.Add(this.comboOptions); this.Controls.Add(this.progressBar); this.Controls.Add(this.labelStatus); this.Controls.Add(this.btnRun); this.Controls.Add(this.labelIcon); this.Controls.Add(this.labelDescription); this.Controls.Add(this.labelTitle); this.Name = "ToolHubItemControl"; this.Size = new System.Drawing.Size(420, 216); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Label labelTitle; private System.Windows.Forms.Label labelDescription; private System.Windows.Forms.Label labelIcon; private System.Windows.Forms.Button btnRun; private System.Windows.Forms.Label labelStatus; private System.Windows.Forms.ProgressBar progressBar; private System.Windows.Forms.ComboBox comboOptions; private System.Windows.Forms.TextBox textInput; private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; private System.Windows.Forms.LinkLabel linkPoweredBy; private System.Windows.Forms.Button btnUninstall; } } ================================================ FILE: Flyoobe/ToolHubView/ToolHubItemControl.cs ================================================ using System; using System.Diagnostics; using System.Drawing; using System.IO; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe.ToolHub { public partial class ToolHubItemControl : UserControl { private readonly ToolHubDefinition _tool; private readonly string _placeholderText = "Enter input (e.g., IDs or raw arguments)"; public ToolHubItemControl(ToolHubDefinition tool) { InitializeComponent(); _tool = tool ?? throw new ArgumentNullException(nameof(tool)); InitializeBasics(); InitializeOptions(); InitializeTextInput(); InitializePoweredByLink(); } /// /// Basic label and layout setup /// private void InitializeBasics() { labelTitle.Text = _tool.Title; labelDescription.Text = _tool.Description; labelIcon.Text = _tool.Icon; progressBar.Visible = false; labelStatus.Text = string.Empty; } /// /// Populate dropdown if # Options are defined /// private void InitializeOptions() { if (_tool.Options != null && _tool.Options.Count > 0) { comboOptions.Visible = true; comboOptions.Items.Clear(); comboOptions.Items.AddRange(_tool.Options.ToArray()); comboOptions.SelectedIndex = 0; } else { comboOptions.Visible = false; } } /// /// Configure input textbox for # Input:true scripts /// private void InitializeTextInput() { if (textInput == null) return; textInput.Visible = _tool.SupportsInput; if (!_tool.SupportsInput) return; // Determine placeholder string placeholder = !string.IsNullOrWhiteSpace(_tool.InputPlaceholder) ? _tool.InputPlaceholder : "Enter input (e.g., IDs or raw arguments)"; textInput.Text = placeholder; textInput.ForeColor = Color.Gray; // UX behavior: placeholder clear/restore textInput.GotFocus += (s, e) => { if (textInput.Text.Equals(placeholder, StringComparison.Ordinal)) { textInput.Text = string.Empty; textInput.ForeColor = SystemColors.WindowText; } }; textInput.LostFocus += (s, e) => { if (string.IsNullOrWhiteSpace(textInput.Text)) { textInput.Text = placeholder; textInput.ForeColor = Color.Gray; } }; } /// /// Show "Powered by" link if metadata is provided /// private void InitializePoweredByLink() { if (string.IsNullOrWhiteSpace(_tool.PoweredByText) || string.IsNullOrWhiteSpace(_tool.PoweredByUrl)) { linkPoweredBy.Visible = false; return; } linkPoweredBy.Text = _tool.PoweredByText.Trim(); linkPoweredBy.Tag = _tool.PoweredByUrl.Trim(); linkPoweredBy.Visible = true; linkPoweredBy.LinkClicked += linkPoweredBy_LinkClicked; linkPoweredBy.AccessibleName = "Powered by link"; linkPoweredBy.AccessibleDescription = "Opens the developer's website"; } private async void btnRun_Click(object sender, EventArgs e) { if (!File.Exists(_tool.ScriptPath)) { MessageBox.Show("Script not found: " + _tool.ScriptPath, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } this.Enabled = false; progressBar.Visible = true; progressBar.Style = ProgressBarStyle.Marquee; labelStatus.Text = "Running..."; try { // Defaults from # Host bool useConsole = _tool.UseConsole; bool useLog = _tool.UseLog; // Selected option text (may carry host-suffix overrides) string optionArg = null; if (comboOptions != null && comboOptions.Visible && comboOptions.SelectedItem != null) { optionArg = comboOptions.SelectedItem.ToString(); if (optionArg.EndsWith(" (console)", StringComparison.Ordinal)) { useConsole = true; useLog = false; optionArg = optionArg.Substring(0, optionArg.Length - " (console)".Length).Trim(); } else if (optionArg.EndsWith(" (silent)", StringComparison.Ordinal)) { useConsole = false; useLog = false; optionArg = optionArg.Substring(0, optionArg.Length - " (silent)".Length).Trim(); } else if (optionArg.EndsWith(" (log)", StringComparison.Ordinal)) { useLog = true; useConsole = false; optionArg = optionArg.Substring(0, optionArg.Length - " (log)".Length).Trim(); } } // Optional free text argument (only if visible and real input) string inputArg = null; if (_tool.SupportsInput && textInput != null && textInput.Visible) { var t = (textInput.Text ?? string.Empty).Trim(); var placeholder = string.IsNullOrWhiteSpace(_tool.InputPlaceholder) ? _placeholderText : _tool.InputPlaceholder; if (!string.IsNullOrEmpty(t) && !string.Equals(t, placeholder, StringComparison.Ordinal)) inputArg = t; } // Build positional argument string: // "" [space]"" // This keeps backward-compatibility with scripts using $args[0]/$args[1] // AND also binds to param($Option,$ArgsText) by position when present. var extraArgs = new StringBuilder(); if (!string.IsNullOrWhiteSpace(optionArg)) extraArgs.Append(" ").Append(QuoteForPs(optionArg)); if (!string.IsNullOrWhiteSpace(inputArg)) extraArgs.Append(" ").Append(QuoteForPs(inputArg)); // Live log window if requested if (useLog) { Logger.ShowLogView(); // Start a new visual log section for this specific tool or extension Logger.BeginSection($"Running {_tool.Title ?? _tool.ScriptPath}"); } // Run script (console vs. silent) and stream logs var output = await RunScriptAsync(_tool.ScriptPath, extraArgs.ToString(), useConsole); labelStatus.Text = useConsole ? "Opened in console." : useLog ? "Completed with log." : "Done."; if (!string.IsNullOrWhiteSpace(output)) Logger.Log(output, LogLevel.Info); } catch (Exception ex) { labelStatus.Text = "Error: " + ex.Message; Logger.Log("ERROR: " + ex.Message, LogLevel.Error); } finally { progressBar.Visible = false; this.Enabled = true; } } private Task RunScriptAsync(string scriptPath, string positionalArgs, bool useConsole) { return Task.Run(() => { // Compose final PowerShell commandline; 'positionalArgs' already starts with a space when non-empty var argsForPs = $"-NoProfile -ExecutionPolicy Bypass -File \"{scriptPath}\"{positionalArgs}"; if (useConsole) { var psi = new ProcessStartInfo("powershell.exe", "-NoExit " + argsForPs) { UseShellExecute = true, CreateNoWindow = false }; Process.Start(psi); return "Launched in external console."; } else { var psi = new ProcessStartInfo("powershell.exe", argsForPs) { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; var sb = new StringBuilder(); using (var p = new Process { StartInfo = psi }) { p.OutputDataReceived += (s, e) => { if (!string.IsNullOrEmpty(e.Data)) { Logger.Log(e.Data, LogLevel.Info); } }; p.ErrorDataReceived += (s, e) => { if (!string.IsNullOrEmpty(e.Data)) { sb.AppendLine("ERROR: " + e.Data); Logger.Log("ERROR: " + e.Data, LogLevel.Error); } }; p.Start(); p.BeginOutputReadLine(); p.BeginErrorReadLine(); p.WaitForExit(); } return sb.ToString(); } }); } /// /// Double-quote for PowerShell positional args: "value with \"escaped\" quotes" /// private static string QuoteForPs(string value) { if (value == null) return "\"\""; var escaped = value.Replace("\"", "\\\""); return "\"" + escaped + "\""; } /// /// Open the "Powered by" link in default browser /// private void linkPoweredBy_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { try { Process.Start(new ProcessStartInfo(linkPoweredBy.Tag.ToString()) { UseShellExecute = true }); } catch (Exception ex) { MessageBox.Show("Could not open link:\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnUninstall_Click(object sender, EventArgs e) { try { if (!File.Exists(_tool.ScriptPath)) { MessageBox.Show("File already missing:\n" + _tool.ScriptPath, "Uninstall", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Parent?.Controls.Remove(this); // remove from UI anyway return; } var confirm = MessageBox.Show( "Do you want to remove this extension?\n\n" + _tool.Title, "Confirm uninstall", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); if (confirm != DialogResult.Yes) return; File.Delete(_tool.ScriptPath); // Remove this control from the panel immediately this.Parent?.Controls.Remove(this); } catch (Exception ex) { MessageBox.Show("Could not delete script:\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } ================================================ FILE: Flyoobe/ToolHubView/ToolHubItemControl.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 17, 17 ================================================ FILE: Flyoobe/ToolHubView/ToolHubUrlDialog.cs ================================================ using System; using System.Diagnostics; using System.Windows.Forms; /// /// Dialog for entering a .ps1 URL to install an extension. /// Also provides a link to the community Extensions Store (GitHub). /// namespace Flyoobe.ToolHub { public class InputDialog : Form { private TextBox textBox; private Button btnOk; private Button btnCancel; private LinkLabel linkStore; public string InputText => textBox.Text; public InputDialog(string title, string prompt) { Text = title; FormBorderStyle = FormBorderStyle.FixedDialog; StartPosition = FormStartPosition.CenterParent; MinimizeBox = false; MaximizeBox = false; Width = 420; Height = 200; AutoSize = true; var lblPrompt = new Label { Left = 10, Top = 15, Width = 380, AutoSize = true, Text = prompt }; Controls.Add(lblPrompt); textBox = new TextBox { Left = 10, Top = 40, Width = 380, AutoSize = true, }; Controls.Add(textBox); // Store link linkStore = new LinkLabel { Left = 10, Top = 70, Width = 380, AutoSize = true, Text = "Browse Extensions Store (GitHub)" }; linkStore.LinkClicked += (s, e) => { Process.Start(new ProcessStartInfo { FileName = "https://github.com/builtbybel/Flyoobe/blob/main/Flyoobe.Extensions/EXTENSIONS.md", UseShellExecute = true }); }; Controls.Add(linkStore); btnOk = new Button { Text = "OK", Left = 220, Width = 70, Top = 110, AutoSize = true, DialogResult = DialogResult.OK }; Controls.Add(btnOk); btnCancel = new Button { Text = "Cancel", Left = 300, Width = 70, Top = 110, AutoSize = true, DialogResult = DialogResult.Cancel }; Controls.Add(btnCancel); AcceptButton = btnOk; CancelButton = btnCancel; } } } ================================================ FILE: Flyoobe/ViewMetadata.cs ================================================ using System; using System.Collections.Generic; namespace Flyoobe { /// /// Provides metadata (titles, subtitles, and search tags) for all views. /// Used by the Home dashboard and navigation UI without loading each view. /// public static class ViewMetadata { /// /// Maps each view name to a set of search keywords. /// Used by the Home dashboard search to find matching tiles. /// public static readonly Dictionary SearchTags = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "Device", "device name computer" }, { "Personalization", "theme wallpaper colors transparency taskbar" }, { "Browser", "edge chrome firefox default browser web" }, { "AI", "ai privacy recall copilot telemetry" }, { "Network", "wifi lan ethernet hotspot" }, { "Account", "local microsoft login password offline" }, { "Apps", "debloat remove apps store cleanup bloatware" }, { "Experience", "setup privacy tuning tweak" }, { "Installer", "install apps packages winget" }, { "Updates", "windows update patches wu offline" }, { "Advanced", "clean install repair boot bios rufus ventoy" }, { "Extensions", "tools hub addons tweaks ninite winget" }, { "Flyby11", "upgrade migrate windows 11 flyby esu 10" }, { "Windows 11 25H2 Enablement Package", "enable feature pack 25h2 new features" } }; /// /// Maps each view name to its display title and subtitle. /// Used in headers, navigation, and the Home dashboard. /// public static readonly Dictionary Pages = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "Device", ("Device Prep", "Customize your device name, user name, and system language during Windows setup") }, { "Personalization", ("Personalize Device", "Customize themes, wallpaper, and taskbar settings") }, { "Browser", ("Default Browser", "Choose and install your preferred web browser") }, { "AI", ("AI Experiences", "Manage AI-related features and settings") }, { "Network", ("Network", "Manage your network connections during Windows setup") }, { "Account", ("Account", "Manage local and online accounts") }, { "Apps", ("Apps && Bloatware", "Uninstall unwanted apps and bloatware. #Dumputer #Debloater") }, { "Experience", ("Optimize Experience Settings", "Customize recommended settings for your device during Windows setup #Privacy #CoTweaker #CrapFixer") }, { "Installer", ("App Installer", "Easily install commonly used applications via Winget") }, { "Updates", ("Windows Updates", "Patch && enable features") }, { "Advanced", ("Custom Install && Repair", "Boot, recovery && power tools") }, { "Settings", ("App-Settings", "") }, { "Extensions", ("Explore Extensions", "") }, }; /// /// Optional user count badges for tiles (e.g., "1M+ users"). /// public static readonly Dictionary UserCounts = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "Flyby11", "1M+ users" }, { "Windows 11 25H2 Enablement Package", "100k+ users" } }; } } ================================================ FILE: Flyoobe/ViewNavigator.cs ================================================ using Flyoobe; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; /// /// Central navigation controller for the entire application. /// /// Responsibilities: /// - Hosts all top-level pages (Home, OobeControl, Settings, Extensions). /// - Hosts all OOBE sub-pages (Device, Network, etc.) *inside* the active OobeControl. /// - Maintains a global back-stack. /// - Updates the main window title via callback. /// - Allows pages to refresh when shown. /// - Supports metadata-driven titles. /// /// No Next button is required. Only a global Back button exists. /// public sealed class ViewNavigator { // -------------------------------------------------------------------- // Fields // -------------------------------------------------------------------- private readonly Panel _rootHost; // Panel on MainForm that hosts top-level views private readonly Action _onViewChanged; // Callback to update MainForm title/header private readonly Button _backBtn; // Global back button (MainForm only) /// /// Factory map: /// Holds a collection of view-constructors keyed by logical view name. /// /// Purpose: /// - Allows any view to be created on demand by name. /// - Decouples navigation from concrete UserControl types. /// - Ensures views are created only when needed. /// private readonly Dictionary> _factories = new Dictionary>(StringComparer.OrdinalIgnoreCase); /// /// View cache: /// Stores already-created view instances to avoid recreating controls. /// /// Purpose: /// - Ensures expensive UserControls are only constructed once. /// - Improves performance and preserves state between navigations. /// - Allows ShowView() to instantly re-display previously loaded screens. /// private readonly Dictionary _cache = new Dictionary(StringComparer.OrdinalIgnoreCase); /// /// Global navigation history: /// Tracks previously visited views in reverse order (stack-based). /// /// Purpose: /// - Implements the global Back-button behavior. /// - Allows a single central Back-button to undo navigation steps. /// - Works across all pages, including OOBE and top-level views. /// private readonly Stack _history = new Stack(); // -------------------------------------------------------------------- // Public Properties // -------------------------------------------------------------------- /// /// The logical OOBE setup sequence. /// These steps will be loaded into OobeControl.ContentPanel. /// public readonly string[] OobeSteps = { "Device", "Personalization", "Browser", "AI", "Network", "Account", "Apps", "Experience", "Installer", "Updates", "Advanced" }; /// /// Provides external access to the OOBE step list. /// Used e.g. in HomeControlView to build tiles dynamically. /// public IEnumerable OobeStepsWithoutHome => OobeSteps; /// /// Current loaded view key. /// public string CurrentKey { get; private set; } /// /// Current loaded UserControl instance. /// public UserControl CurrentView { get; private set; } // -------------------------------------------------------------------- // Constructor // -------------------------------------------------------------------- private readonly OobeControl _oobeControl; public ViewNavigator( Panel rootHost, Action onViewChanged, Button backButton) { _rootHost = rootHost; _onViewChanged = onViewChanged; _backBtn = backButton; // Create and prepare OOBE container internally _oobeControl = new OobeControl(); _oobeControl.Dock = DockStyle.Fill; _oobeControl.Visible = false; // Add it to the root host once (stays hidden until needed) _rootHost.Controls.Add(_oobeControl); if (_backBtn != null) _backBtn.Click += (s, e) => Back(); UpdateBackButtonState(); } // -------------------------------------------------------------------- // Registration // -------------------------------------------------------------------- /// /// Registers a view factory for a specific name. /// public void RegisterView(string name, Func factory) { _factories[name] = factory; } // -------------------------------------------------------------------- // Core Load Logic // -------------------------------------------------------------------- /// /// Loads a view by name. /// /// There are two rendering modes: /// 1. OOBE steps > rendered inside the OobeControl container. /// 2. Normal top-level pages > rendered directly into the root host panel. /// private void Load(string name) { // Ensure the view exists if (!_factories.ContainsKey(name)) return; CurrentKey = name; // Retrieve or create cached instance if (!_cache.TryGetValue(name, out var control)) { control = _factories[name](); control.Dock = DockStyle.Fill; _cache[name] = control; } CurrentView = control; // Update window title based on metadata or fallback if (ViewMetadata.Pages.TryGetValue(name, out var meta)) _onViewChanged?.Invoke(meta.Title); else _onViewChanged?.Invoke(name); // -------------------------------------------------------------------- // CASE 1: OOBE step > display inside OobeControl // -------------------------------------------------------------------- if (OobeSteps.Contains(name)) { // Show the OOBE container _oobeControl.Visible = true; // Activate the OobeControl inside the root host. // We only replace the current root-host content if it is NOT // already displaying the OobeControl. This bprevents unnecessary Clear() + Add() operations, // which would otherwise cause visible flicker when switching if (_rootHost.Controls.Count == 0 || _rootHost.Controls[0] != _oobeControl) { _rootHost.Controls.Clear(); // Remove any existing top-level page only once _rootHost.Controls.Add(_oobeControl); // Insert the OobeControl as the active container } // Build sidebar only once if (_oobeControl.SidebarPanel.Controls.Count == 0) BuildOobeSidebar(_oobeControl.SidebarPanel); // Load the step into the OOBE content panel var host = _oobeControl.ContentPanel; host.Controls.Clear(); host.Controls.Add(control); // Highlight the active step in the sidebar HighlightStep(name); UpdateBackButtonState(); return; } // -------------------------------------------------------------------- // CASE 2: Normal top-level page > hide the OOBE container // -------------------------------------------------------------------- _oobeControl.Visible = false; _rootHost.Controls.Clear(); _rootHost.Controls.Add(control); UpdateBackButtonState(); } // -------------------------------------------------------------------- // Navigation // -------------------------------------------------------------------- public void ShowView(string name) { if (CurrentKey != null && CurrentKey != name) _history.Push(CurrentKey); Load(name); } public void Back() { if (_history.Count == 0) return; var previous = _history.Pop(); Load(previous); } // -------------------------------------------------------------------- // Sidebar (OOBE) // -------------------------------------------------------------------- private void BuildOobeSidebar(Panel sidebar) { sidebar.Controls.Clear(); using (var g = sidebar.CreateGraphics()) { // Dynamically scale height based on font and system DPI int textHeight = TextRenderer.MeasureText(g, "Ag", sidebar.Font).Height; int paddingScaled = (int)(20 * (g.DpiY / 96f)); // padding scaled with DPI int btnHeight = textHeight + paddingScaled; foreach (var step in OobeSteps.Reverse()) // lets ensure correct top-down order { var btn = new Button { Text = step, Tag = step, Dock = DockStyle.Top, Height = btnHeight, Cursor = Cursors.Hand, FlatStyle = FlatStyle.Flat, TextAlign = ContentAlignment.MiddleLeft, AutoEllipsis = true, Padding = new Padding(10, 0, 0, 0), ForeColor = Color.DimGray, BackColor = Color.Transparent }; btn.FlatAppearance.BorderSize = 0; btn.FlatAppearance.MouseOverBackColor = Color.White; btn.Click += (s, e) => { string key = btn.Tag.ToString(); ShowView(key); }; sidebar.Controls.Add(btn); } } HighlightStep(CurrentKey); } private void HighlightStep(string step) { if (_oobeControl == null) return; foreach (Control c in _oobeControl.SidebarPanel.Controls) { if (c is Button btn) { bool active = btn.Tag.ToString() == step; btn.ForeColor = active ? Color.FromArgb(91, 95, 194) : Color.DimGray; } } } // -------------------------------------------------------------------- // Button Handling // -------------------------------------------------------------------- private void UpdateBackButtonState() { if (_backBtn != null) _backBtn.Enabled = _history.Count > 0; } } ================================================ FILE: Flyoobe/Views/AccountControlView.Designer.cs ================================================ namespace Flyoobe { partial class AccountControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.panel1 = new System.Windows.Forms.Panel(); this.btnCreateAccountWizard = new System.Windows.Forms.Button(); this.linkOnlineAccount = new System.Windows.Forms.LinkLabel(); this.btnCreateAccount = new System.Windows.Forms.Button(); this.textPassword = new System.Windows.Forms.TextBox(); this.textUsername = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(219)))), ((int)(((byte)(229))))); this.panel1.Controls.Add(this.btnCreateAccountWizard); this.panel1.Controls.Add(this.linkOnlineAccount); this.panel1.Controls.Add(this.btnCreateAccount); this.panel1.Controls.Add(this.textPassword); this.panel1.Controls.Add(this.textUsername); this.panel1.Controls.Add(this.label3); this.panel1.Controls.Add(this.label2); this.panel1.Controls.Add(this.label1); this.panel1.Location = new System.Drawing.Point(43, 30); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(747, 404); this.panel1.TabIndex = 10; // // btnCreateAccountWizard // this.btnCreateAccountWizard.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCreateAccountWizard.BackColor = System.Drawing.Color.Transparent; this.btnCreateAccountWizard.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(83)))), ((int)(((byte)(167))))); this.btnCreateAccountWizard.FlatAppearance.BorderSize = 2; this.btnCreateAccountWizard.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DimGray; this.btnCreateAccountWizard.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DimGray; this.btnCreateAccountWizard.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnCreateAccountWizard.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnCreateAccountWizard.ForeColor = System.Drawing.Color.Black; this.btnCreateAccountWizard.Location = new System.Drawing.Point(356, 354); this.btnCreateAccountWizard.Name = "btnCreateAccountWizard"; this.btnCreateAccountWizard.Size = new System.Drawing.Size(227, 31); this.btnCreateAccountWizard.TabIndex = 8; this.btnCreateAccountWizard.Text = "Windows Local Account Wizard"; this.btnCreateAccountWizard.UseCompatibleTextRendering = true; this.btnCreateAccountWizard.UseVisualStyleBackColor = false; this.btnCreateAccountWizard.Click += new System.EventHandler(this.btnCreateAccountWizard_Click); // // linkOnlineAccount // this.linkOnlineAccount.ActiveLinkColor = System.Drawing.Color.Fuchsia; this.linkOnlineAccount.AutoSize = true; this.linkOnlineAccount.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline)))); this.linkOnlineAccount.LinkColor = System.Drawing.Color.Black; this.linkOnlineAccount.Location = new System.Drawing.Point(148, 23); this.linkOnlineAccount.Name = "linkOnlineAccount"; this.linkOnlineAccount.Size = new System.Drawing.Size(146, 27); this.linkOnlineAccount.TabIndex = 7; this.linkOnlineAccount.TabStop = true; this.linkOnlineAccount.Text = "Microsoft Account"; this.linkOnlineAccount.UseCompatibleTextRendering = true; this.linkOnlineAccount.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkOnlineAccount_LinkClicked); // // btnCreateAccount // this.btnCreateAccount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCreateAccount.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnCreateAccount.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(83)))), ((int)(((byte)(167))))); this.btnCreateAccount.FlatAppearance.BorderSize = 2; this.btnCreateAccount.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DimGray; this.btnCreateAccount.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DimGray; this.btnCreateAccount.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnCreateAccount.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnCreateAccount.ForeColor = System.Drawing.Color.White; this.btnCreateAccount.Location = new System.Drawing.Point(602, 354); this.btnCreateAccount.Name = "btnCreateAccount"; this.btnCreateAccount.Size = new System.Drawing.Size(130, 31); this.btnCreateAccount.TabIndex = 6; this.btnCreateAccount.Text = "Create Account"; this.btnCreateAccount.UseCompatibleTextRendering = true; this.btnCreateAccount.UseVisualStyleBackColor = false; this.btnCreateAccount.Click += new System.EventHandler(this.btnCreateAccount_Click); // // textPassword // this.textPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.textPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.textPassword.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.textPassword.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(35)))), ((int)(((byte)(34)))), ((int)(((byte)(43))))); this.textPassword.Location = new System.Drawing.Point(19, 164); this.textPassword.Name = "textPassword"; this.textPassword.Size = new System.Drawing.Size(713, 25); this.textPassword.TabIndex = 4; this.textPassword.UseSystemPasswordChar = true; // // textUsername // this.textUsername.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.textUsername.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.textUsername.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.textUsername.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(35)))), ((int)(((byte)(34)))), ((int)(((byte)(43))))); this.textUsername.Location = new System.Drawing.Point(19, 97); this.textUsername.Name = "textUsername"; this.textUsername.Size = new System.Drawing.Size(713, 25); this.textUsername.TabIndex = 1; // // label3 // this.label3.AutoSize = true; this.label3.Font = new System.Drawing.Font("Segoe UI Variable Display Semil", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label3.ForeColor = System.Drawing.Color.Black; this.label3.Location = new System.Drawing.Point(19, 135); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(59, 22); this.label3.TabIndex = 2; this.label3.Text = "Password"; this.label3.UseCompatibleTextRendering = true; // // label2 // this.label2.AutoSize = true; this.label2.Font = new System.Drawing.Font("Segoe UI Variable Display Semil", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label2.ForeColor = System.Drawing.Color.Black; this.label2.Location = new System.Drawing.Point(19, 71); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(62, 22); this.label2.TabIndex = 1; this.label2.Text = "Username"; this.label2.UseCompatibleTextRendering = true; // // label1 // this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12F, System.Drawing.FontStyle.Bold); this.label1.ForeColor = System.Drawing.Color.Black; this.label1.Location = new System.Drawing.Point(19, 23); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(112, 27); this.label1.TabIndex = 0; this.label1.Text = "Local Account"; this.label1.UseCompatibleTextRendering = true; // // AccountControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.panel1); this.Name = "AccountControlView"; this.Size = new System.Drawing.Size(835, 457); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TextBox textPassword; private System.Windows.Forms.TextBox textUsername; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; private System.Windows.Forms.Button btnCreateAccount; private System.Windows.Forms.LinkLabel linkOnlineAccount; private System.Windows.Forms.Button btnCreateAccountWizard; } } ================================================ FILE: Flyoobe/Views/AccountControlView.cs ================================================ using System; using System.Diagnostics; using System.Security.Principal; using System.Windows.Forms; namespace Flyoobe { public partial class AccountControlView : UserControl, IView { public AccountControlView() { InitializeComponent(); } private void btnCreateAccount_Click(object sender, EventArgs e) { if (!IsAdministrator()) { MessageBox.Show("You need to run the application as Administrator to create a local account.", "Insufficient Privileges", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } string username = textUsername.Text.Trim(); string password = textPassword.Text.Trim(); if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) { MessageBox.Show("Please enter both username and password.", "Input Required", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } CreateLocalAccount(username, password); } private bool IsAdministrator() { using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) { var principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } private void CreateLocalAccount(string username, string password) { string arguments = $"/c net user \"{username}\" \"{password}\" /add"; var processInfo = new ProcessStartInfo("cmd.exe", arguments) { Verb = "runas", CreateNoWindow = true, UseShellExecute = true }; try { Process.Start(processInfo); MessageBox.Show($"Local account '{username}' created successfully.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); RefreshView(); } catch (Exception ex) { MessageBox.Show($"Failed to create user: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void linkOnlineAccount_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start("ms-settings:emailandaccounts"); } private void btnCreateAccountWizard_Click(object sender, EventArgs e) { try { Process.Start("explorer.exe", "ms-cxh:localonly"); } catch (Exception ex) { MessageBox.Show($"Failed to open local account creation: {ex.Message}"); } } public void RefreshView() { textUsername.Text = textPassword.Text = ""; } } } ================================================ FILE: Flyoobe/Views/AccountControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/AiControlView.Designer.cs ================================================ namespace Flyoobe { partial class AiControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.lblStatus = new System.Windows.Forms.Label(); this.btnCheck = new System.Windows.Forms.Button(); this.listResults = new System.Windows.Forms.ListView(); this.Item = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.Status = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.btnDisable = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // lblStatus // this.lblStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblStatus.AutoEllipsis = true; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblStatus.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(131)))), ((int)(((byte)(135))))); this.lblStatus.Location = new System.Drawing.Point(42, 390); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(767, 20); this.lblStatus.TabIndex = 27; this.lblStatus.Text = "Ready"; // // btnCheck // this.btnCheck.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCheck.BackColor = System.Drawing.Color.Transparent; this.btnCheck.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnCheck.FlatAppearance.BorderSize = 2; this.btnCheck.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DimGray; this.btnCheck.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DimGray; this.btnCheck.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnCheck.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnCheck.ForeColor = System.Drawing.Color.White; this.btnCheck.Location = new System.Drawing.Point(470, 423); this.btnCheck.Name = "btnCheck"; this.btnCheck.Size = new System.Drawing.Size(160, 31); this.btnCheck.TabIndex = 25; this.btnCheck.TabStop = false; this.btnCheck.Text = "Check"; this.btnCheck.UseCompatibleTextRendering = true; this.btnCheck.UseVisualStyleBackColor = false; // // listResults // this.listResults.Activation = System.Windows.Forms.ItemActivation.OneClick; this.listResults.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.listResults.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.listResults.BorderStyle = System.Windows.Forms.BorderStyle.None; this.listResults.CheckBoxes = true; this.listResults.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.Item, this.Status}); this.listResults.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.5F); this.listResults.FullRowSelect = true; this.listResults.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.listResults.HideSelection = false; this.listResults.HotTracking = true; this.listResults.HoverSelection = true; this.listResults.Location = new System.Drawing.Point(46, 119); this.listResults.Name = "listResults"; this.listResults.Size = new System.Drawing.Size(763, 249); this.listResults.TabIndex = 32; this.listResults.UseCompatibleStateImageBehavior = false; this.listResults.View = System.Windows.Forms.View.Details; // // Item // this.Item.Text = "Feature"; this.Item.Width = 180; // // Status // this.Status.Text = "Current status"; this.Status.Width = 80; // // btnDisable // this.btnDisable.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnDisable.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(83)))), ((int)(((byte)(206)))), ((int)(((byte)(249))))); this.btnDisable.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnDisable.FlatAppearance.BorderSize = 2; this.btnDisable.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DimGray; this.btnDisable.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DimGray; this.btnDisable.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnDisable.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.btnDisable.ForeColor = System.Drawing.Color.Black; this.btnDisable.Location = new System.Drawing.Point(649, 423); this.btnDisable.Name = "btnDisable"; this.btnDisable.Size = new System.Drawing.Size(160, 31); this.btnDisable.TabIndex = 33; this.btnDisable.Text = "Turn off selected"; this.btnDisable.UseCompatibleTextRendering = true; this.btnDisable.UseVisualStyleBackColor = false; // // label1 // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label1.AutoEllipsis = true; this.label1.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.label1.ForeColor = System.Drawing.Color.Black; this.label1.Location = new System.Drawing.Point(42, 66); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(739, 29); this.label1.TabIndex = 34; this.label1.Text = "Review which AI features are enabled, and choose which ones you want to turn off"; this.label1.UseCompatibleTextRendering = true; // // AiControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.label1); this.Controls.Add(this.btnDisable); this.Controls.Add(this.listResults); this.Controls.Add(this.lblStatus); this.Controls.Add(this.btnCheck); this.Name = "AiControlView"; this.Size = new System.Drawing.Size(835, 457); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.Button btnCheck; private System.Windows.Forms.ListView listResults; private System.Windows.Forms.Button btnDisable; private System.Windows.Forms.ColumnHeader Item; private System.Windows.Forms.ColumnHeader Status; private System.Windows.Forms.Label label1; } } ================================================ FILE: Flyoobe/Views/AiControlView.cs ================================================ using Microsoft.Win32; using System; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { public partial class AiControlView : UserControl, IView { public AiControlView() { InitializeComponent(); btnCheck.Click += async (s, e) => await DoScan(); btnDisable.Click += async (s, e) => await DoRemove(); } // IView Refreshes the UI by re-scanning. public async void RefreshView() { await DoScan(); } /// /// Scans relevant registry/policy/Appx states and populates the list. /// private async Task DoScan() { lblStatus.Text = "Checking status..."; listResults.Items.Clear(); await Task.Run(() => { string copilotBtn = CheckCopilotButton(); string clickToDo = CheckClickToDo(); string recall = CheckRecall(); string copilotPolicy = CheckCopilotPolicy(); string edgeSidebar = CheckEdgeSidebar(); string edgeHubs = CheckEdgeHubs(); string edgeAllowCopilot = CheckEdgeAllowCopilot(); string edgeConfigureCopilot = CheckEdgeConfigureCopilot(); string copilotApp = HasCopilotApp() ? "Installed" : "Not found"; this.Invoke((Action)(() => { AddItem("Copilot taskbar button", copilotBtn); AddItem("Copilot policy (TurnOff)", copilotPolicy); AddItem("Click To Do", clickToDo); AddItem("Recall component", recall); AddItem("Edge: Sidebar enabled", edgeSidebar); AddItem("Edge: Show side panel hubs", edgeHubs); AddItem("Edge: Allow Copilot", edgeAllowCopilot); AddItem("Edge: Configure Copilot", edgeConfigureCopilot); AddItem("Copilot Appx (because Microsoft loves AI)", copilotApp); lblStatus.Text = "Check finished. AI is everywhere, whether you like it or not."; listResults.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); })); }); } /// /// Applies changes for all checked items. /// private async Task DoRemove() { if (listResults.CheckedItems.Count == 0) { lblStatus.Text = "Nothing selected."; return; } lblStatus.Text = "Applying change..."; // Snapshot only the display texts var selectedNames = listResults.CheckedItems .Cast() .Select(it => it.SubItems[0].Text) .ToList(); // Perform work in background and collect per-item result text var results = await Task.Run(() => { var dict = selectedNames.ToDictionary(n => n, n => "Removed/Disabled"); foreach (var name in selectedNames) { try { if (name == "Copilot taskbar button") WriteDwordHKCU(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "ShowCopilotButton", 0); else if (name == "Copilot policy (TurnOff)") WriteDwordHKLM(@"SOFTWARE\Policies\Microsoft\Windows\WindowsCopilot", "TurnOffWindowsCopilot", 1); else if (name == "Click To Do") WriteDwordHKCU(@"Software\Microsoft\Windows\Shell\ClickToDo", "DisableClickToDo", 1); else if (name == "Recall component") WriteDwordHKLM(@"SOFTWARE\Policies\Microsoft\Windows\WindowsAI", "AllowRecallEnablement", 0); else if (name == "Edge: Sidebar enabled") WriteDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "EdgeSidebarEnabled", 0); else if (name == "Edge: Show side panel hubs") { // Apply policy at machine level (requires admin rights) WriteDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "HubsSidebarEnabled", 0); // Also apply at user policy level, in case HKLM is not used WriteDwordHKCU(@"SOFTWARE\Policies\Microsoft\Edge", "SHubsSidebarEnabled", 0); // Finally, set the normal user preference (ignored if a policy exists) WriteDwordHKCU(@"Software\Microsoft\Edge", "HubsSidebarEnabled", 0); } else if (name == "Edge: Allow Copilot") WriteDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "AllowCopilot", 0); else if (name == "Edge: Configure Copilot") WriteDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "ConfigureCopilot", 0); else if (name.StartsWith("Copilot Appx", StringComparison.OrdinalIgnoreCase)) { var (ok, msg) = RemoveCopilotApp(); dict[name] = ok ? "Removed (Appx)" : "Error: " + msg; } } catch (Exception ex) { dict[name] = "Error: " + ex.Message; } } return dict; }); // Update UI once, on UI thread foreach (ListViewItem it in listResults.Items) { var name = it.SubItems[0].Text; if (results.TryGetValue(name, out var status)) it.SubItems[1].Text = status; } lblStatus.Text = "All set. Your AI settings have been updated."; } // ------------------- Checks ------------------- /// Returns Copilot button state from HKCU. private string CheckCopilotButton() { int val = ReadDwordHKCU(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "ShowCopilotButton", -1); return val == 1 ? "Enabled" : val == 0 ? "Disabled" : "Not set"; } /// Returns Click To Do state from HKCU. private string CheckClickToDo() { int val = ReadDwordHKCU(@"Software\Microsoft\Windows\Shell\ClickToDo", "DisableClickToDo", -1); return val == 1 ? "Disabled" : val == 0 ? "Enabled" : "Not set"; } /// Returns Recall policy state from HKLM. private string CheckRecall() { int val = ReadDwordHKLM(@"SOFTWARE\Policies\Microsoft\Windows\WindowsAI", "AllowRecallEnablement", -1); return val == 1 ? "Allowed" : val == 0 ? "Blocked" : "Not set"; } /// Returns Copilot policy (TurnOffWindowsCopilot) from HKLM. private string CheckCopilotPolicy() { int val = ReadDwordHKLM(@"SOFTWARE\Policies\Microsoft\Windows\WindowsCopilot", "TurnOffWindowsCopilot", -1); return val == 1 ? "Disabled (policy)" : val == 0 ? "Enabled (policy)" : "Not set"; } /// Returns Edge Sidebar policy from HKLM. private string CheckEdgeSidebar() { int val = ReadDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "EdgeSidebarEnabled", -1); return val == 0 ? "Disabled" : val == 1 ? "Enabled" : "Not set"; } /// /// Checks Edge Hubs (side panel) status. /// Priority: Policy (HKLM/HKCU) > User setting. /// private string CheckEdgeHubs() { // 1) Check machine-wide policy (HKLM) int policyMachine = ReadDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "HubsSidebarEnabled", -1); if (policyMachine == 0) return "Disabled (policy)"; if (policyMachine == 1) return "Enabled (policy)"; // 2) Check user policy (HKCU\Policies) int policyUser = ReadDwordHKCU(@"SOFTWARE\Policies\Microsoft\Edge", "HubsSidebarEnabled", -1); if (policyUser == 0) return "Disabled (policy)"; if (policyUser == 1) return "Enabled (policy)"; // 3) Fallback: regular user setting (no policy enforced) int userSetting = ReadDwordHKCU(@"Software\Microsoft\Edge", "HubsSidebarEnabled", -1); if (userSetting == 0) return "Disabled (user)"; if (userSetting == 1) return "Enabled (user)"; // 4) Nothing set anywhere return "Not set"; } /// Returns Edge Allow Copilot policy from HKLM. private string CheckEdgeAllowCopilot() { int val = ReadDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "AllowCopilot", -1); return val == 0 ? "Disabled" : val == 1 ? "Enabled" : "Not set"; } /// Returns Edge Configure Copilot policy from HKLM. private string CheckEdgeConfigureCopilot() { int val = ReadDwordHKLM(@"SOFTWARE\Policies\Microsoft\Edge", "ConfigureCopilot", -1); return val == 0 ? "Disabled" : val == 1 ? "Enabled" : "Not set"; } // ------------------- Registry helpers --------- /// Reads a DWORD from HKCU, returns default if missing. private int ReadDwordHKCU(string subKey, string name, int defVal) { using (var k = Registry.CurrentUser.OpenSubKey(subKey)) { if (k == null) return defVal; var v = k.GetValue(name); return v == null ? defVal : Convert.ToInt32(v); } } /// Reads a DWORD from HKLM, returns default if missing. private int ReadDwordHKLM(string subKey, string name, int defVal) { using (var k = Registry.LocalMachine.OpenSubKey(subKey)) { if (k == null) return defVal; var v = k.GetValue(name); return v == null ? defVal : Convert.ToInt32(v); } } /// Writes a DWORD to HKCU (creates the key if needed). private void WriteDwordHKCU(string subKey, string name, int val) { using (var k = Registry.CurrentUser.CreateSubKey(subKey)) { k.SetValue(name, val, RegistryValueKind.DWord); } } /// Writes a DWORD to HKLM (creates the key if needed). private void WriteDwordHKLM(string subKey, string name, int val) { using (var k = Registry.LocalMachine.CreateSubKey(subKey)) { k.SetValue(name, val, RegistryValueKind.DWord); } } // ------------------- Copilot Appx -------------- /// /// Returns true if any Appx with "copilot" is present. /// private bool HasCopilotApp() { try { var psi = new ProcessStartInfo("powershell.exe", "-NoProfile -Command \"Get-AppxPackage *copilot*\"") { UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true }; using (var p = Process.Start(psi)) { string output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); return !string.IsNullOrWhiteSpace(output); } } catch { return false; } } /// /// Tries to remove Copilot Appx elevated; waits and returns (success, message). /// Note: UseShellExecute=true is required for Verb=runas; no stream redirect. /// ExitCode 0 = success, otherwise failure. /// private (bool ok, string msg) RemoveCopilotApp() { try { var psi = new ProcessStartInfo("powershell.exe", "-NoProfile -Command \"Get-AppxPackage *copilot* | Remove-AppxPackage\"") { UseShellExecute = true, Verb = "runas", CreateNoWindow = true }; using (var p = Process.Start(psi)) { if (p == null) return (false, "Process did not start."); p.WaitForExit(); // Treat ExitCode 0 as success, otherwise failure return p.ExitCode == 0 ? (true, "Copilot Appx removal executed.") : (false, "Removal failed (exit code " + p.ExitCode + ")."); } } catch (System.ComponentModel.Win32Exception ex) { return (false, "Elevation canceled: " + ex.Message); } catch (Exception ex) { return (false, ex.Message); } } // ------------------- UI helper ----------------- /// Adds a row to the ListView with name and status. private void AddItem(string name, string status) { var it = new ListViewItem(name); it.SubItems.Add(status); listResults.Items.Add(it); } } } ================================================ FILE: Flyoobe/Views/AiControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/AppSettingsControlView.Designer.cs ================================================ namespace Flyoobe.Views { partial class AppSettingsControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.panelForm = new System.Windows.Forms.Panel(); this.chkDonated = new System.Windows.Forms.CheckBox(); this.btnDonate = new System.Windows.Forms.Button(); this.lblCopyright = new System.Windows.Forms.Label(); this.btnUpdateCheck = new System.Windows.Forms.Button(); this.btnUIBackground = new System.Windows.Forms.Button(); this.linkCodename = new System.Windows.Forms.LinkLabel(); this.linkAppVersion = new System.Windows.Forms.LinkLabel(); this.lblHeader = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.panelForm.SuspendLayout(); this.SuspendLayout(); // // panelForm // this.panelForm.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelForm.AutoScroll = true; this.panelForm.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.panelForm.Controls.Add(this.chkDonated); this.panelForm.Controls.Add(this.btnDonate); this.panelForm.Controls.Add(this.lblCopyright); this.panelForm.Location = new System.Drawing.Point(107, 150); this.panelForm.Margin = new System.Windows.Forms.Padding(4); this.panelForm.Name = "panelForm"; this.panelForm.Size = new System.Drawing.Size(595, 125); this.panelForm.TabIndex = 323; this.panelForm.TabStop = true; // // chkDonated // this.chkDonated.AutoEllipsis = true; this.chkDonated.BackColor = System.Drawing.Color.Transparent; this.chkDonated.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.chkDonated.ForeColor = System.Drawing.Color.Black; this.chkDonated.Location = new System.Drawing.Point(28, 102); this.chkDonated.Margin = new System.Windows.Forms.Padding(4); this.chkDonated.Name = "chkDonated"; this.chkDonated.Size = new System.Drawing.Size(146, 19); this.chkDonated.TabIndex = 1; this.chkDonated.Text = "I have already donated"; this.chkDonated.TextAlign = System.Drawing.ContentAlignment.MiddleRight; this.chkDonated.UseVisualStyleBackColor = false; this.chkDonated.CheckedChanged += new System.EventHandler(this.chkDonated_CheckedChanged); // // btnDonate // this.btnDonate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.btnDonate.AutoEllipsis = true; this.btnDonate.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(39)))), ((int)(((byte)(35)))), ((int)(((byte)(32))))); this.btnDonate.Cursor = System.Windows.Forms.Cursors.Hand; this.btnDonate.FlatAppearance.BorderColor = System.Drawing.Color.Black; this.btnDonate.FlatAppearance.BorderSize = 2; this.btnDonate.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; this.btnDonate.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; this.btnDonate.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btnDonate.ForeColor = System.Drawing.Color.White; this.btnDonate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnDonate.Location = new System.Drawing.Point(18, 60); this.btnDonate.Margin = new System.Windows.Forms.Padding(4); this.btnDonate.Name = "btnDonate"; this.btnDonate.Size = new System.Drawing.Size(560, 40); this.btnDonate.TabIndex = 331; this.btnDonate.TabStop = false; this.btnDonate.Text = "Donate"; this.btnDonate.UseCompatibleTextRendering = true; this.btnDonate.UseVisualStyleBackColor = false; this.btnDonate.Click += new System.EventHandler(this.btnDonate_Click); // // lblCopyright // this.lblCopyright.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblCopyright.AutoEllipsis = true; this.lblCopyright.BackColor = System.Drawing.Color.Transparent; this.lblCopyright.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.75F); this.lblCopyright.ForeColor = System.Drawing.Color.Black; this.lblCopyright.Location = new System.Drawing.Point(130, 19); this.lblCopyright.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lblCopyright.Name = "lblCopyright"; this.lblCopyright.Size = new System.Drawing.Size(354, 27); this.lblCopyright.TabIndex = 319; this.lblCopyright.Text = "A Belim app creation (C) 2025"; this.lblCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.lblCopyright.UseCompatibleTextRendering = true; // // btnUpdateCheck // this.btnUpdateCheck.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnUpdateCheck.AutoEllipsis = true; this.btnUpdateCheck.BackColor = System.Drawing.Color.Transparent; this.btnUpdateCheck.Cursor = System.Windows.Forms.Cursors.Hand; this.btnUpdateCheck.FlatAppearance.BorderColor = System.Drawing.Color.Black; this.btnUpdateCheck.FlatAppearance.BorderSize = 2; this.btnUpdateCheck.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(69)))), ((int)(((byte)(80)))), ((int)(((byte)(228))))); this.btnUpdateCheck.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(69)))), ((int)(((byte)(80)))), ((int)(((byte)(228))))); this.btnUpdateCheck.Font = new System.Drawing.Font("Segoe UI Variable Small", 11.25F); this.btnUpdateCheck.ForeColor = System.Drawing.Color.Black; this.btnUpdateCheck.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnUpdateCheck.Location = new System.Drawing.Point(508, 302); this.btnUpdateCheck.Margin = new System.Windows.Forms.Padding(4); this.btnUpdateCheck.Name = "btnUpdateCheck"; this.btnUpdateCheck.Size = new System.Drawing.Size(194, 32); this.btnUpdateCheck.TabIndex = 317; this.btnUpdateCheck.TabStop = false; this.btnUpdateCheck.Text = "Check for updates"; this.btnUpdateCheck.UseCompatibleTextRendering = true; this.btnUpdateCheck.UseVisualStyleBackColor = false; this.btnUpdateCheck.Click += new System.EventHandler(this.btnUpdateCheck_Click); // // btnUIBackground // this.btnUIBackground.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnUIBackground.BackColor = System.Drawing.Color.Transparent; this.btnUIBackground.Font = new System.Drawing.Font("Segoe UI Variable Small", 11.25F); this.btnUIBackground.ForeColor = System.Drawing.Color.Black; this.btnUIBackground.Location = new System.Drawing.Point(584, 354); this.btnUIBackground.Name = "btnUIBackground"; this.btnUIBackground.Size = new System.Drawing.Size(118, 32); this.btnUIBackground.TabIndex = 510; this.btnUIBackground.Text = "Change"; this.btnUIBackground.UseCompatibleTextRendering = true; this.btnUIBackground.UseVisualStyleBackColor = false; this.btnUIBackground.Click += new System.EventHandler(this.btnUIBackground_Click); // // linkCodename // this.linkCodename.Anchor = System.Windows.Forms.AnchorStyles.Top; this.linkCodename.AutoEllipsis = true; this.linkCodename.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 10F, System.Drawing.FontStyle.Bold); this.linkCodename.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; this.linkCodename.LinkColor = System.Drawing.Color.Black; this.linkCodename.Location = new System.Drawing.Point(182, 60); this.linkCodename.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.linkCodename.Name = "linkCodename"; this.linkCodename.Size = new System.Drawing.Size(446, 28); this.linkCodename.TabIndex = 335; this.linkCodename.TabStop = true; this.linkCodename.Text = "Your WinPilot for Setup, Tweaks && Mods"; this.linkCodename.TextAlign = System.Drawing.ContentAlignment.TopCenter; // // linkAppVersion // this.linkAppVersion.Anchor = System.Windows.Forms.AnchorStyles.Top; this.linkAppVersion.AutoEllipsis = true; this.linkAppVersion.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 12F, System.Drawing.FontStyle.Bold); this.linkAppVersion.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; this.linkAppVersion.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.linkAppVersion.Location = new System.Drawing.Point(182, 96); this.linkAppVersion.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.linkAppVersion.Name = "linkAppVersion"; this.linkAppVersion.Size = new System.Drawing.Size(446, 50); this.linkAppVersion.TabIndex = 334; this.linkAppVersion.TabStop = true; this.linkAppVersion.Text = "Version"; this.linkAppVersion.TextAlign = System.Drawing.ContentAlignment.TopCenter; this.linkAppVersion.UseCompatibleTextRendering = true; this.linkAppVersion.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkAppVersion_LinkClicked); // // lblHeader // this.lblHeader.Anchor = System.Windows.Forms.AnchorStyles.Top; this.lblHeader.AutoEllipsis = true; this.lblHeader.Font = new System.Drawing.Font("Segoe UI Variable Display", 21.25F, System.Drawing.FontStyle.Bold); this.lblHeader.ForeColor = System.Drawing.Color.Black; this.lblHeader.Location = new System.Drawing.Point(182, 10); this.lblHeader.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.lblHeader.Name = "lblHeader"; this.lblHeader.Size = new System.Drawing.Size(446, 50); this.lblHeader.TabIndex = 330; this.lblHeader.Text = "FlyOOBE"; this.lblHeader.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // label1 // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label1.AutoEllipsis = true; this.label1.BackColor = System.Drawing.Color.Transparent; this.label1.Font = new System.Drawing.Font("Segoe UI Variable Small", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label1.ForeColor = System.Drawing.Color.Black; this.label1.Location = new System.Drawing.Point(107, 359); this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(470, 27); this.label1.TabIndex = 511; this.label1.Text = "Pick a background for App"; this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.label1.UseCompatibleTextRendering = true; // // label2 // this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label2.AutoEllipsis = true; this.label2.BackColor = System.Drawing.Color.Transparent; this.label2.Font = new System.Drawing.Font("Segoe UI Variable Small", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label2.ForeColor = System.Drawing.Color.Black; this.label2.Location = new System.Drawing.Point(107, 307); this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(382, 27); this.label2.TabIndex = 512; this.label2.Text = "App updates"; this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.label2.UseCompatibleTextRendering = true; // // AppSettingsControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.btnUIBackground); this.Controls.Add(this.panelForm); this.Controls.Add(this.btnUpdateCheck); this.Controls.Add(this.linkCodename); this.Controls.Add(this.lblHeader); this.Controls.Add(this.linkAppVersion); this.Name = "AppSettingsControlView"; this.Size = new System.Drawing.Size(835, 457); this.Load += new System.EventHandler(this.AppSettingsControlView_Load); this.panelForm.ResumeLayout(false); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Panel panelForm; private System.Windows.Forms.Button btnUIBackground; private System.Windows.Forms.LinkLabel linkCodename; private System.Windows.Forms.LinkLabel linkAppVersion; private System.Windows.Forms.CheckBox chkDonated; private System.Windows.Forms.Button btnDonate; private System.Windows.Forms.Label lblHeader; private System.Windows.Forms.Label lblCopyright; private System.Windows.Forms.Button btnUpdateCheck; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; } } ================================================ FILE: Flyoobe/Views/AppSettingsControlView.cs ================================================ using System; using System.Diagnostics; using System.Drawing; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe.Views { public partial class AppSettingsControlView : UserControl, IView { private Panel _targetPanel; private Label _lblHeader; private Button _btnBack; private Button _btnRefresh; private Button _btnActivity; public AppSettingsControlView( Panel targetPanel, Label lblHeader, Button btnBack, Button btnRefresh, Button btnActivity) { InitializeComponent(); _targetPanel = targetPanel; _lblHeader = lblHeader; _btnBack = btnBack; _btnRefresh = btnRefresh; _btnActivity = btnActivity; UIHelper.EnableRoundedPanel(panelForm, 20, 0); chkDonated.Checked = DonationHelper.HasDonated(); } private void btnUIBackground_Click(object sender, EventArgs e) { BackgroundHelper.ChooseBackground(_targetPanel, _lblHeader); } private void AppSettingsControlView_Load(object sender, EventArgs e) { RefreshView(); } private void OpenGitHubUpdatePage() { try { var updateUrl = $"https://builtbybel.github.io/FlyOOBE/update-check.html?version={Program.GetAppVersion()}"; var psi = new ProcessStartInfo { FileName = updateUrl, UseShellExecute = true }; Process.Start(psi); // Some feedback linkAppVersion.Text = "Online update page opened."; linkAppVersion.Font = new Font(linkAppVersion.Font, FontStyle.Regular); } catch (Exception ex) { linkAppVersion.Text = $"Could not open update page: {ex.Message}"; } } private void chkDonated_CheckedChanged(object sender, EventArgs e) { DonationHelper.SetDonationStatus(chkDonated.Checked); } private void btnUpdateCheck_Click(object sender, EventArgs e) { OpenGitHubUpdatePage(); } private void btnDonate_Click(object sender, EventArgs e) { Process.Start(new ProcessStartInfo { FileName = "https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG", UseShellExecute = true }); } public async void RefreshView() { // Show local version string currentVersion = Program.GetAppVersion(); linkAppVersion.Text = "Fetching updates..."; linkAppVersion.Font = new Font(linkAppVersion.Font, FontStyle.Regular); await Task.Delay(2000); linkAppVersion.Text = $"You have Flyoobe version {currentVersion}"; } private void linkAppVersion_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start(new ProcessStartInfo { FileName = "https://github.com/builtbybel/Flyoobe", UseShellExecute = true }); } } } ================================================ FILE: Flyoobe/Views/AppSettingsControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/AppsControlView.Designer.cs ================================================ namespace Flyoobe { partial class AppsControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); this.progressBar = new System.Windows.Forms.ProgressBar(); this.btnRemoveSelected = new System.Windows.Forms.Button(); this.btnEdit = new System.Windows.Forms.Button(); this.lblStatus = new System.Windows.Forms.Label(); this.checkSelectAll = new System.Windows.Forms.CheckBox(); this.profileDropdown = new System.Windows.Forms.ComboBox(); this.dgvApps = new System.Windows.Forms.DataGridView(); this.SelectColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn(); this.NameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.ActionColumn = new System.Windows.Forms.DataGridViewButtonColumn(); ((System.ComponentModel.ISupportInitialize)(this.dgvApps)).BeginInit(); this.SuspendLayout(); // // progressBar // this.progressBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(38)))), ((int)(((byte)(38)))), ((int)(((byte)(38))))); this.progressBar.Dock = System.Windows.Forms.DockStyle.Bottom; this.progressBar.Location = new System.Drawing.Point(0, 447); this.progressBar.Maximum = 0; this.progressBar.Name = "progressBar"; this.progressBar.Size = new System.Drawing.Size(835, 10); this.progressBar.TabIndex = 2; this.progressBar.Visible = false; // // btnRemoveSelected // this.btnRemoveSelected.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnRemoveSelected.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnRemoveSelected.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnRemoveSelected.FlatAppearance.BorderSize = 0; this.btnRemoveSelected.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnRemoveSelected.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnRemoveSelected.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnRemoveSelected.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnRemoveSelected.ForeColor = System.Drawing.Color.Black; this.btnRemoveSelected.Location = new System.Drawing.Point(633, 410); this.btnRemoveSelected.Name = "btnRemoveSelected"; this.btnRemoveSelected.Size = new System.Drawing.Size(190, 31); this.btnRemoveSelected.TabIndex = 3; this.btnRemoveSelected.Text = "Remove Selected Apps"; this.btnRemoveSelected.UseCompatibleTextRendering = true; this.btnRemoveSelected.UseVisualStyleBackColor = false; this.btnRemoveSelected.Click += new System.EventHandler(this.btnRemoveSelected_Click); // // btnEdit // this.btnEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnEdit.BackColor = System.Drawing.Color.Transparent; this.btnEdit.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnEdit.FlatAppearance.BorderSize = 2; this.btnEdit.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnEdit.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnEdit.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnEdit.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.btnEdit.ForeColor = System.Drawing.Color.Black; this.btnEdit.Location = new System.Drawing.Point(468, 409); this.btnEdit.Name = "btnEdit"; this.btnEdit.Size = new System.Drawing.Size(145, 32); this.btnEdit.TabIndex = 5; this.btnEdit.Text = "Cleanup Settings"; this.btnEdit.UseCompatibleTextRendering = true; this.btnEdit.UseVisualStyleBackColor = false; this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click); // // lblStatus // this.lblStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblStatus.AutoEllipsis = true; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.lblStatus.ForeColor = System.Drawing.Color.Black; this.lblStatus.Location = new System.Drawing.Point(42, 18); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(781, 76); this.lblStatus.TabIndex = 11; this.lblStatus.Text = "Select the apps you want to uninstall to free up space and improve your system’s " + "performance"; this.lblStatus.UseCompatibleTextRendering = true; // // checkSelectAll // this.checkSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.checkSelectAll.AutoEllipsis = true; this.checkSelectAll.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.checkSelectAll.ForeColor = System.Drawing.Color.Black; this.checkSelectAll.Location = new System.Drawing.Point(42, 385); this.checkSelectAll.Name = "checkSelectAll"; this.checkSelectAll.Size = new System.Drawing.Size(793, 23); this.checkSelectAll.TabIndex = 33; this.checkSelectAll.Text = "I don’t want any of these apps"; this.checkSelectAll.UseVisualStyleBackColor = true; this.checkSelectAll.CheckedChanged += new System.EventHandler(this.checkSelectAll_CheckedChanged); // // profileDropdown // this.profileDropdown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.profileDropdown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(222)))), ((int)(((byte)(218))))); this.profileDropdown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.profileDropdown.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 11.5F, System.Drawing.FontStyle.Bold); this.profileDropdown.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.profileDropdown.FormattingEnabled = true; this.profileDropdown.Location = new System.Drawing.Point(42, 97); this.profileDropdown.Name = "profileDropdown"; this.profileDropdown.Size = new System.Drawing.Size(790, 28); this.profileDropdown.TabIndex = 34; // // dgvApps // this.dgvApps.AllowUserToAddRows = false; this.dgvApps.AllowUserToDeleteRows = false; this.dgvApps.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.dgvApps.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.dgvApps.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.dgvApps.BorderStyle = System.Windows.Forms.BorderStyle.None; this.dgvApps.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; this.dgvApps.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(243)))), ((int)(((byte)(242)))), ((int)(((byte)(230))))); dataGridViewCellStyle1.Font = new System.Drawing.Font("Segoe UI Variable Text", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; this.dgvApps.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; this.dgvApps.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dgvApps.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.SelectColumn, this.NameColumn, this.ActionColumn}); dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI Variable Text", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText; dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; this.dgvApps.DefaultCellStyle = dataGridViewCellStyle2; this.dgvApps.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; this.dgvApps.EnableHeadersVisualStyles = false; this.dgvApps.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.dgvApps.Location = new System.Drawing.Point(42, 131); this.dgvApps.Name = "dgvApps"; this.dgvApps.RowHeadersVisible = false; this.dgvApps.Size = new System.Drawing.Size(776, 248); this.dgvApps.TabIndex = 35; this.dgvApps.TabStop = false; this.dgvApps.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvApps_CellContentClick); // // SelectColumn // this.SelectColumn.FillWeight = 41.63078F; this.SelectColumn.HeaderText = ""; this.SelectColumn.Name = "SelectColumn"; this.SelectColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True; this.SelectColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; // // NameColumn // this.NameColumn.FillWeight = 147.3089F; this.NameColumn.HeaderText = "Name"; this.NameColumn.Name = "NameColumn"; // // ActionColumn // this.ActionColumn.FillWeight = 72.54963F; this.ActionColumn.HeaderText = "Remove"; this.ActionColumn.Name = "ActionColumn"; this.ActionColumn.Text = "Remove"; this.ActionColumn.UseColumnTextForButtonValue = true; // // AppsControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.Controls.Add(this.dgvApps); this.Controls.Add(this.profileDropdown); this.Controls.Add(this.checkSelectAll); this.Controls.Add(this.lblStatus); this.Controls.Add(this.btnEdit); this.Controls.Add(this.btnRemoveSelected); this.Controls.Add(this.progressBar); this.Font = new System.Drawing.Font("Segoe UI Variable Text", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Name = "AppsControlView"; this.Size = new System.Drawing.Size(835, 457); this.Load += new System.EventHandler(this.AppsControlView_Load); ((System.ComponentModel.ISupportInitialize)(this.dgvApps)).EndInit(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.ProgressBar progressBar; private System.Windows.Forms.Button btnRemoveSelected; private System.Windows.Forms.Button btnEdit; private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.CheckBox checkSelectAll; private System.Windows.Forms.ComboBox profileDropdown; private System.Windows.Forms.DataGridView dgvApps; private System.Windows.Forms.DataGridViewCheckBoxColumn SelectColumn; private System.Windows.Forms.DataGridViewTextBoxColumn NameColumn; private System.Windows.Forms.DataGridViewButtonColumn ActionColumn; } } ================================================ FILE: Flyoobe/Views/AppsControlView.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Windows.Foundation; using Windows.Management.Deployment; namespace Flyoobe { public partial class AppsControlView : UserControl, IView, IHasSearch { private Dictionary _appDirectory = new Dictionary(); private string currentSearchTerm = string.Empty; private string activePatternFile = "FlyOOBE_Profile_Full.txt"; public AppsControlView() { InitializeComponent(); } private async void AppsControlView_Load(object sender, EventArgs e) { InitializeProfileDropdown(); await ApplyProfileChange(); } /// /// Initializes the cleanup profile selector. /// private void InitializeProfileDropdown() { profileDropdown.Items.Clear(); profileDropdown.Items.Add("Full Microsoft Experience – everything included"); profileDropdown.Items.Add("Balanced – essentials plus Store (recommended)"); profileDropdown.Items.Add("Minimal Windows – only essentials, zero bloat"); profileDropdown.Items.Add("Community (from GitHub)"); profileDropdown.SelectedIndex = 1; // Default: Balanced profileDropdown.SelectedIndexChanged += async (s, e) => await ApplyProfileChange(); } /// /// Called when the cleanup profile is changed. /// Updates label text, sets pattern file, and reloads the apps. /// private async Task ApplyProfileChange() { string profileName = string.Empty; string baseText = "Select the apps you want to uninstall. Use the dropdown to pick a cleanup profile.\n"; switch (profileDropdown.SelectedIndex) { case 0: // Full activePatternFile = "FlyOOBE_Profile_Full.txt"; profileName = "Full Microsoft Experience – everything included."; break; case 1: // Balanced activePatternFile = "FlyOOBE_Profile_Balanced.txt"; profileName = "Balanced – essentials plus Store (recommended)."; break; case 2: // Minimal activePatternFile = "FlyOOBE_Profile_Minimal.txt"; profileName = "Minimal Windows – only essentials, zero bloat."; break; case 3: // Community await LoadCommunityProfileAsync(); return; } // --- Load apps after profile is set --- await LoadAndDisplayApps(); // --- Update label AFTER apps are loaded --- int count = dgvApps.Rows.Count; lblStatus.Text = $"{baseText}Currently showing: {profileName} Loaded {count} app(s) from profile: {Path.GetFileNameWithoutExtension(activePatternFile)}."; } /// /// Downloads and loads the community cleanup profile from GitHub. /// private async Task LoadCommunityProfileAsync() { string url = "https://raw.githubusercontent.com/builtbybel/Flyoobe/main/assets/Flyoobe_Profile_Community.txt"; string appDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app"); string localPath = Path.Combine(appDir, "Flyoobe_Profile_Community.txt"); try { var result = MessageBox.Show( "Download the Community Cleanup Profile from GitHub?\n\n" + "This profile contains the most commonly removed apps, curated by the community.", "Community Profile", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { Directory.CreateDirectory(appDir); using (var client = new System.Net.WebClient()) await client.DownloadFileTaskAsync(new Uri(url), localPath); activePatternFile = Path.GetFileName(localPath); lblStatus.Text = "Community Profile active – showing common bloatware."; await LoadAndDisplayApps(); } else { lblStatus.Text = "Community Profile not applied."; } } catch (Exception ex) { MessageBox.Show($"⚠️ Failed to load Community Profile:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// /// Loads installed UWP apps and applies filtering based on the selected pattern file. /// private async Task LoadAndDisplayApps() { dgvApps.Rows.Clear(); var (bloatware, whitelist, scanAll) = LoadNativeAppPatterns(); await LoadInstalledAppsAsync(); var filtered = _appDirectory .Where(app => !whitelist.Any(w => app.Key.ToLower().Contains(w)) && (scanAll || bloatware.Any(b => app.Key.ToLower().Contains(b))) && (string.IsNullOrEmpty(currentSearchTerm) || app.Key.ToLower().Contains(currentSearchTerm))) .ToList(); RefreshAppList(filtered); } /// /// Loads all installed UWP apps into internal dictionary. /// private async Task LoadInstalledAppsAsync() { _appDirectory.Clear(); var pm = new PackageManager(); var packages = await Task.Run(() => pm.FindPackagesForUserWithPackageTypes(string.Empty, PackageTypes.Main)); foreach (var p in packages) { string name = p.Id.Name; string fullName = p.Id.FullName; if (!_appDirectory.ContainsKey(name)) _appDirectory[name] = fullName; } } /// /// Updates DataGridView with app name, checkbox and remove button. /// private void RefreshAppList(IEnumerable> apps) { dgvApps.Rows.Clear(); foreach (var app in apps) { int rowIndex = dgvApps.Rows.Add(false, app.Key, "Remove"); dgvApps.Rows[rowIndex].Tag = app.Value; } lblStatus.Text = $"{apps.Count()} apps listed."; } /// /// Reads cleanup patterns from the current profile file. /// private (string[] bloatware, string[] whitelist, bool scanAll) LoadNativeAppPatterns() { var bloatware = new List(); var whitelist = new List(); bool scanAll = false; string path = GetActivePatternFilePath(activePatternFile); if (string.IsNullOrEmpty(path) || !File.Exists(path)) return (Array.Empty(), Array.Empty(), false); foreach (var rawLine in File.ReadLines(path)) { string line = rawLine.Split('#')[0].Trim(); if (string.IsNullOrWhiteSpace(line)) continue; if (line == "*" || line == "*.*") { scanAll = true; continue; } if (line.StartsWith("!")) whitelist.Add(line.Substring(1).Trim().ToLowerInvariant()); else bloatware.Add(line.ToLowerInvariant()); } return (bloatware.ToArray(), whitelist.ToArray(), scanAll); } /// /// Gets the path to the selected profile pattern file inside /app directory. /// private string GetActivePatternFilePath(string fileName, bool ensureExists = false) { string baseDir = AppDomain.CurrentDomain.BaseDirectory; string appDir = Path.Combine(baseDir, "app"); string path = Path.Combine(appDir, fileName); if (ensureExists && !File.Exists(path)) { Directory.CreateDirectory(appDir); File.WriteAllText(path, "# Add your app detection patterns here\n"); } return path; } /// /// Handles clicks on the "Remove" button inside the DataGridView. /// Immediately removes the selected app and refreshes the list afterward. /// private async void dgvApps_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; // Check if "Remove" button column was clicked if (dgvApps.Columns[e.ColumnIndex].Name == "ActionColumn") { var row = dgvApps.Rows[e.RowIndex]; string appName = row.Cells["NameColumn"].Value?.ToString(); string fullName = row.Tag?.ToString(); if (string.IsNullOrEmpty(fullName)) return; // Start removal lblStatus.Text = $"Removing {appName}..."; bool success = await UninstallAppAsync(fullName); // Update status text lblStatus.Text = success ? $"{appName} successfully removed." : $"Failed to remove {appName}."; // Automatically refresh list after removal await LoadAndDisplayApps(); } } /// /// Uninstalls an app by its full package name. /// private async Task UninstallAppAsync(string fullName) { try { var pm = new PackageManager(); var operation = pm.RemovePackageAsync(fullName); var resetEvent = new ManualResetEvent(false); operation.Completed = (o, s) => resetEvent.Set(); await Task.Run(() => resetEvent.WaitOne()); return operation.Status == AsyncStatus.Completed; } catch (Exception ex) { MessageBox.Show($"Error uninstalling:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } } private async void btnRemoveSelected_Click(object sender, EventArgs e) { var selected = dgvApps.Rows .Cast() .Where(r => Convert.ToBoolean(r.Cells["SelectColumn"].Value)) .ToList(); if (selected.Count == 0) { MessageBox.Show("Please select at least one app.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } progressBar.Visible = true; progressBar.Maximum = selected.Count; progressBar.Value = 0; progressBar.Step = 1; // one step per removed app foreach (var row in selected) { string appName = row.Cells["NameColumn"].Value.ToString(); string fullName = row.Tag.ToString(); lblStatus.Text = $"Removing {appName}..."; bool success = await UninstallAppAsync(fullName); progressBar.PerformStep(); if (!success) lblStatus.Text = $"Failed to remove {appName}"; else lblStatus.Text = $"Removed {appName}"; await Task.Delay(150); } progressBar.Visible = false; lblStatus.Text = "Batch removal completed."; await LoadAndDisplayApps(); } /// /// Applies global search input. /// public void OnGlobalSearchChanged(string text) { currentSearchTerm = (text ?? "").Trim().ToLower(); _ = LoadAndDisplayApps(); } /// /// Reloads the current view with the selected profile. /// public async void RefreshView() { currentSearchTerm = string.Empty; await ApplyProfileChange(); lblStatus.Text = "Ready."; } /// /// Selects or deselects all apps in the DataGridView when the master checkbox is toggled. /// private void checkSelectAll_CheckedChanged(object sender, EventArgs e) { bool checkAll = checkSelectAll.Checked; foreach (DataGridViewRow row in dgvApps.Rows) { if (row.Cells["SelectColumn"] is DataGridViewCheckBoxCell checkCell) { checkCell.Value = checkAll; } } } private void btnEdit_Click(object sender, EventArgs e) { try { string filePath = GetActivePatternFilePath(activePatternFile, ensureExists: true); Process.Start("notepad.exe", filePath); } catch (Exception ex) { MessageBox.Show($"Error opening profile file:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } ================================================ FILE: Flyoobe/Views/AppsControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True True True ================================================ FILE: Flyoobe/Views/DefaultsControlView.Designer.cs ================================================ namespace Flyoobe { partial class DefaultsControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.panel1 = new System.Windows.Forms.Panel(); this.lblStatus = new System.Windows.Forms.Label(); this.comboBrowsers = new System.Windows.Forms.ComboBox(); this.btnSetDefaultBrowser = new System.Windows.Forms.Button(); this.checkNeedOtherBrowser = new System.Windows.Forms.CheckBox(); this.comboDownload = new System.Windows.Forms.ComboBox(); this.panelDownload = new System.Windows.Forms.Panel(); this.checkRunAsAdmin = new System.Windows.Forms.CheckBox(); this.btnInstall = new System.Windows.Forms.Button(); this.lblHeader = new System.Windows.Forms.Label(); this.panel1.SuspendLayout(); this.panelDownload.SuspendLayout(); this.SuspendLayout(); // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel1.AutoScroll = true; this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.panel1.Controls.Add(this.lblStatus); this.panel1.Controls.Add(this.comboBrowsers); this.panel1.Controls.Add(this.btnSetDefaultBrowser); this.panel1.Location = new System.Drawing.Point(23, 38); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(795, 383); this.panel1.TabIndex = 35; // // lblStatus // this.lblStatus.AutoSize = true; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.lblStatus.ForeColor = System.Drawing.Color.Black; this.lblStatus.Location = new System.Drawing.Point(30, 28); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(90, 23); this.lblStatus.TabIndex = 35; this.lblStatus.Text = "Set as default"; this.lblStatus.UseCompatibleTextRendering = true; // // comboBrowsers // this.comboBrowsers.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.comboBrowsers.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(222)))), ((int)(((byte)(218))))); this.comboBrowsers.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboBrowsers.FlatStyle = System.Windows.Forms.FlatStyle.System; this.comboBrowsers.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 11.5F, System.Drawing.FontStyle.Bold); this.comboBrowsers.ForeColor = System.Drawing.Color.Black; this.comboBrowsers.FormattingEnabled = true; this.comboBrowsers.Location = new System.Drawing.Point(34, 64); this.comboBrowsers.Name = "comboBrowsers"; this.comboBrowsers.Size = new System.Drawing.Size(728, 28); this.comboBrowsers.TabIndex = 34; this.comboBrowsers.TabStop = false; // // btnSetDefaultBrowser // this.btnSetDefaultBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnSetDefaultBrowser.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnSetDefaultBrowser.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnSetDefaultBrowser.FlatAppearance.BorderSize = 0; this.btnSetDefaultBrowser.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnSetDefaultBrowser.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnSetDefaultBrowser.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnSetDefaultBrowser.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnSetDefaultBrowser.ForeColor = System.Drawing.Color.Black; this.btnSetDefaultBrowser.Location = new System.Drawing.Point(561, 333); this.btnSetDefaultBrowser.Name = "btnSetDefaultBrowser"; this.btnSetDefaultBrowser.Size = new System.Drawing.Size(231, 35); this.btnSetDefaultBrowser.TabIndex = 31; this.btnSetDefaultBrowser.Text = "Set default Browser"; this.btnSetDefaultBrowser.UseCompatibleTextRendering = true; this.btnSetDefaultBrowser.UseVisualStyleBackColor = false; this.btnSetDefaultBrowser.Click += new System.EventHandler(this.btnSetDefaultBrowser_Click); // // checkNeedOtherBrowser // this.checkNeedOtherBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.checkNeedOtherBrowser.AutoEllipsis = true; this.checkNeedOtherBrowser.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.checkNeedOtherBrowser.ForeColor = System.Drawing.Color.Black; this.checkNeedOtherBrowser.Location = new System.Drawing.Point(23, 427); this.checkNeedOtherBrowser.Name = "checkNeedOtherBrowser"; this.checkNeedOtherBrowser.Size = new System.Drawing.Size(768, 27); this.checkNeedOtherBrowser.TabIndex = 38; this.checkNeedOtherBrowser.Text = "I need a browser other than Edge"; this.checkNeedOtherBrowser.UseCompatibleTextRendering = true; this.checkNeedOtherBrowser.UseVisualStyleBackColor = true; this.checkNeedOtherBrowser.CheckedChanged += new System.EventHandler(this.checkNeedOtherBrowser_CheckedChanged); // // comboDownload // this.comboDownload.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.comboDownload.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(222)))), ((int)(((byte)(218))))); this.comboDownload.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboDownload.FlatStyle = System.Windows.Forms.FlatStyle.System; this.comboDownload.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 11.5F, System.Drawing.FontStyle.Bold); this.comboDownload.ForeColor = System.Drawing.Color.Black; this.comboDownload.FormattingEnabled = true; this.comboDownload.Location = new System.Drawing.Point(34, 64); this.comboDownload.Name = "comboDownload"; this.comboDownload.Size = new System.Drawing.Size(728, 28); this.comboDownload.TabIndex = 36; this.comboDownload.TabStop = false; // // panelDownload // this.panelDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelDownload.AutoScroll = true; this.panelDownload.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.panelDownload.Controls.Add(this.checkRunAsAdmin); this.panelDownload.Controls.Add(this.btnInstall); this.panelDownload.Controls.Add(this.lblHeader); this.panelDownload.Controls.Add(this.comboDownload); this.panelDownload.Location = new System.Drawing.Point(23, 38); this.panelDownload.Name = "panelDownload"; this.panelDownload.Size = new System.Drawing.Size(795, 383); this.panelDownload.TabIndex = 39; this.panelDownload.Visible = false; // // checkRunAsAdmin // this.checkRunAsAdmin.AutoEllipsis = true; this.checkRunAsAdmin.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.checkRunAsAdmin.ForeColor = System.Drawing.Color.Black; this.checkRunAsAdmin.Location = new System.Drawing.Point(34, 95); this.checkRunAsAdmin.Name = "checkRunAsAdmin"; this.checkRunAsAdmin.Size = new System.Drawing.Size(320, 27); this.checkRunAsAdmin.TabIndex = 39; this.checkRunAsAdmin.Text = "Run as Admin"; this.checkRunAsAdmin.UseCompatibleTextRendering = true; this.checkRunAsAdmin.UseVisualStyleBackColor = true; // // btnInstall // this.btnInstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnInstall.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnInstall.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnInstall.FlatAppearance.BorderSize = 0; this.btnInstall.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnInstall.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnInstall.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnInstall.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnInstall.ForeColor = System.Drawing.Color.Black; this.btnInstall.Location = new System.Drawing.Point(561, 333); this.btnInstall.Name = "btnInstall"; this.btnInstall.Size = new System.Drawing.Size(231, 35); this.btnInstall.TabIndex = 38; this.btnInstall.Text = "Install Browser"; this.btnInstall.UseCompatibleTextRendering = true; this.btnInstall.UseVisualStyleBackColor = false; this.btnInstall.Click += new System.EventHandler(this.btnInstall_Click); // // lblHeader // this.lblHeader.AutoSize = true; this.lblHeader.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.lblHeader.ForeColor = System.Drawing.Color.Black; this.lblHeader.Location = new System.Drawing.Point(30, 28); this.lblHeader.Name = "lblHeader"; this.lblHeader.Size = new System.Drawing.Size(125, 23); this.lblHeader.TabIndex = 37; this.lblHeader.Text = "Download browser"; this.lblHeader.UseCompatibleTextRendering = true; // // DefaultsControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.Controls.Add(this.checkNeedOtherBrowser); this.Controls.Add(this.panelDownload); this.Controls.Add(this.panel1); this.Name = "DefaultsControlView"; this.Size = new System.Drawing.Size(835, 457); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.panelDownload.ResumeLayout(false); this.panelDownload.PerformLayout(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.ComboBox comboBrowsers; private System.Windows.Forms.Button btnSetDefaultBrowser; private System.Windows.Forms.CheckBox checkNeedOtherBrowser; private System.Windows.Forms.ComboBox comboDownload; private System.Windows.Forms.Panel panelDownload; private System.Windows.Forms.Button btnInstall; private System.Windows.Forms.Label lblHeader; private System.Windows.Forms.CheckBox checkRunAsAdmin; } } ================================================ FILE: Flyoobe/Views/DefaultsControlView.cs ================================================ using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { public partial class DefaultsControlView : UserControl, IView { // winget IDs for common browsers private readonly Dictionary WingetIds = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "Google Chrome", "Google.Chrome" }, { "Mozilla Firefox", "Mozilla.Firefox" }, { "Brave", "Brave.Brave" }, { "Opera", "Opera.Opera" }, { "Vivaldi", "Vivaldi.Vivaldi" }, { "Zen Browser", "Zen-Team.Zen-Browser" } }; public DefaultsControlView() { InitializeComponent(); LoadRegisteredBrowsers(); if (comboDownload != null) { comboDownload.Items.Clear(); comboDownload.Items.AddRange(new object[] { "Google Chrome", "Mozilla Firefox", "Brave", "Opera", "Vivaldi", "Zen Browser" }); comboDownload.SelectedIndex = 0; } if (panelDownload != null) panelDownload.Visible = false; } /// /// Load installed browsers from registry and populate the comboBrowsers dropdown. /// private void LoadRegisteredBrowsers() { comboBrowsers.Items.Clear(); using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\RegisteredApplications")) { if (key != null) { foreach (var appName in key.GetValueNames()) { string display = MapBrowserName(appName); if (!string.IsNullOrEmpty(display)) comboBrowsers.Items.Add(new ComboItem(display, appName)); } } } if (comboBrowsers.Items.Count == 0) comboBrowsers.Items.Add(new ComboItem("Microsoft Edge", "Microsoft Edge")); comboBrowsers.DropDownStyle = ComboBoxStyle.DropDownList; comboBrowsers.SelectedIndex = 0; } /// /// Map raw registry application name to a friendly browser name. /// private string MapBrowserName(string appName) { var lower = appName.ToLower(); if (appName.Equals("Microsoft Edge", StringComparison.OrdinalIgnoreCase)) return "Microsoft Edge"; if (appName.Equals("Google Chrome", StringComparison.OrdinalIgnoreCase)) return "Google Chrome"; if (lower.Contains("brave")) return "Brave"; if (lower.Contains("opera")) return "Opera"; if (lower.Contains("vivaldi")) return "Vivaldi"; if (appName.StartsWith("Firefox-", StringComparison.OrdinalIgnoreCase)) { if (appName.Contains("308046B0AF4A39CB")) return "Mozilla Firefox"; if (appName.Contains("F0DC299D809B9700")) return "Zen Browser"; return "Firefox (variant)"; } return null; } /// /// Opens Windows Settings for the selected browser. /// private async void btnSetDefaultBrowser_Click(object sender, EventArgs e) { if (comboBrowsers.SelectedItem is ComboItem item) { string realAppName = item.Value; // Give feedback immediately lblStatus.Text = "Opening Settings, please wait..."; btnSetDefaultBrowser.Enabled = false; try { Process.Start("ms-settings:defaultapps?registeredAppMachine=" + Uri.EscapeDataString(realAppName)); } catch { Process.Start("ms-settings:defaultapps"); } // Small delay before resetting UI await Task.Delay(3000); lblStatus.Text = "Choose default browser"; btnSetDefaultBrowser.Enabled = true; } } public void RefreshView() { LoadRegisteredBrowsers(); } /// /// Helper to run winget with optional elevation. /// private void RunWinget(string args, bool elevate = false) { try { var psi = new ProcessStartInfo { FileName = "winget", Arguments = args, UseShellExecute = true }; if (elevate) psi.Verb = "runas"; Process.Start(psi); } catch (Exception ex) { MessageBox.Show("Could not start winget: " + ex.Message); } } private static string Quote(string s) => "\"" + s.Replace("\"", "\"\"") + "\""; /// /// Handles the Install button click. /// Uses winget to install the selected browser and gives simple feedback. /// private async void btnInstall_Click(object sender, EventArgs e) { if (comboDownload?.SelectedItem == null) return; string name = comboDownload.SelectedItem.ToString(); string id; if (!WingetIds.TryGetValue(name, out id)) { // If browser is not in our known WingetIds, just run a search RunWinget("search " + Quote(name)); return; } lblHeader.Text = $"Installing {name} via winget..."; btnInstall.Enabled = false; // Start the installation RunWinget($"install --id {id} -e --silent", elevate: checkRunAsAdmin != null && checkRunAsAdmin.Checked); // cosmetic feedback only await Task.Delay(4000); lblHeader.Text = "Choose your browser"; btnInstall.Enabled = true; } /// /// Show or hide the download panel when checkbox is toggled. /// private void checkNeedOtherBrowser_CheckedChanged(object sender, EventArgs e) { if (panelDownload != null) panelDownload.Visible = checkNeedOtherBrowser.Checked; } /// /// Helper class for ComboBox items (display vs. real value). /// private class ComboItem { public string Text { get; } public string Value { get; } public ComboItem(string text, string value) { Text = text; Value = value; } public override string ToString() => Text; } } } ================================================ FILE: Flyoobe/Views/DefaultsControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/DeviceControlView.Designer.cs ================================================ namespace Flyoobe { partial class DeviceControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.cmbLanguage = new System.Windows.Forms.ComboBox(); this.btnApply = new System.Windows.Forms.Button(); this.textUsername = new System.Windows.Forms.TextBox(); this.textComputername = new System.Windows.Forms.TextBox(); this.toolTip = new System.Windows.Forms.ToolTip(this.components); this.panel1 = new System.Windows.Forms.Panel(); this.btnJoinDomain = new System.Windows.Forms.Button(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // cmbLanguage // this.cmbLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.cmbLanguage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.cmbLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbLanguage.FlatStyle = System.Windows.Forms.FlatStyle.System; this.cmbLanguage.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.cmbLanguage.ForeColor = System.Drawing.Color.Black; this.cmbLanguage.FormattingEnabled = true; this.cmbLanguage.Location = new System.Drawing.Point(28, 114); this.cmbLanguage.Name = "cmbLanguage"; this.cmbLanguage.Size = new System.Drawing.Size(712, 29); this.cmbLanguage.TabIndex = 9; this.cmbLanguage.TabStop = false; // // btnApply // this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnApply.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnApply.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnApply.FlatAppearance.BorderSize = 0; this.btnApply.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnApply.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnApply.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnApply.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnApply.ForeColor = System.Drawing.Color.Black; this.btnApply.Location = new System.Drawing.Point(632, 165); this.btnApply.Name = "btnApply"; this.btnApply.Size = new System.Drawing.Size(108, 31); this.btnApply.TabIndex = 19; this.btnApply.TabStop = false; this.btnApply.Text = "Apply"; this.btnApply.UseCompatibleTextRendering = true; this.btnApply.UseVisualStyleBackColor = false; this.btnApply.Click += new System.EventHandler(this.btnApply_Click); // // textUsername // this.textUsername.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.textUsername.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.5F); this.textUsername.ForeColor = System.Drawing.Color.Black; this.textUsername.Location = new System.Drawing.Point(28, 30); this.textUsername.Name = "textUsername"; this.textUsername.Size = new System.Drawing.Size(712, 26); this.textUsername.TabIndex = 20; this.textUsername.TabStop = false; this.textUsername.Text = "Name"; this.toolTip.SetToolTip(this.textUsername, "Set or rename User"); // // textComputername // this.textComputername.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.textComputername.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.5F); this.textComputername.ForeColor = System.Drawing.Color.Black; this.textComputername.Location = new System.Drawing.Point(28, 72); this.textComputername.Name = "textComputername"; this.textComputername.Size = new System.Drawing.Size(712, 26); this.textComputername.TabIndex = 22; this.textComputername.TabStop = false; this.textComputername.Text = "Computer Name"; this.toolTip.SetToolTip(this.textComputername, "Set or rename Computer"); // // toolTip // this.toolTip.IsBalloon = true; // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.panel1.Controls.Add(this.btnJoinDomain); this.panel1.Controls.Add(this.textComputername); this.panel1.Controls.Add(this.cmbLanguage); this.panel1.Controls.Add(this.btnApply); this.panel1.Controls.Add(this.textUsername); this.panel1.Location = new System.Drawing.Point(30, 75); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(771, 361); this.panel1.TabIndex = 23; // // btnJoinDomain // this.btnJoinDomain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnJoinDomain.AutoSize = true; this.btnJoinDomain.Cursor = System.Windows.Forms.Cursors.Hand; this.btnJoinDomain.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.btnJoinDomain.FlatAppearance.BorderSize = 0; this.btnJoinDomain.FlatAppearance.MouseDownBackColor = System.Drawing.Color.WhiteSmoke; this.btnJoinDomain.FlatAppearance.MouseOverBackColor = System.Drawing.Color.WhiteSmoke; this.btnJoinDomain.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnJoinDomain.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btnJoinDomain.ForeColor = System.Drawing.Color.Black; this.btnJoinDomain.Location = new System.Drawing.Point(29, 319); this.btnJoinDomain.Name = "btnJoinDomain"; this.btnJoinDomain.Size = new System.Drawing.Size(93, 29); this.btnJoinDomain.TabIndex = 23; this.btnJoinDomain.Text = "Join Domain"; this.btnJoinDomain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnJoinDomain.UseVisualStyleBackColor = true; this.btnJoinDomain.Click += new System.EventHandler(this.btnJoinDomain_Click); // // DeviceControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.Controls.Add(this.panel1); this.Name = "DeviceControlView"; this.Size = new System.Drawing.Size(835, 457); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.ComboBox cmbLanguage; private System.Windows.Forms.Button btnApply; private System.Windows.Forms.TextBox textUsername; private System.Windows.Forms.TextBox textComputername; private System.Windows.Forms.ToolTip toolTip; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Button btnJoinDomain; } } ================================================ FILE: Flyoobe/Views/DeviceControlView.cs ================================================ using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; namespace Flyoobe { public partial class DeviceControlView : UserControl, IView { private const string PlaceholderText = "System display language"; public DeviceControlView() { InitializeComponent(); InitializeQuickTools(); LoadCurrentNames(); LoadAvailableLanguages(); } /// /// Adds quick access tools to the bottom of the view. /// private void InitializeQuickTools() { FlowLayoutPanel quickToolsPanel = new FlowLayoutPanel { FlowDirection = FlowDirection.LeftToRight, Dock = DockStyle.Bottom, Padding = new Padding(10), AutoSize = true, }; AddQuickTool(quickToolsPanel, "Display Options", "ms-settings:display"); AddQuickTool(quickToolsPanel, "Accessibility", "ms-settings:easeofaccess"); AddQuickTool(quickToolsPanel, "System Info", "msinfo32"); AddQuickTool(quickToolsPanel, "CMD", "cmd.exe"); AddQuickTool(quickToolsPanel, "PowerShell", "powershell.exe"); AddQuickTool(quickToolsPanel, "Magnifier", "magnify.exe"); AddQuickTool(quickToolsPanel, "On-Screen Keyboard", "osk.exe"); AddQuickTool(quickToolsPanel, "Notepad", "notepad.exe"); this.Controls.Add(quickToolsPanel); } private void AddQuickTool(FlowLayoutPanel panel, string text, string command) { var button = new Button { Text = text, AutoSize = true, Margin = new Padding(5), FlatStyle = FlatStyle.System, Font = new Font("Segoe UI Variable Display", 8.25F), }; button.Click += (s, e) => Process.Start(command); panel.Controls.Add(button); } private void LoadCurrentNames() { textUsername.Text = Environment.UserName; textComputername.Text = Environment.MachineName; } /// /// Loads available languages from the registry and populates the language selection combo box. /// private void LoadAvailableLanguages() { List languages = GetAvailableLanguagesFromRegistry(); cmbLanguage.Items.Clear(); cmbLanguage.Items.Add(PlaceholderText); // Add placeholder first foreach (var lang in languages) { cmbLanguage.Items.Add(lang); } cmbLanguage.SelectedIndex = 0; } /// /// Retrieves available languages from the Windows registry. /// /// private List GetAvailableLanguagesFromRegistry() { var languages = new List(); try { using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\MUI\UILanguages")) { if (key != null) { languages.AddRange(key.GetSubKeyNames()); } } } catch (Exception ex) { MessageBox.Show("Error reading languages from registry: " + ex.Message); } return languages; } private void btnApply_Click(object sender, EventArgs e) { string newUserName = textUsername.Text.Trim(); string newComputerName = textComputername.Text.Trim(); string selectedLanguage = cmbLanguage.SelectedIndex > 0 ? cmbLanguage.SelectedItem.ToString() : null; bool changesMade = false; // Rename Computer if (!string.IsNullOrEmpty(newComputerName) && newComputerName != Environment.MachineName) { try { RenameComputer(newComputerName); changesMade = true; } catch (Exception ex) { MessageBox.Show("Failed to rename computer: " + ex.Message); } } // Rename User if (!string.IsNullOrEmpty(newUserName) && newUserName != Environment.UserName) { try { RenameLocalUser(Environment.UserName, newUserName); changesMade = true; } catch (Exception ex) { MessageBox.Show("Failed to rename user: " + ex.Message); } } // Change Language if (!string.IsNullOrEmpty(selectedLanguage)) { try { ChangeLanguage(selectedLanguage); changesMade = true; } catch (Exception ex) { MessageBox.Show("Failed to change language: " + ex.Message); } } if (changesMade) { DialogResult result = MessageBox.Show( "Changes applied successfully.\nDo you want to restart now to apply them?\n\nClick Yes to restart, No to just sign out.", "Apply Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (result == DialogResult.Yes) { RestartComputer(); } else if (result == DialogResult.No) { LogOffUser(); } } else { MessageBox.Show($"No changes detected, {textUsername.Text}. Looks like everything is just the way you like it! 😎", "Info"); } } private void ChangeLanguage(string language) { string psCommand = $@" Set-WinUILanguageOverride -Language {language}; Set-WinUserLanguageList -LanguageList {language} -Force; Set-Culture {language}; Set-WinSystemLocale {language}; "; RunPowerShell(psCommand); } // Restart the computer programmatically private void RestartComputer() { try { Process.Start(new ProcessStartInfo { FileName = "shutdown", Arguments = "/r /t 0", CreateNoWindow = true, UseShellExecute = false }); } catch (Exception ex) { MessageBox.Show("Error restarting computer: " + ex.Message); } } // Log off the current user programmatically private void LogOffUser() { try { Process.Start("shutdown", "/l"); } catch (Exception ex) { MessageBox.Show("Error logging off: " + ex.Message); } } private void RenameComputer(string newName) { string psScript = $"Rename-Computer -NewName \"{newName}\" -Force -PassThru"; RunPowerShell(psScript); } private void RenameLocalUser(string currentName, string newName) { string psScript = $"Rename-LocalUser -Name \"{currentName}\" -NewName \"{newName}\""; RunPowerShell(psScript); } /// /// Runs a PowerShell command with elevated privileges. /// /// private void RunPowerShell(string command) { try { Process.Start(new ProcessStartInfo { FileName = "powershell.exe", Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"{command}\"", Verb = "runas", // always run as admin UseShellExecute = true }); } catch (Exception ex) { MessageBox.Show("Error running PowerShell: " + ex.Message); } } public void RefreshView() { LoadCurrentNames(); LoadAvailableLanguages(); } private void btnJoinDomain_Click(object sender, EventArgs e) { Process.Start("SystemPropertiesComputerName.exe"); } } } ================================================ FILE: Flyoobe/Views/DeviceControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 17, 17 ================================================ FILE: Flyoobe/Views/ExperienceControlView.Designer.cs ================================================ namespace Flyoobe { partial class ExperienceControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.comboCategories = new System.Windows.Forms.ComboBox(); this.listSettings = new System.Windows.Forms.CheckedListBox(); this.btnApply = new System.Windows.Forms.Button(); this.textHelp = new System.Windows.Forms.TextBox(); this.btnMoreInfo = new System.Windows.Forms.Button(); this.btnToggleAll = new System.Windows.Forms.Button(); this.SuspendLayout(); // // comboCategories // this.comboCategories.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.comboCategories.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(222)))), ((int)(((byte)(218))))); this.comboCategories.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboCategories.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 11.5F, System.Drawing.FontStyle.Bold); this.comboCategories.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.comboCategories.FormattingEnabled = true; this.comboCategories.Location = new System.Drawing.Point(32, 27); this.comboCategories.Name = "comboCategories"; this.comboCategories.Size = new System.Drawing.Size(800, 28); this.comboCategories.TabIndex = 0; this.comboCategories.SelectedIndexChanged += new System.EventHandler(this.comboCategories_SelectedIndexChanged); // // listSettings // this.listSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.listSettings.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.listSettings.BorderStyle = System.Windows.Forms.BorderStyle.None; this.listSettings.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.5F); this.listSettings.ForeColor = System.Drawing.Color.Black; this.listSettings.FormattingEnabled = true; this.listSettings.Location = new System.Drawing.Point(319, 73); this.listSettings.Name = "listSettings"; this.listSettings.Size = new System.Drawing.Size(513, 315); this.listSettings.TabIndex = 1; this.listSettings.UseCompatibleTextRendering = true; this.listSettings.SelectedIndexChanged += new System.EventHandler(this.listTweaks_SelectedIndexChanged); // // btnApply // this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnApply.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnApply.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnApply.FlatAppearance.BorderSize = 0; this.btnApply.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnApply.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnApply.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnApply.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnApply.ForeColor = System.Drawing.Color.Black; this.btnApply.Location = new System.Drawing.Point(663, 410); this.btnApply.Name = "btnApply"; this.btnApply.Size = new System.Drawing.Size(160, 31); this.btnApply.TabIndex = 9; this.btnApply.Text = "Apply"; this.btnApply.UseCompatibleTextRendering = true; this.btnApply.UseVisualStyleBackColor = false; this.btnApply.Click += new System.EventHandler(this.btnApply_Click); // // textHelp // this.textHelp.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.textHelp.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.textHelp.BorderStyle = System.Windows.Forms.BorderStyle.None; this.textHelp.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.5F); this.textHelp.ForeColor = System.Drawing.Color.Black; this.textHelp.Location = new System.Drawing.Point(32, 71); this.textHelp.Multiline = true; this.textHelp.Name = "textHelp"; this.textHelp.Size = new System.Drawing.Size(277, 317); this.textHelp.TabIndex = 11; this.textHelp.Text = "Manage your privacy settings and customize your device to fit your preferences. C" + "ontrol what data you share and adjust Windows for the best experience."; // // btnMoreInfo // this.btnMoreInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnMoreInfo.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(243)))), ((int)(((byte)(242)))), ((int)(((byte)(230))))); this.btnMoreInfo.Cursor = System.Windows.Forms.Cursors.Hand; this.btnMoreInfo.FlatAppearance.BorderSize = 0; this.btnMoreInfo.FlatAppearance.MouseDownBackColor = System.Drawing.Color.WhiteSmoke; this.btnMoreInfo.FlatAppearance.MouseOverBackColor = System.Drawing.Color.WhiteSmoke; this.btnMoreInfo.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnMoreInfo.Font = new System.Drawing.Font("Segoe UI Variable Display Semil", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btnMoreInfo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.btnMoreInfo.Location = new System.Drawing.Point(680, 0); this.btnMoreInfo.Name = "btnMoreInfo"; this.btnMoreInfo.Size = new System.Drawing.Size(143, 23); this.btnMoreInfo.TabIndex = 14; this.btnMoreInfo.Text = "Powered by CrapFixer"; this.btnMoreInfo.UseVisualStyleBackColor = false; this.btnMoreInfo.Click += new System.EventHandler(this.btnMoreInfo_Click); // // btnToggleAll // this.btnToggleAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnToggleAll.BackColor = System.Drawing.Color.Transparent; this.btnToggleAll.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnToggleAll.FlatAppearance.BorderSize = 2; this.btnToggleAll.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnToggleAll.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnToggleAll.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnToggleAll.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.btnToggleAll.ForeColor = System.Drawing.Color.Black; this.btnToggleAll.Location = new System.Drawing.Point(486, 410); this.btnToggleAll.Name = "btnToggleAll"; this.btnToggleAll.Size = new System.Drawing.Size(160, 31); this.btnToggleAll.TabIndex = 15; this.btnToggleAll.Text = "Toggle All"; this.btnToggleAll.UseCompatibleTextRendering = true; this.btnToggleAll.UseVisualStyleBackColor = false; this.btnToggleAll.Click += new System.EventHandler(this.btnToggleAll_Click); // // ExperienceControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.btnToggleAll); this.Controls.Add(this.btnMoreInfo); this.Controls.Add(this.textHelp); this.Controls.Add(this.btnApply); this.Controls.Add(this.listSettings); this.Controls.Add(this.comboCategories); this.Name = "ExperienceControlView"; this.Size = new System.Drawing.Size(835, 457); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.ComboBox comboCategories; private System.Windows.Forms.CheckedListBox listSettings; private System.Windows.Forms.Button btnApply; private System.Windows.Forms.TextBox textHelp; private System.Windows.Forms.Button btnMoreInfo; private System.Windows.Forms.Button btnToggleAll; } } ================================================ FILE: Flyoobe/Views/ExperienceControlView.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { public partial class ExperienceControlView : UserControl, IView { private readonly FeatureManager _featureManager; private List _currentTweaks; public ExperienceControlView() { InitializeComponent(); _featureManager = new FeatureManager(); // Load categories when control is loaded Load += (_, __) => InitializeView(); } /// /// Initializes the category dropdown. /// private void InitializeView() { comboCategories.Items.Clear(); comboCategories.Items.Add("Let's configure your device"); comboCategories.Items.Add("Use quick settings (Recommended)"); comboCategories.Items.AddRange(_featureManager.GetCategories().ToArray()); // if (comboCategories.Items.Count > 0) // comboCategories.SelectedIndex = 0; //Triggers category load comboCategories.SelectedIndex = 0; } /// /// Loads tweak list when category changes. /// private async void comboCategories_SelectedIndexChanged(object sender, EventArgs e) { if (comboCategories.SelectedIndex <= 0) // Prevent loading if "Select Category" is selected { listSettings.Items.Clear(); return; } string category = comboCategories.SelectedItem?.ToString(); if (!string.IsNullOrEmpty(category)) { await LoadTweaksForCategory(category); } } /// /// Loads tweak nodes and their current state for the selected category. /// private async Task LoadTweaksForCategory(string category) { listSettings.Items.Clear(); if (category == "Use quick settings (Recommended)") { _currentTweaks = _featureManager.GetAllRecommendedFeatures(); } else { _currentTweaks = _featureManager.GetFeaturesByCategory(category); } foreach (var tweak in _currentTweaks) { bool isEnabled = await _featureManager.IsEnabled(tweak); listSettings.Items.Add(tweak, isEnabled); } if (_currentTweaks.Count > 0) listSettings.SelectedIndex = 0; // Select first tweak to show info else UpdateUiContextForNoneSelected(); } /// /// Displays tweak information and reflects state in the shared UI. /// private void listTweaks_SelectedIndexChanged(object sender, EventArgs e) { int index = listSettings.SelectedIndex; if (index < 0 || index >= _currentTweaks.Count) { UpdateUiContextForNoneSelected(); return; } var node = _currentTweaks[index]; var feature = node.Feature; // Update UI textHelp.Text = $"{feature.Info()}\r\n\r\nDetails:\r\n{feature.GetFeatureDetails()}\r\n\r\n{feature.SupportedOS()}"; } /// /// Applies or undoes tweaks based on checkbox state. /// private async void btnApply_Click(object sender, EventArgs e) { var appliedTweaks = new List(); for (int i = 0; i < listSettings.Items.Count; i++) { var node = _currentTweaks[i]; bool shouldEnable = listSettings.GetItemChecked(i); bool isCurrentlyEnabled = await _featureManager.IsEnabled(node); if (shouldEnable && !isCurrentlyEnabled) { if (await _featureManager.ApplyFeature(node)) appliedTweaks.Add($"✔ Applied: {node.Feature.ID()}"); else MessageBox.Show($"Failed to apply: {node.Feature.ID()}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (!shouldEnable && isCurrentlyEnabled) { if (_featureManager.UndoFeature(node)) appliedTweaks.Add($"✖ Reverted: {node.Feature.ID()}"); else MessageBox.Show($"Failed to undo: {node.Feature.ID()}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } // Show applied tweaks or fallback message textHelp.Text = appliedTweaks.Count > 0 ? string.Join(Environment.NewLine, appliedTweaks) : "No changes were made."; //await ReloadCurrentCategory(); // Refresh the list to reflect changes } /// /// Refreshes checkbox states after apply/undo operations. /// private async Task ReloadCurrentCategory() { for (int i = 0; i < _currentTweaks.Count; i++) { var node = _currentTweaks[i]; bool isEnabled = await _featureManager.IsEnabled(node); listSettings.SetItemChecked(i, isEnabled); } if (_currentTweaks.Count > 0) { listSettings.SelectedIndex = 0; } else { UpdateUiContextForNoneSelected(); } } /// /// Toggles all items in the list between checked and unchecked. /// private void btnToggleAll_Click(object sender, EventArgs e) { // Determine if we should check or uncheck all items bool checkAll = false; for (int i = 0; i < listSettings.Items.Count; i++) { if (!listSettings.GetItemChecked(i)) { checkAll = true; break; // As soon as one is unchecked, we'll check all } } // Apply the determined state to all items for (int i = 0; i < listSettings.Items.Count; i++) { listSettings.SetItemChecked(i, checkAll); } // Update the help text to reflect the action taken string action = checkAll ? "All features have been selected." : "All features have been deselected."; textHelp.Text = action; } /// /// Clears shared UI when no tweak is selected. /// private void UpdateUiContextForNoneSelected() { textHelp.Text = ""; } /// /// Refreshes the view by reloading the current category's tweaks. /// public void RefreshView() { if (comboCategories.SelectedItem is string selectedCategory) { _ = LoadTweaksForCategory(selectedCategory); } } private void btnMoreInfo_Click(object sender, EventArgs e) { Process.Start("https://github.com/builtbybel/CrapFixer"); } } } ================================================ FILE: Flyoobe/Views/ExperienceControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/HomeControlView.Designer.cs ================================================ namespace Flyoobe.Views { partial class HomeControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.flowRoot = new System.Windows.Forms.FlowLayoutPanel(); this.comboFilter = new System.Windows.Forms.ComboBox(); this.SuspendLayout(); // // flowRoot // this.flowRoot.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.flowRoot.AutoScroll = true; this.flowRoot.Location = new System.Drawing.Point(37, 57); this.flowRoot.Name = "flowRoot"; this.flowRoot.Size = new System.Drawing.Size(841, 340); this.flowRoot.TabIndex = 0; // // comboFilter // this.comboFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.comboFilter.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.comboFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboFilter.FlatStyle = System.Windows.Forms.FlatStyle.System; this.comboFilter.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10F); this.comboFilter.ForeColor = System.Drawing.Color.Black; this.comboFilter.FormattingEnabled = true; this.comboFilter.Location = new System.Drawing.Point(793, 15); this.comboFilter.Name = "comboFilter"; this.comboFilter.Size = new System.Drawing.Size(71, 25); this.comboFilter.TabIndex = 38; this.comboFilter.TabStop = false; this.comboFilter.SelectedIndexChanged += new System.EventHandler(this.comboFilter_SelectedIndexChanged); // // HomeControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.AutoScroll = true; this.Controls.Add(this.comboFilter); this.Controls.Add(this.flowRoot); this.Name = "HomeControlView"; this.Size = new System.Drawing.Size(881, 400); this.Load += new System.EventHandler(this.HomeControlView_Load); this.ResumeLayout(false); } #endregion private System.Windows.Forms.FlowLayoutPanel flowRoot; private System.Windows.Forms.ComboBox comboFilter; } } ================================================ FILE: Flyoobe/Views/HomeControlView.cs ================================================ using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace Flyoobe.Views { /// /// Home dashboard screen that displays setup pages and extensions. /// Provides search filtering and section grouping. /// public partial class HomeControlView : UserControl, IView, IHasSearch { private readonly ViewNavigator _navigator; public string ViewTitle { get { return "Start"; } } public string ViewSubtitle { get { return null; } } // Stores all tiles for search private readonly List _allTiles = new List(); // Ensures each tile is created once and reused private readonly Dictionary _tileCache = new Dictionary(StringComparer.OrdinalIgnoreCase); public HomeControlView(ViewNavigator navigator) { _navigator = navigator; InitializeComponent(); BuildUI(); } private void HomeControlView_Load(object sender, EventArgs e) { comboFilter.Items.Clear(); comboFilter.Items.Add("All"); comboFilter.Items.Add("OOBE"); comboFilter.Items.Add("Extensions"); comboFilter.SelectedIndex = 0; } /// /// Rebuilds all home-screen content. /// private void BuildUI() { flowRoot.SuspendLayout(); flowRoot.Controls.Clear(); // Recommended Section var ext = AddSection("☆ Featured Extensions", "ext"); AddExtensionTile(ext, "Flyby11", "Upgrade to Windows 11", "Safely migrate Windows 10 to Windows 11"); AddExtensionTile(ext, "Windows 11 25H2 Enablement Package", "Activate Windows 11 25H2", "Enable new features now"); AddExtensionTile(ext, "ViVeTool-Bridge", "ViVeTool", "Toggle experimental Windows features"); // Native Tool Pages AddTile(ext, "Dumputer", "Remove unwanted apps", delegate { _navigator.ShowView("Apps"); }, "debloat bloatware remove apps cleanup"); AddTile(ext, "CoTweaker", "Enhance privacy settings and optimize system, gaming etc.", delegate { _navigator.ShowView("Experience"); }, "bloatware tweak copilot ai privacy boost"); AddTile(ext, "App Installer", "Install recommended software", delegate { _navigator.ShowView("Installer"); }, "install apps software winget"); // OOBE Setup Pages var oobe = AddSection("📄 All Setup Pages", "oobe"); foreach (string page in _navigator.OobeStepsWithoutHome) { ViewMetadata.Pages.TryGetValue(page, out var meta); string title = meta.Title ?? page; string subtitle = meta.Subtitle ?? ""; ViewMetadata.SearchTags.TryGetValue(page, out var tags); AddTile(oobe, title, subtitle, delegate { _navigator.ShowView(page); }, tags); } // Extensions Hub var tools = AddSection("🧩 Extensions Hub", "ext"); AddTile(tools, "Extensions", "Open extension manager", delegate { _navigator.ShowView("Extensions"); }, ViewMetadata.SearchTags["Extensions"]); flowRoot.ResumeLayout(); ApplyFilter(); } /// /// Creates a section block with a header label. /// private FlowLayoutPanel AddSection(string headerText, string filterKey) { var section = new FlowLayoutPanel(); section.AutoSize = true; section.FlowDirection = FlowDirection.TopDown; section.WrapContents = false; section.Tag = filterKey; flowRoot.Controls.Add(section); var header = new Label(); header.Text = headerText; header.AutoSize = true; header.Font = new Font("Segoe UI Semibold", 13f); header.Margin = new Padding(8, 0, 8, 12); section.Controls.Add(header); var row = new FlowLayoutPanel(); row.AutoSize = true; row.FlowDirection = FlowDirection.LeftToRight; row.WrapContents = true; row.Margin = new Padding(8, 0, 8, 12); section.Controls.Add(row); return row; } /// /// Creates (or reuses) a tile UI element. /// private void AddTile(FlowLayoutPanel target, string title, string description, Action click, string tags) { HomeItemControl tile; if (!_tileCache.TryGetValue(title, out tile)) { tile = new HomeItemControl(); tile.ItemTitle = title; tile.ItemDescription = description; tile.SearchTags = (tags ?? "").ToLowerInvariant(); tile.Margin = new Padding(8); tile.Clicked += click; _tileCache[title] = tile; _allTiles.Add(tile); } target.Controls.Add(tile); } /// /// Tile that opens the Extensions Hub and selects a specific tool. /// private void AddExtensionTile(FlowLayoutPanel panel, string toolKey, string title, string description) { // tile == visible UI title, e.g. Upgrade to Windows 11 // toolKey == internal extension identifier, e.g. Flyby11 string tags; ViewMetadata.SearchTags.TryGetValue(toolKey, out tags); AddTile(panel, title, description, delegate { _navigator.ShowView("Extensions"); var hub = _navigator.CurrentView as Flyoobe.ToolHub.ToolHubControlView; if (hub != null) hub.SelectTool(toolKey); }, tags); // assign user count using toolKey string userCount; if (ViewMetadata.UserCounts.TryGetValue(toolKey, out userCount)) { _tileCache[title].UserCount = userCount; // key = title (UI), but lookup = toolKey } } /// /// Shows/hides sections based on filter dropdown. /// private void ApplyFilter() { string mode = comboFilter.SelectedItem != null ? comboFilter.SelectedItem.ToString() : "All"; foreach (Control c in flowRoot.Controls) { var section = c as FlowLayoutPanel; if (section == null) continue; string key = section.Tag as string; if (mode == "OOBE") section.Visible = key == "oobe"; else if (mode == "Extensions") section.Visible = key == "ext"; else section.Visible = true; } } private void comboFilter_SelectedIndexChanged(object sender, EventArgs e) { ApplyFilter(); } public void RefreshView() { BuildUI(); } /// /// Applies a global search filter to all home screen tiles. /// This method is called by the MainForm whenever the user updates the /// search box in the global header (outside of this view). public void OnGlobalSearchChanged(string text) { string filter = (text ?? "").Trim().ToLowerInvariant(); foreach (var tile in _allTiles) { bool match = tile.ItemTitle.ToLowerInvariant().Contains(filter) || tile.ItemDescription.ToLowerInvariant().Contains(filter) || tile.SearchTags.Contains(filter); tile.Visible = match; } } } } ================================================ FILE: Flyoobe/Views/HomeControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/HomeItemControl.Designer.cs ================================================ namespace Flyoobe { partial class HomeItemControl { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.panelRoot = new System.Windows.Forms.Panel(); this.btnOpen = new System.Windows.Forms.Button(); this.lblSubTitle = new System.Windows.Forms.LinkLabel(); this.lblTitle = new System.Windows.Forms.Label(); this.picIcon = new System.Windows.Forms.PictureBox(); this.lblUserCount = new System.Windows.Forms.Label(); this.toolTip = new System.Windows.Forms.ToolTip(this.components); this.panelRoot.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.picIcon)).BeginInit(); this.SuspendLayout(); // // panelRoot // this.panelRoot.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panelRoot.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(254)))), ((int)(((byte)(252)))), ((int)(((byte)(251))))); this.panelRoot.Controls.Add(this.lblUserCount); this.panelRoot.Controls.Add(this.btnOpen); this.panelRoot.Controls.Add(this.lblSubTitle); this.panelRoot.Controls.Add(this.lblTitle); this.panelRoot.Controls.Add(this.picIcon); this.panelRoot.Location = new System.Drawing.Point(18, 16); this.panelRoot.Name = "panelRoot"; this.panelRoot.Size = new System.Drawing.Size(290, 129); this.panelRoot.TabIndex = 38; // // btnOpen // this.btnOpen.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnOpen.Cursor = System.Windows.Forms.Cursors.Hand; this.btnOpen.FlatAppearance.BorderColor = System.Drawing.Color.WhiteSmoke; this.btnOpen.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(83)))), ((int)(((byte)(167))))); this.btnOpen.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(83)))), ((int)(((byte)(167))))); this.btnOpen.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnOpen.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnOpen.ForeColor = System.Drawing.Color.White; this.btnOpen.Location = new System.Drawing.Point(14, 90); this.btnOpen.Name = "btnOpen"; this.btnOpen.Size = new System.Drawing.Size(97, 32); this.btnOpen.TabIndex = 43; this.btnOpen.Text = "Details"; this.btnOpen.UseCompatibleTextRendering = true; this.btnOpen.UseVisualStyleBackColor = false; // // lblSubTitle // this.lblSubTitle.ActiveLinkColor = System.Drawing.Color.DodgerBlue; this.lblSubTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblSubTitle.AutoEllipsis = true; this.lblSubTitle.Font = new System.Drawing.Font("Segoe UI Variable Text", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblSubTitle.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; this.lblSubTitle.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.lblSubTitle.Location = new System.Drawing.Point(13, 40); this.lblSubTitle.Name = "lblSubTitle"; this.lblSubTitle.Size = new System.Drawing.Size(259, 44); this.lblSubTitle.TabIndex = 48; this.lblSubTitle.TabStop = true; this.lblSubTitle.Text = "Description"; // // lblTitle // this.lblTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblTitle.AutoEllipsis = true; this.lblTitle.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12.75F, System.Drawing.FontStyle.Bold); this.lblTitle.ForeColor = System.Drawing.Color.Black; this.lblTitle.Location = new System.Drawing.Point(14, 7); this.lblTitle.Name = "lblTitle"; this.lblTitle.Size = new System.Drawing.Size(258, 22); this.lblTitle.TabIndex = 40; this.lblTitle.Text = "Title"; this.lblTitle.UseCompatibleTextRendering = true; // // picIcon // this.picIcon.Location = new System.Drawing.Point(3, 7); this.picIcon.Name = "picIcon"; this.picIcon.Size = new System.Drawing.Size(51, 38); this.picIcon.TabIndex = 0; this.picIcon.TabStop = false; this.picIcon.Visible = false; // // lblUserCount // this.lblUserCount.AutoEllipsis = true; this.lblUserCount.Font = new System.Drawing.Font("Segoe UI Variable Small", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblUserCount.Location = new System.Drawing.Point(191, 101); this.lblUserCount.Name = "lblUserCount"; this.lblUserCount.Size = new System.Drawing.Size(81, 21); this.lblUserCount.TabIndex = 49; this.toolTip.SetToolTip(this.lblUserCount, "Users"); // // toolTip // this.toolTip.IsBalloon = true; // // HomeItemControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240))))); this.Controls.Add(this.panelRoot); this.Name = "HomeItemControl"; this.Size = new System.Drawing.Size(330, 156); this.panelRoot.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.picIcon)).EndInit(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Panel panelRoot; private System.Windows.Forms.PictureBox picIcon; private System.Windows.Forms.Button btnOpen; private System.Windows.Forms.Label lblTitle; private System.Windows.Forms.LinkLabel lblSubTitle; private System.Windows.Forms.Label lblUserCount; private System.Windows.Forms.ToolTip toolTip; } } ================================================ FILE: Flyoobe/Views/HomeItemControl.cs ================================================ using System; using System.Drawing; using System.Windows.Forms; namespace Flyoobe { public partial class HomeItemControl : UserControl { public event Action Clicked; public string ItemTitle { get => lblTitle.Text; set => lblTitle.Text = value; } public string ItemDescription { get => lblSubTitle.Text; set => lblSubTitle.Text = value; } public Image ItemIcon { get => picIcon.Image; set => picIcon.Image = value; } public string UserCount { get => lblUserCount.Text; set { lblUserCount.Text = value; lblUserCount.Visible = !string.IsNullOrEmpty(value); } } /// /// Hidden searchable keywords (not displayed). /// Example: "debloat;cleanup;apps;remove bloatware" /// /// public string SearchTags { get; set; } = ""; public HomeItemControl() { InitializeComponent(); btnOpen.Click += (s, e) => Clicked?.Invoke(); } } } ================================================ FILE: Flyoobe/Views/HomeItemControl.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 17, 17 ================================================ FILE: Flyoobe/Views/InstallerControlView.Designer.cs ================================================ namespace Flyoobe { partial class InstallerControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); this.btnInstall = new System.Windows.Forms.Button(); this.lblCategory = new System.Windows.Forms.Label(); this.lblStatus = new System.Windows.Forms.Label(); this.progressBar = new System.Windows.Forms.ProgressBar(); this.linkInstallById = new System.Windows.Forms.LinkLabel(); this.dgvApps = new System.Windows.Forms.DataGridView(); this.EnabledColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn(); this.NameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.IdColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.UpdateColumn = new System.Windows.Forms.DataGridViewButtonColumn(); ((System.ComponentModel.ISupportInitialize)(this.dgvApps)).BeginInit(); this.SuspendLayout(); // // btnInstall // this.btnInstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnInstall.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnInstall.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnInstall.FlatAppearance.BorderSize = 0; this.btnInstall.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnInstall.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnInstall.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnInstall.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnInstall.ForeColor = System.Drawing.Color.Black; this.btnInstall.Location = new System.Drawing.Point(658, 388); this.btnInstall.Name = "btnInstall"; this.btnInstall.Size = new System.Drawing.Size(160, 31); this.btnInstall.TabIndex = 17; this.btnInstall.Text = "Install apps"; this.btnInstall.UseCompatibleTextRendering = true; this.btnInstall.UseVisualStyleBackColor = false; this.btnInstall.Click += new System.EventHandler(this.btnInstall_Click); // // lblCategory // this.lblCategory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblCategory.AutoEllipsis = true; this.lblCategory.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.25F); this.lblCategory.ForeColor = System.Drawing.Color.Black; this.lblCategory.Location = new System.Drawing.Point(51, 15); this.lblCategory.Name = "lblCategory"; this.lblCategory.Size = new System.Drawing.Size(756, 45); this.lblCategory.TabIndex = 20; this.lblCategory.Text = "Select the apps you want to install to enhance your productivity and keep your sy" + "stem up to date"; this.lblCategory.UseCompatibleTextRendering = true; // // lblStatus // this.lblStatus.AutoEllipsis = true; this.lblStatus.Dock = System.Windows.Forms.DockStyle.Bottom; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblStatus.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(131)))), ((int)(((byte)(135))))); this.lblStatus.Location = new System.Drawing.Point(0, 427); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(835, 20); this.lblStatus.TabIndex = 22; // // progressBar // this.progressBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(38)))), ((int)(((byte)(38)))), ((int)(((byte)(38))))); this.progressBar.Dock = System.Windows.Forms.DockStyle.Bottom; this.progressBar.Location = new System.Drawing.Point(0, 447); this.progressBar.Name = "progressBar"; this.progressBar.Size = new System.Drawing.Size(835, 10); this.progressBar.TabIndex = 21; this.progressBar.Visible = false; // // linkInstallById // this.linkInstallById.ActiveLinkColor = System.Drawing.Color.DeepPink; this.linkInstallById.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.linkInstallById.AutoEllipsis = true; this.linkInstallById.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); this.linkInstallById.LinkBehavior = System.Windows.Forms.LinkBehavior.AlwaysUnderline; this.linkInstallById.LinkColor = System.Drawing.Color.RoyalBlue; this.linkInstallById.Location = new System.Drawing.Point(42, 388); this.linkInstallById.Name = "linkInstallById"; this.linkInstallById.Size = new System.Drawing.Size(594, 23); this.linkInstallById.TabIndex = 24; this.linkInstallById.TabStop = true; this.linkInstallById.Text = "+ Install custom Winget package"; this.linkInstallById.UseCompatibleTextRendering = true; this.linkInstallById.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkInstallById_LinkClicked); // // dgvApps // this.dgvApps.AllowUserToAddRows = false; this.dgvApps.AllowUserToDeleteRows = false; this.dgvApps.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.dgvApps.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.dgvApps.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.dgvApps.BorderStyle = System.Windows.Forms.BorderStyle.None; this.dgvApps.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; this.dgvApps.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(243)))), ((int)(((byte)(242)))), ((int)(((byte)(230))))); dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; this.dgvApps.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; this.dgvApps.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dgvApps.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.EnabledColumn, this.NameColumn, this.IdColumn, this.UpdateColumn}); dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText; dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; this.dgvApps.DefaultCellStyle = dataGridViewCellStyle2; this.dgvApps.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; this.dgvApps.EnableHeadersVisualStyles = false; this.dgvApps.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.dgvApps.Location = new System.Drawing.Point(42, 63); this.dgvApps.Name = "dgvApps"; this.dgvApps.RowHeadersVisible = false; this.dgvApps.Size = new System.Drawing.Size(776, 318); this.dgvApps.TabIndex = 25; this.dgvApps.TabStop = false; this.dgvApps.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvApps_CellContentClick); // // EnabledColumn // this.EnabledColumn.FillWeight = 41.63078F; this.EnabledColumn.HeaderText = ""; this.EnabledColumn.Name = "EnabledColumn"; this.EnabledColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True; this.EnabledColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; // // NameColumn // this.NameColumn.FillWeight = 147.3089F; this.NameColumn.HeaderText = "Name"; this.NameColumn.Name = "NameColumn"; // // IdColumn // this.IdColumn.FillWeight = 178.7961F; this.IdColumn.HeaderText = "Winget ID"; this.IdColumn.Name = "IdColumn"; // // UpdateColumn // this.UpdateColumn.FillWeight = 72.54963F; this.UpdateColumn.HeaderText = "Update"; this.UpdateColumn.Name = "UpdateColumn"; this.UpdateColumn.Text = "Update"; this.UpdateColumn.UseColumnTextForButtonValue = true; // // InstallerControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.dgvApps); this.Controls.Add(this.linkInstallById); this.Controls.Add(this.lblStatus); this.Controls.Add(this.progressBar); this.Controls.Add(this.lblCategory); this.Controls.Add(this.btnInstall); this.Name = "InstallerControlView"; this.Size = new System.Drawing.Size(835, 457); ((System.ComponentModel.ISupportInitialize)(this.dgvApps)).EndInit(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button btnInstall; private System.Windows.Forms.Label lblCategory; private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.ProgressBar progressBar; private System.Windows.Forms.LinkLabel linkInstallById; private System.Windows.Forms.DataGridView dgvApps; private System.Windows.Forms.DataGridViewCheckBoxColumn EnabledColumn; private System.Windows.Forms.DataGridViewTextBoxColumn NameColumn; private System.Windows.Forms.DataGridViewTextBoxColumn IdColumn; private System.Windows.Forms.DataGridViewButtonColumn UpdateColumn; } } ================================================ FILE: Flyoobe/Views/InstallerControlView.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { public partial class InstallerControlView : UserControl, IView, IHasSearch { private bool autoAcceptAgreements = false; // List of (DisplayName, WingetId) private List<(string Name, string Id)> allApps; public InstallerControlView() { InitializeComponent(); // Check if Winget is installed if (!IsWingetInstalled()) { MessageBox.Show( "Winget is not installed. Please install 'App Installer' from the Microsoft Store first.", "Winget Not Found", MessageBoxButtons.OK, MessageBoxIcon.Error); btnInstall.Enabled = false; return; } InitializeAppList(); } /// /// Predefines a list of commonly used apps with their Winget IDs. /// private void InitializeAppList() { allApps = new List<(string, string)> { ("7-Zip", "7zip.7zip"), ("VLC Media Player", "VideoLAN.VLC"), ("Visual Studio Code", "Microsoft.VisualStudioCode"), ("Discord", "Discord.Discord"), ("Notepad++", "Notepad++.Notepad++"), ("Slack", "SlackTechnologies.Slack"), ("Microsoft Teams", "Microsoft.Teams"), ("Microsoft PowerToys", "Microsoft.PowerToys"), ("Paint.NET", "dotPDNLLC.paintdotnet"), ("IrfanView", "IrfanSkiljan.IrfanView"), ("Everything Search", "voidtools.Everything"), ("BleachBit", "BleachBit.BleachBit"), ("KeePass", "KeePass.KeePass"), ("StartAllBack", "StartIsBack.StartAllBack"), ("Git", "Git.Git"), ("GitHub Desktop", "GitHub.GitHubDesktop"), }; RefreshAppList(allApps); } /// /// Checks if Winget is installed on this system. /// private bool IsWingetInstalled() { try { ProcessStartInfo psi = new ProcessStartInfo("winget", "--version") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; using (Process process = Process.Start(psi)) { process.WaitForExit(3000); string output = process.StandardOutput.ReadToEnd(); return output.Contains("."); } } catch { return false; } } /// /// Handles the Install button click — installs all checked apps by their Winget IDs. /// private async void btnInstall_Click(object sender, EventArgs e) { var selectedApps = dgvApps.Rows .Cast() .Where(r => Convert.ToBoolean(r.Cells[0].Value)) .Select(r => r.Cells["IdColumn"].Value.ToString()) .ToList(); if (selectedApps.Count == 0) { lblStatus.Text = "No apps selected."; return; } var result = MessageBox.Show( "Automatically accept all license agreements?", "Confirm License Agreements", MessageBoxButtons.YesNo, MessageBoxIcon.Question); autoAcceptAgreements = result == DialogResult.Yes; btnInstall.Enabled = false; dgvApps.Enabled = false; progressBar.Visible = true; progressBar.Maximum = selectedApps.Count; progressBar.Value = 0; progressBar.Step = 1; // one step per removed app foreach (string appId in selectedApps) { lblStatus.Text = $"Installing {appId}..."; await Task.Run(() => RunWingetCommand("install", appId)); progressBar.Invoke((Action)(() => progressBar.PerformStep())); } lblStatus.Text = "Installation complete."; btnInstall.Enabled = true; dgvApps.Enabled = true; progressBar.Visible = false; } /// /// Runs a Winget command (install/upgrade) for the specified app ID. /// private void RunWingetCommand(string command, string appId) { string extraArgs = autoAcceptAgreements ? "--accept-package-agreements --accept-source-agreements" : ""; // command = "install" or "upgrade" ProcessStartInfo psi = new ProcessStartInfo("winget", $"{command} --id \"{appId}\" -e --silent --source winget {extraArgs}") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; using (Process process = new Process { StartInfo = psi, EnableRaisingEvents = true }) { process.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) UpdateStatusSafe(e.Data); }; process.ErrorDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { UpdateStatusSafe("[Error] " + e.Data); Logger.Log(e.Data, LogLevel.Error); } }; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); } } /// /// Updates the status label safely across threads. /// private void UpdateStatusSafe(string message) { if (lblStatus.InvokeRequired) lblStatus.Invoke((Action)(() => lblStatus.Text = message)); else lblStatus.Text = message; } /// /// Applies global search input. /// public void OnGlobalSearchChanged(string text) { string filter = (text ?? "").Trim().ToLowerInvariant(); var filtered = allApps .Where(a => a.Name.ToLower().Contains(filter) || a.Id.ToLower().Contains(filter)); RefreshAppList(filtered); } /// /// Updates the checkedListBox with readable "Name (WingetID)" entries. /// private void RefreshAppList(IEnumerable<(string Name, string Id)> apps) { dgvApps.Rows.Clear(); foreach (var app in apps) { dgvApps.Rows.Add(false, app.Name, app.Id); } } /// /// Clears selection and resets status label. /// public void RefreshView() { RefreshAppList(allApps); lblStatus.Text = "Ready."; } /// /// Opens a small dialog that allows the user to search for apps in Winget manually, /// then enter an app ID to install directly. /// private void linkInstallById_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { using (var dialog = new InputDialog()) { if (dialog.ShowDialog() == DialogResult.OK) { string appId = dialog.EnteredId.Trim(); if (string.IsNullOrEmpty(appId)) { MessageBox.Show("No Winget ID entered.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } lblStatus.Text = $"Installing {appId}..."; _ = Task.Run(() => RunWingetCommand("install", appId)); } } } private async void dgvApps_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; string appId = dgvApps.Rows[e.RowIndex].Cells["IdColumn"].Value?.ToString(); if (string.IsNullOrWhiteSpace(appId)) return; string columnName = dgvApps.Columns[e.ColumnIndex].HeaderText; if (columnName == "Install") { lblStatus.Text = $"Installing {appId}..."; Logger.Log($"Installing {appId}...", LogLevel.Info); await Task.Run(() => RunWingetCommand("install", appId)); lblStatus.Text = $"{appId} installed."; } else if (columnName == "Update") { lblStatus.Text = $"Checking for updates for {appId}..."; Logger.Log($"Updating {appId}...", LogLevel.Info); await Task.Run(() => RunWingetCommand("upgrade", appId)); lblStatus.Text = $"{appId} updated (if an update was available)."; } } } } /// /// Input dialog for manual Winget installation. /// Lets the user search in Winget Terminal and then install by ID. /// public class InputDialog : Form { private readonly TextBox txtSearch; private readonly TextBox txtInput; private readonly Button btnSearch; private readonly Button btnOk; private readonly Button btnCancel; private readonly Label lblInfo; private readonly GroupBox grpSearch; private readonly GroupBox grpInstall; private const string PlaceholderSearch = "Enter app name (e.g. chrome)"; private const string PlaceholderId = "Enter Winget ID (e.g. Google.Chrome)"; public string EnteredId => txtInput.Text.Trim(); public InputDialog() { AutoScaleMode = AutoScaleMode.Dpi; AutoScaleDimensions = new SizeF(96F, 96F); Text = "Manual Winget Installation"; Font = SystemFonts.MessageBoxFont; BackColor = SystemColors.Control; StartPosition = FormStartPosition.CenterParent; FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false; ClientSize = new Size(420, 260); // === Info === lblInfo = new Label { Text = "① Enter a keyword to search in Winget.\n" + "② Winget will open and show results.\n" + "③ Copy the found ID below and click Install.", AutoSize = false, Dock = DockStyle.Top, Height = 55, TextAlign = ContentAlignment.MiddleLeft }; Controls.Add(lblInfo); // === Search Group === grpSearch = new GroupBox { Text = "Search in Winget", Dock = DockStyle.Top, Height = 80, Padding = new Padding(10) }; Controls.Add(grpSearch); // === Layout: Textbox + Button var searchLayout = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 2, RowCount = 1, AutoSize = true }; searchLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 70F)); searchLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 30F)); grpSearch.Controls.Add(searchLayout); txtSearch = new TextBox { Text = PlaceholderSearch, ForeColor = SystemColors.GrayText, Dock = DockStyle.Fill, Margin = new Padding(0, 0, 6, 0) }; txtSearch.GotFocus += (s, e) => ClearPlaceholder(txtSearch, PlaceholderSearch); txtSearch.LostFocus += (s, e) => RestorePlaceholder(txtSearch, PlaceholderSearch); // Search Button btnSearch = new Button { Text = "&Search...", AutoSize = true }; btnSearch.Click += (s, e) => OpenWingetTerminal(txtSearch.Text); searchLayout.Controls.Add(txtSearch, 0, 0); searchLayout.Controls.Add(btnSearch, 1, 0); grpSearch.Controls.Add(searchLayout); // === Install Group === grpInstall = new GroupBox { Text = "Install by ID", Dock = DockStyle.Top, Height = 80, Padding = new Padding(10) }; Controls.Add(grpInstall); txtInput = new TextBox { Text = PlaceholderId, ForeColor = SystemColors.GrayText, Dock = DockStyle.Fill }; txtInput.GotFocus += (s, e) => ClearPlaceholder(txtInput, PlaceholderId); txtInput.LostFocus += (s, e) => RestorePlaceholder(txtInput, PlaceholderId); grpInstall.Controls.Add(txtInput); // === Bottom Buttons === var pnlButtons = new Panel { Dock = DockStyle.Bottom, Height = 40, }; Controls.Add(pnlButtons); btnOk = new Button { Text = "&Install", DialogResult = DialogResult.OK, Anchor = AnchorStyles.Bottom | AnchorStyles.Right, AutoSize = true }; btnCancel = new Button { Text = "Cancel", DialogResult = DialogResult.Cancel, Anchor = AnchorStyles.Bottom | AnchorStyles.Right, AutoSize = true }; // Align bottom buttons like Windows dialogs btnCancel.SetBounds(ClientSize.Width - 90, 8, 75, 25); btnOk.SetBounds(ClientSize.Width - 170, 8, 75, 25); pnlButtons.Controls.Add(btnOk); pnlButtons.Controls.Add(btnCancel); AcceptButton = btnOk; CancelButton = btnCancel; } // === Placeholder handling === private void ClearPlaceholder(TextBox box, string placeholder) { if (box.Text == placeholder) { box.Clear(); box.ForeColor = SystemColors.WindowText; } } private void RestorePlaceholder(TextBox box, string placeholder) { if (string.IsNullOrWhiteSpace(box.Text)) { box.Text = placeholder; box.ForeColor = SystemColors.GrayText; } } // === Winget Terminal === private void OpenWingetTerminal(string query) { if (string.IsNullOrWhiteSpace(query) || query == PlaceholderSearch) { MessageBox.Show("Please enter a search term first.", "Missing Search Term", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } try { string sanitized = query.Replace("\"", "").Trim(); bool useCmd = false; try { Process.Start(new ProcessStartInfo { FileName = "wt.exe", Arguments = "echo", UseShellExecute = false, CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true })?.Kill(); } catch { useCmd = true; } Process.Start(new ProcessStartInfo { FileName = useCmd ? "cmd.exe" : "wt.exe", Arguments = useCmd ? $"/k winget search {sanitized}" : $"cmd /k \"winget search {sanitized}\"", UseShellExecute = true }); } catch (Exception ex) { MessageBox.Show($"Failed to open Winget terminal:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } ================================================ FILE: Flyoobe/Views/InstallerControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True True True True True ================================================ FILE: Flyoobe/Views/LoggerControlView.Designer.cs ================================================ namespace Flyoobe { partial class LoggerControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.richTextBoxLogs = new System.Windows.Forms.RichTextBox(); this.SuspendLayout(); // // richTextBoxLogs // this.richTextBoxLogs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.richTextBoxLogs.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.richTextBoxLogs.BorderStyle = System.Windows.Forms.BorderStyle.None; this.richTextBoxLogs.Font = new System.Drawing.Font("Cascadia Code", 8.75F); this.richTextBoxLogs.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(201)))), ((int)(((byte)(89)))), ((int)(((byte)(63))))); this.richTextBoxLogs.Location = new System.Drawing.Point(41, 29); this.richTextBoxLogs.Name = "richTextBoxLogs"; this.richTextBoxLogs.Size = new System.Drawing.Size(353, 461); this.richTextBoxLogs.TabIndex = 1; this.richTextBoxLogs.TabStop = false; this.richTextBoxLogs.Text = ""; // // LoggerControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.richTextBoxLogs); this.Name = "LoggerControlView"; this.Size = new System.Drawing.Size(431, 522); this.ResumeLayout(false); } #endregion private System.Windows.Forms.RichTextBox richTextBoxLogs; } } ================================================ FILE: Flyoobe/Views/LoggerControlView.cs ================================================ using System; using System.Drawing; using System.Windows.Forms; namespace Flyoobe { public partial class LoggerControlView : UserControl, IView { public LoggerControlView() { InitializeComponent(); } /// /// Adds a new log entry to the RichTextBox with color support. /// public void AddLog(string message, Color color) { if (richTextBoxLogs.InvokeRequired) { // Invoke on the UI thread richTextBoxLogs.Invoke(new Action(() => AddLog(message, color))); } else { // Perform changes directly on the UI thread richTextBoxLogs.SelectionColor = color; richTextBoxLogs.AppendText(message + Environment.NewLine); richTextBoxLogs.ScrollToCaret(); } } public void RefreshView() { richTextBoxLogs.Clear(); } } } ================================================ FILE: Flyoobe/Views/LoggerControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/NetworkControlView.Designer.cs ================================================ namespace Flyoobe { partial class NetworkControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.btnRefresh = new System.Windows.Forms.Button(); this.btnConnect = new System.Windows.Forms.Button(); this.lblStatus = new System.Windows.Forms.Label(); this.radioWifi = new System.Windows.Forms.RadioButton(); this.radioEthernet = new System.Windows.Forms.RadioButton(); this.listBoxNetworks = new System.Windows.Forms.ListBox(); this.SuspendLayout(); // // btnRefresh // this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnRefresh.BackColor = System.Drawing.Color.Transparent; this.btnRefresh.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnRefresh.FlatAppearance.BorderSize = 2; this.btnRefresh.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DimGray; this.btnRefresh.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DimGray; this.btnRefresh.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnRefresh.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnRefresh.ForeColor = System.Drawing.Color.White; this.btnRefresh.Location = new System.Drawing.Point(468, 414); this.btnRefresh.Name = "btnRefresh"; this.btnRefresh.Size = new System.Drawing.Size(160, 31); this.btnRefresh.TabIndex = 15; this.btnRefresh.Text = "Refresh"; this.btnRefresh.UseCompatibleTextRendering = true; this.btnRefresh.UseVisualStyleBackColor = false; this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click); // // btnConnect // this.btnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnConnect.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(83)))), ((int)(((byte)(206)))), ((int)(((byte)(249))))); this.btnConnect.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnConnect.FlatAppearance.BorderSize = 2; this.btnConnect.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DimGray; this.btnConnect.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DimGray; this.btnConnect.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnConnect.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnConnect.ForeColor = System.Drawing.Color.Black; this.btnConnect.Location = new System.Drawing.Point(647, 414); this.btnConnect.Name = "btnConnect"; this.btnConnect.Size = new System.Drawing.Size(160, 31); this.btnConnect.TabIndex = 14; this.btnConnect.Text = "Connect"; this.btnConnect.UseCompatibleTextRendering = true; this.btnConnect.UseVisualStyleBackColor = false; this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click); // // lblStatus // this.lblStatus.AutoSize = true; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblStatus.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(131)))), ((int)(((byte)(135))))); this.lblStatus.Location = new System.Drawing.Point(63, 349); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(34, 20); this.lblStatus.TabIndex = 17; this.lblStatus.Text = "Idle"; // // radioWifi // this.radioWifi.AutoSize = true; this.radioWifi.Checked = true; this.radioWifi.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 11.75F, System.Drawing.FontStyle.Bold); this.radioWifi.ForeColor = System.Drawing.Color.Black; this.radioWifi.Location = new System.Drawing.Point(67, 72); this.radioWifi.Name = "radioWifi"; this.radioWifi.Size = new System.Drawing.Size(92, 27); this.radioWifi.TabIndex = 18; this.radioWifi.TabStop = true; this.radioWifi.Text = "Use Wi-Fi"; this.radioWifi.UseCompatibleTextRendering = true; this.radioWifi.UseVisualStyleBackColor = true; // // radioEthernet // this.radioEthernet.AutoSize = true; this.radioEthernet.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 11.75F, System.Drawing.FontStyle.Bold); this.radioEthernet.ForeColor = System.Drawing.Color.Black; this.radioEthernet.Location = new System.Drawing.Point(67, 380); this.radioEthernet.Name = "radioEthernet"; this.radioEthernet.Size = new System.Drawing.Size(117, 27); this.radioEthernet.TabIndex = 20; this.radioEthernet.Text = "Use Ethernet"; this.radioEthernet.UseCompatibleTextRendering = true; this.radioEthernet.UseVisualStyleBackColor = true; // // listBoxNetworks // this.listBoxNetworks.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.listBoxNetworks.BackColor = System.Drawing.Color.White; this.listBoxNetworks.BorderStyle = System.Windows.Forms.BorderStyle.None; this.listBoxNetworks.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 11.25F, System.Drawing.FontStyle.Bold); this.listBoxNetworks.FormattingEnabled = true; this.listBoxNetworks.ItemHeight = 20; this.listBoxNetworks.Location = new System.Drawing.Point(67, 119); this.listBoxNetworks.Name = "listBoxNetworks"; this.listBoxNetworks.Size = new System.Drawing.Size(740, 200); this.listBoxNetworks.TabIndex = 24; // // NetworkControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.radioEthernet); this.Controls.Add(this.radioWifi); this.Controls.Add(this.lblStatus); this.Controls.Add(this.btnRefresh); this.Controls.Add(this.btnConnect); this.Controls.Add(this.listBoxNetworks); this.Name = "NetworkControlView"; this.Size = new System.Drawing.Size(835, 457); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button btnRefresh; private System.Windows.Forms.Button btnConnect; private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.RadioButton radioWifi; private System.Windows.Forms.RadioButton radioEthernet; private System.Windows.Forms.ListBox listBoxNetworks; } } ================================================ FILE: Flyoobe/Views/NetworkControlView.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; using System.Windows.Forms; namespace Flyoobe { public partial class NetworkControlView : UserControl, IView { public NetworkControlView() { InitializeComponent(); } private async Task RefreshNetworks() { btnConnect.Enabled = false; lblStatus.Text = "Scanning for networks..."; listBoxNetworks.Items.Clear(); var networks = await Task.Run(() => GetAvailableWifiNetworks()); if (networks.Count == 0) { lblStatus.Text = "No networks found."; } else { lblStatus.Text = $"Found {networks.Count} networks."; listBoxNetworks.Items.AddRange(networks.ToArray()); } btnConnect.Enabled = true; } private async void btnConnect_Click(object sender, EventArgs e) { btnConnect.Enabled = false; btnRefresh.Enabled = false; if (radioEthernet.Checked) { lblStatus.Text = "Ethernet selected. Opening Network Connections..."; OpenNetworkConnections(); } else { if (listBoxNetworks.SelectedItem == null) { lblStatus.Text = "Please select a WiFi network."; btnConnect.Enabled = true; btnRefresh.Enabled = true; return; } string ssid = listBoxNetworks.SelectedItem.ToString(); lblStatus.Text = $"Connecting to {ssid}..."; await Task.Run(() => ConnectToWifi(ssid)); } btnConnect.Enabled = true; btnRefresh.Enabled = true; } private List GetAvailableWifiNetworks() { var ssids = new List(); try { var psi = new ProcessStartInfo("netsh", "wlan show networks mode=Bssid") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; using (var proc = Process.Start(psi)) { string output = proc.StandardOutput.ReadToEnd(); string error = proc.StandardError.ReadToEnd(); proc.WaitForExit(); // --- detect location service requirement --- if (proc.ExitCode != 0) { Invoke((Action)(() => { MessageBox.Show( "Location services must be enabled to scan for Wi-Fi networks.\n\n" + "Click OK to open Location Settings.", "Wi-Fi Scan Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); EnsureLocationEnabled(); // open settings })); return ssids; // empty } // --- normal parsing --- foreach (var line in output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) { if (line.Trim().StartsWith("SSID ", StringComparison.OrdinalIgnoreCase)) { var parts = line.Split(':'); if (parts.Length > 1) { string ssid = parts[1].Trim(); if (!string.IsNullOrEmpty(ssid) && !ssids.Contains(ssid)) ssids.Add(ssid); } } } } } catch (Exception ex) { this.Invoke((Action)(() => { MessageBox.Show($"Error retrieving networks: {ex.Message}"); })); } return ssids; } // Opens the Location Settings page if location services are required private void EnsureLocationEnabled() { try { Process.Start(new ProcessStartInfo("ms-settings:privacy-location") { UseShellExecute = true }); } catch (Exception ex) { MessageBox.Show("Please enable Location services manually. Error: " + ex.Message); } } // Attempts to connect to a given Wi-Fi SSID using netsh private void ConnectToWifi(string ssid) { try { ProcessStartInfo psi = new ProcessStartInfo("netsh", $"wlan connect name=\"{ssid}\"") { UseShellExecute = false, CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true }; using (Process process = Process.Start(psi)) { string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); // Check if the connection was successful if (!output.Contains("completed successfully") || process.ExitCode != 0) { Invoke(new MethodInvoker(() => { lblStatus.Text = $"Connection to {ssid} failed. Opening Wi-Fi settings..."; })); OpenWifiSettings(); } else { Invoke(new MethodInvoker(() => { lblStatus.Text = $"Successfully connected to {ssid}."; })); } } } catch (Exception ex) { Invoke(new MethodInvoker(() => { lblStatus.Text = $"Error connecting to {ssid}: {ex.Message}"; })); } } private void OpenWifiSettings() { try { Process.Start("ms-settings:network-wifi"); } catch (Exception ex) { MessageBox.Show("Failed to open WiFi settings: " + ex.Message); } } private void OpenNetworkConnections() { try { Process.Start("ncpa.cpl"); } catch (Exception ex) { MessageBox.Show("Failed to open Network Connections: " + ex.Message); } } public async void RefreshView() { await RefreshNetworks(); } private async void btnRefresh_Click(object sender, EventArgs e) { await RefreshNetworks(); } } } ================================================ FILE: Flyoobe/Views/NetworkControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/PersonalizationControlView.Designer.cs ================================================ namespace Flyoobe { partial class PersonalizationControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.btnChangeAccent = new System.Windows.Forms.Button(); this.btnChangeWallpaper = new System.Windows.Forms.Button(); this.btnApplyTheme = new System.Windows.Forms.Button(); this.checkToggleTransparency = new System.Windows.Forms.CheckBox(); this.pictureBoxWallpaper = new System.Windows.Forms.PictureBox(); this.panel1 = new System.Windows.Forms.Panel(); this.label3 = new System.Windows.Forms.Label(); this.comboTaskbarAlignment = new System.Windows.Forms.ComboBox(); this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.comboSystemTheme = new System.Windows.Forms.ComboBox(); this.comboAppTheme = new System.Windows.Forms.ComboBox(); this.btnChangeDesktopIcons = new System.Windows.Forms.Button(); this.lblStatus = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWallpaper)).BeginInit(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // btnChangeAccent // this.btnChangeAccent.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnChangeAccent.BackColor = System.Drawing.Color.Transparent; this.btnChangeAccent.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnChangeAccent.FlatAppearance.BorderSize = 2; this.btnChangeAccent.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnChangeAccent.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnChangeAccent.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btnChangeAccent.ForeColor = System.Drawing.Color.Black; this.btnChangeAccent.Location = new System.Drawing.Point(160, 427); this.btnChangeAccent.Name = "btnChangeAccent"; this.btnChangeAccent.Size = new System.Drawing.Size(138, 27); this.btnChangeAccent.TabIndex = 22; this.btnChangeAccent.Text = "Choose accent colors"; this.btnChangeAccent.UseCompatibleTextRendering = true; this.btnChangeAccent.UseVisualStyleBackColor = false; this.btnChangeAccent.Click += new System.EventHandler(this.btnRefresh_Click); // // btnChangeWallpaper // this.btnChangeWallpaper.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnChangeWallpaper.AutoSize = true; this.btnChangeWallpaper.BackColor = System.Drawing.Color.Transparent; this.btnChangeWallpaper.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnChangeWallpaper.FlatAppearance.BorderSize = 2; this.btnChangeWallpaper.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnChangeWallpaper.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnChangeWallpaper.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btnChangeWallpaper.ForeColor = System.Drawing.Color.Black; this.btnChangeWallpaper.Location = new System.Drawing.Point(16, 427); this.btnChangeWallpaper.Name = "btnChangeWallpaper"; this.btnChangeWallpaper.Size = new System.Drawing.Size(138, 27); this.btnChangeWallpaper.TabIndex = 21; this.btnChangeWallpaper.Text = "Choose background"; this.btnChangeWallpaper.UseCompatibleTextRendering = true; this.btnChangeWallpaper.UseVisualStyleBackColor = false; this.btnChangeWallpaper.Click += new System.EventHandler(this.btnChangeWallpaper_Click); // // btnApplyTheme // this.btnApplyTheme.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.btnApplyTheme.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(183)))), ((int)(((byte)(135))))); this.btnApplyTheme.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnApplyTheme.FlatAppearance.BorderSize = 0; this.btnApplyTheme.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnApplyTheme.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(232)))), ((int)(((byte)(230))))); this.btnApplyTheme.FlatStyle = System.Windows.Forms.FlatStyle.System; this.btnApplyTheme.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 10.25F, System.Drawing.FontStyle.Bold); this.btnApplyTheme.ForeColor = System.Drawing.Color.Black; this.btnApplyTheme.Location = new System.Drawing.Point(46, 315); this.btnApplyTheme.Name = "btnApplyTheme"; this.btnApplyTheme.Size = new System.Drawing.Size(666, 35); this.btnApplyTheme.TabIndex = 31; this.btnApplyTheme.Text = "Apply theme"; this.btnApplyTheme.UseCompatibleTextRendering = true; this.btnApplyTheme.UseVisualStyleBackColor = false; this.btnApplyTheme.Click += new System.EventHandler(this.btnApplyTheme_Click); // // checkToggleTransparency // this.checkToggleTransparency.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.checkToggleTransparency.AutoEllipsis = true; this.checkToggleTransparency.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; this.checkToggleTransparency.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 11.25F); this.checkToggleTransparency.ForeColor = System.Drawing.Color.Black; this.checkToggleTransparency.Location = new System.Drawing.Point(41, 140); this.checkToggleTransparency.Name = "checkToggleTransparency"; this.checkToggleTransparency.Size = new System.Drawing.Size(671, 27); this.checkToggleTransparency.TabIndex = 32; this.checkToggleTransparency.Text = "Toggle Transparency"; this.checkToggleTransparency.UseVisualStyleBackColor = true; // // pictureBoxWallpaper // this.pictureBoxWallpaper.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pictureBoxWallpaper.Location = new System.Drawing.Point(143, 173); this.pictureBoxWallpaper.Name = "pictureBoxWallpaper"; this.pictureBoxWallpaper.Size = new System.Drawing.Size(474, 122); this.pictureBoxWallpaper.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.pictureBoxWallpaper.TabIndex = 33; this.pictureBoxWallpaper.TabStop = false; // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(254)))), ((int)(((byte)(252)))), ((int)(((byte)(251))))); this.panel1.Controls.Add(this.label3); this.panel1.Controls.Add(this.comboTaskbarAlignment); this.panel1.Controls.Add(this.pictureBoxWallpaper); this.panel1.Controls.Add(this.label2); this.panel1.Controls.Add(this.label1); this.panel1.Controls.Add(this.comboSystemTheme); this.panel1.Controls.Add(this.comboAppTheme); this.panel1.Controls.Add(this.btnApplyTheme); this.panel1.Controls.Add(this.checkToggleTransparency); this.panel1.Location = new System.Drawing.Point(30, 38); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(771, 369); this.panel1.TabIndex = 34; // // label3 // this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label3.AutoSize = true; this.label3.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label3.ForeColor = System.Drawing.Color.Black; this.label3.Location = new System.Drawing.Point(41, 104); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(129, 20); this.label3.TabIndex = 38; this.label3.Text = "Taskbar Alignment"; // // comboTaskbarAlignment // this.comboTaskbarAlignment.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.comboTaskbarAlignment.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.comboTaskbarAlignment.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboTaskbarAlignment.FlatStyle = System.Windows.Forms.FlatStyle.System; this.comboTaskbarAlignment.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10F); this.comboTaskbarAlignment.ForeColor = System.Drawing.Color.Black; this.comboTaskbarAlignment.FormattingEnabled = true; this.comboTaskbarAlignment.Location = new System.Drawing.Point(179, 100); this.comboTaskbarAlignment.Name = "comboTaskbarAlignment"; this.comboTaskbarAlignment.Size = new System.Drawing.Size(532, 25); this.comboTaskbarAlignment.TabIndex = 37; this.comboTaskbarAlignment.TabStop = false; // // label2 // this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label2.AutoSize = true; this.label2.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label2.ForeColor = System.Drawing.Color.Black; this.label2.Location = new System.Drawing.Point(41, 65); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(80, 20); this.label2.TabIndex = 36; this.label2.Text = "App mode"; // // label1 // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label1.ForeColor = System.Drawing.Color.Black; this.label1.Location = new System.Drawing.Point(41, 28); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(111, 20); this.label1.TabIndex = 35; this.label1.Text = "Windows mode"; // // comboSystemTheme // this.comboSystemTheme.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.comboSystemTheme.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.comboSystemTheme.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboSystemTheme.FlatStyle = System.Windows.Forms.FlatStyle.System; this.comboSystemTheme.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10F); this.comboSystemTheme.ForeColor = System.Drawing.Color.Black; this.comboSystemTheme.FormattingEnabled = true; this.comboSystemTheme.Location = new System.Drawing.Point(179, 27); this.comboSystemTheme.Name = "comboSystemTheme"; this.comboSystemTheme.Size = new System.Drawing.Size(532, 25); this.comboSystemTheme.TabIndex = 34; this.comboSystemTheme.TabStop = false; // // comboAppTheme // this.comboAppTheme.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.comboAppTheme.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.comboAppTheme.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboAppTheme.FlatStyle = System.Windows.Forms.FlatStyle.System; this.comboAppTheme.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10F); this.comboAppTheme.ForeColor = System.Drawing.Color.Black; this.comboAppTheme.FormattingEnabled = true; this.comboAppTheme.Location = new System.Drawing.Point(179, 64); this.comboAppTheme.Name = "comboAppTheme"; this.comboAppTheme.Size = new System.Drawing.Size(532, 25); this.comboAppTheme.TabIndex = 33; this.comboAppTheme.TabStop = false; // // btnChangeDesktopIcons // this.btnChangeDesktopIcons.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnChangeDesktopIcons.BackColor = System.Drawing.Color.Transparent; this.btnChangeDesktopIcons.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnChangeDesktopIcons.FlatAppearance.BorderSize = 2; this.btnChangeDesktopIcons.FlatAppearance.MouseDownBackColor = System.Drawing.Color.LightGray; this.btnChangeDesktopIcons.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnChangeDesktopIcons.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btnChangeDesktopIcons.ForeColor = System.Drawing.Color.Black; this.btnChangeDesktopIcons.Location = new System.Drawing.Point(304, 427); this.btnChangeDesktopIcons.Name = "btnChangeDesktopIcons"; this.btnChangeDesktopIcons.Size = new System.Drawing.Size(138, 27); this.btnChangeDesktopIcons.TabIndex = 39; this.btnChangeDesktopIcons.Text = "Choose Desktop icons"; this.btnChangeDesktopIcons.UseCompatibleTextRendering = true; this.btnChangeDesktopIcons.UseVisualStyleBackColor = false; this.btnChangeDesktopIcons.Click += new System.EventHandler(this.btnChangeDesktopIcons_Click); // // lblStatus // this.lblStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblStatus.AutoEllipsis = true; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.lblStatus.ForeColor = System.Drawing.Color.Black; this.lblStatus.Location = new System.Drawing.Point(448, 427); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(368, 22); this.lblStatus.TabIndex = 40; this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleRight; this.lblStatus.UseCompatibleTextRendering = true; // // PersonalizationControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.Controls.Add(this.lblStatus); this.Controls.Add(this.panel1); this.Controls.Add(this.btnChangeDesktopIcons); this.Controls.Add(this.btnChangeWallpaper); this.Controls.Add(this.btnChangeAccent); this.Name = "PersonalizationControlView"; this.Size = new System.Drawing.Size(835, 457); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWallpaper)).EndInit(); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button btnChangeAccent; private System.Windows.Forms.Button btnChangeWallpaper; private System.Windows.Forms.Button btnApplyTheme; private System.Windows.Forms.CheckBox checkToggleTransparency; private System.Windows.Forms.PictureBox pictureBoxWallpaper; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.ComboBox comboAppTheme; private System.Windows.Forms.ComboBox comboSystemTheme; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label3; private System.Windows.Forms.ComboBox comboTaskbarAlignment; private System.Windows.Forms.Button btnChangeDesktopIcons; private System.Windows.Forms.Label lblStatus; } } ================================================ FILE: Flyoobe/Views/PersonalizationControlView.cs ================================================ using Microsoft.Win32; using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace Flyoobe { public partial class PersonalizationControlView : UserControl, IView { // Import necessary API functions for theme changes to trigger visual updates [DllImport("user32.dll", SetLastError = false, CharSet = CharSet.Auto)] private static extern IntPtr SendMessageTimeout( IntPtr hWnd, uint Msg, IntPtr wParam, string lParam, uint flags, uint timeout, out IntPtr result); private void NotifyThemeChanged() { const int HWND_BROADCAST = 0xffff; const int WM_SETTINGCHANGE = 0x001A; const int SMTO_ABORTIFHUNG = 0x0002; SendMessageTimeout( (IntPtr)HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "ImmersiveColorSet", SMTO_ABORTIFHUNG, 100, out _); } public PersonalizationControlView() { InitializeComponent(); InitializeThemeDropdowns(); LoadCurrentSettings(); LoadWallpaperPreview(); } /// /// Populates the dropdowns for app and system theme selection. /// private void InitializeThemeDropdowns() { comboAppTheme.Items.Clear(); comboSystemTheme.Items.Clear(); // Populate app theme options comboAppTheme.Items.Add("Light"); comboAppTheme.Items.Add("Dark"); // Populate system theme options comboSystemTheme.Items.Add("Light"); comboSystemTheme.Items.Add("Dark"); // Populate taskbar alignment options comboTaskbarAlignment.Items.Add("Left"); comboTaskbarAlignment.Items.Add("Center"); comboAppTheme.SelectedIndex = 0; // Default to Light comboSystemTheme.SelectedIndex = 0; } /// /// Loads the current personalization settings like theme and transparency. /// private void LoadCurrentSettings() { try { // --- Theme & transparency --- using (RegistryKey key = Registry.CurrentUser.OpenSubKey( @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize")) { if (key != null) { int appsUseLightTheme = Convert.ToInt32(key.GetValue("AppsUseLightTheme", 1)); int systemUseLightTheme = Convert.ToInt32(key.GetValue("SystemUsesLightTheme", 1)); int enableTransparency = Convert.ToInt32(key.GetValue("EnableTransparency", 1)); comboAppTheme.SelectedIndex = (appsUseLightTheme == 1) ? 0 : 1; comboSystemTheme.SelectedIndex = (systemUseLightTheme == 1) ? 0 : 1; checkToggleTransparency.Checked = (enableTransparency == 1); } } // --- Taskbar alignment --- using (RegistryKey adv = Registry.CurrentUser.OpenSubKey( @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced")) { if (adv != null) { object raw = adv.GetValue("TaskbarAl", 1); // default 1 = Center int taskbarAl = Convert.ToInt32(raw); // 0 = Left, 1 = Center comboTaskbarAlignment.SelectedIndex = (taskbarAl == 0) ? 0 : 1; } else { // Key not found -> fallback Center comboTaskbarAlignment.SelectedIndex = 1; } } } catch (Exception ex) { MessageBox.Show("Error reading personalization settings: " + ex.Message); } } /// /// Apply taskbar alignment (0 = Left, 1 = Center) and refresh Explorer if needed. /// private void SetTaskbarAlignment(int alignment) { try { using (RegistryKey adv = Registry.CurrentUser.OpenSubKey( @"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", writable: true)) { if (adv != null) adv.SetValue("TaskbarAl", alignment == 0 ? 0 : 1, RegistryValueKind.DWord); } } catch (Exception ex) { MessageBox.Show("Failed to set taskbar alignment: " + ex.Message); } } /// /// Toggles the transparency effect based on the given flag. /// private void ToggleTransparency(bool enable) { try { RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", true); if (key != null) { key.SetValue("EnableTransparency", enable ? 1 : 0, RegistryValueKind.DWord); key.Close(); } } catch (Exception ex) { MessageBox.Show("Failed to change transparency: " + ex.Message); } } /// /// Sets the Windows theme (0 = Light, 1 = Dark). /// private void SetTheme(bool appsLight, bool systemLight) { try { using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", writable: true)) { if (key != null) { key.SetValue("AppsUseLightTheme", appsLight ? 1 : 0, RegistryValueKind.DWord); key.SetValue("SystemUsesLightTheme", systemLight ? 1 : 0, RegistryValueKind.DWord); } } } catch (Exception ex) { MessageBox.Show("Failed to apply theme settings: " + ex.Message); } NotifyThemeChanged(); // Notify the system that the theme has changed } [DllImport("user32.dll", SetLastError = true)] private static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); /// /// Sets the desktop wallpaper to the specified image path. /// private void SetWallpaper(string path) { const int SPI_SETDESKWALLPAPER = 20; const int SPIF_UPDATEINIFILE = 0x01; SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE); } /// /// Applies the selected theme and transparency settings. /// private void btnApplyTheme_Click(object sender, EventArgs e) { bool appsLight = comboAppTheme.SelectedIndex == 0; // 0 = Light bool systemLight = comboSystemTheme.SelectedIndex == 0; SetTheme(appsLight, systemLight); bool enableTransparency = checkToggleTransparency.Checked; ToggleTransparency(enableTransparency); // apply taskbar alignment from designer combo if (comboTaskbarAlignment != null && comboTaskbarAlignment.SelectedIndex >= 0) { int alignment = (comboTaskbarAlignment.SelectedIndex == 0) ? 0 : 1; // Left or Center SetTaskbarAlignment(alignment); } lblStatus.Text= "Personalization settings updated"; } /// /// Changes the wallpaper and refreshes the preview. /// private void btnChangeWallpaper_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Image Files|*.jpg;*.jpeg;*.png;*.bmp"; if (ofd.ShowDialog() == DialogResult.OK) { SetWallpaper(ofd.FileName); lblStatus.Text = "Wallpaper changed."; LoadWallpaperPreview(); } } /// /// Retrieves the current wallpaper path from the registry. /// private string GetCurrentWallpaperPath() { using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop")) { return key?.GetValue("WallPaper")?.ToString(); } } /// /// Loads the current wallpaper preview into the PictureBox. /// private void LoadWallpaperPreview() { string wallpaperPath = GetCurrentWallpaperPath(); if (!string.IsNullOrEmpty(wallpaperPath) && System.IO.File.Exists(wallpaperPath)) { pictureBoxWallpaper.ImageLocation = wallpaperPath; } } private void btnRefresh_Click(object sender, EventArgs e) { Process.Start("ms-settings:colors"); } public void RefreshView() { LoadCurrentSettings(); LoadWallpaperPreview(); } private void btnChangeDesktopIcons_Click(object sender, EventArgs e) { try { // Classic desktop icon settings dialog Process.Start("rundll32.exe", "shell32.dll,Control_RunDLL desk.cpl,,0"); } catch (Exception ex) { MessageBox.Show("Could not open Desktop Icon Settings: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } ================================================ FILE: Flyoobe/Views/PersonalizationControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/Views/UpdatesControlView.Designer.cs ================================================ namespace Flyoobe { partial class UpdatesControlView { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Komponenten-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.assetViewInfo = new System.Windows.Forms.Label(); this.btnCheckUpdates = new System.Windows.Forms.Button(); this.updatesListBox = new System.Windows.Forms.CheckedListBox(); this.btnInstallUpdates = new System.Windows.Forms.Button(); this.progressBar = new System.Windows.Forms.ProgressBar(); this.lblStatus = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // assetViewInfo // this.assetViewInfo.AutoSize = true; this.assetViewInfo.Font = new System.Drawing.Font("Segoe MDL2 Assets", 60.75F); this.assetViewInfo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.assetViewInfo.Location = new System.Drawing.Point(9, 19); this.assetViewInfo.Name = "assetViewInfo"; this.assetViewInfo.Size = new System.Drawing.Size(86, 81); this.assetViewInfo.TabIndex = 10; this.assetViewInfo.Text = "..."; // // btnCheckUpdates // this.btnCheckUpdates.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnCheckUpdates.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnCheckUpdates.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnCheckUpdates.FlatAppearance.BorderSize = 0; this.btnCheckUpdates.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(85)))), ((int)(((byte)(205)))), ((int)(((byte)(250))))); this.btnCheckUpdates.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(85)))), ((int)(((byte)(205)))), ((int)(((byte)(250))))); this.btnCheckUpdates.Font = new System.Drawing.Font("Segoe UI Variable Small", 10.25F); this.btnCheckUpdates.ForeColor = System.Drawing.Color.White; this.btnCheckUpdates.Location = new System.Drawing.Point(651, 55); this.btnCheckUpdates.Name = "btnCheckUpdates"; this.btnCheckUpdates.Size = new System.Drawing.Size(160, 35); this.btnCheckUpdates.TabIndex = 11; this.btnCheckUpdates.Text = "Check for updates"; this.btnCheckUpdates.UseCompatibleTextRendering = true; this.btnCheckUpdates.UseVisualStyleBackColor = false; this.btnCheckUpdates.Click += new System.EventHandler(this.btnCheckUpdates_Click); // // updatesListBox // this.updatesListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.updatesListBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.updatesListBox.BorderStyle = System.Windows.Forms.BorderStyle.None; this.updatesListBox.CheckOnClick = true; this.updatesListBox.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.5F); this.updatesListBox.ForeColor = System.Drawing.Color.Black; this.updatesListBox.FormattingEnabled = true; this.updatesListBox.Location = new System.Drawing.Point(23, 129); this.updatesListBox.Name = "updatesListBox"; this.updatesListBox.Size = new System.Drawing.Size(788, 273); this.updatesListBox.TabIndex = 12; this.updatesListBox.UseCompatibleTextRendering = true; // // btnInstallUpdates // this.btnInstallUpdates.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnInstallUpdates.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(91)))), ((int)(((byte)(95)))), ((int)(((byte)(194))))); this.btnInstallUpdates.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnInstallUpdates.FlatAppearance.BorderSize = 0; this.btnInstallUpdates.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnInstallUpdates.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(194)))), ((int)(((byte)(255))))); this.btnInstallUpdates.Font = new System.Drawing.Font("Segoe UI Variable Small", 10.25F); this.btnInstallUpdates.ForeColor = System.Drawing.Color.White; this.btnInstallUpdates.Location = new System.Drawing.Point(651, 55); this.btnInstallUpdates.Name = "btnInstallUpdates"; this.btnInstallUpdates.Size = new System.Drawing.Size(160, 35); this.btnInstallUpdates.TabIndex = 13; this.btnInstallUpdates.Text = "Install updates"; this.btnInstallUpdates.UseCompatibleTextRendering = true; this.btnInstallUpdates.UseVisualStyleBackColor = false; this.btnInstallUpdates.Visible = false; this.btnInstallUpdates.Click += new System.EventHandler(this.btnInstallUpdates_Click); // // progressBar // this.progressBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(38)))), ((int)(((byte)(38)))), ((int)(((byte)(38))))); this.progressBar.Dock = System.Windows.Forms.DockStyle.Bottom; this.progressBar.Location = new System.Drawing.Point(0, 447); this.progressBar.Name = "progressBar"; this.progressBar.Size = new System.Drawing.Size(835, 10); this.progressBar.TabIndex = 14; this.progressBar.Visible = false; // // lblStatus // this.lblStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblStatus.AutoEllipsis = true; this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12.25F, System.Drawing.FontStyle.Bold); this.lblStatus.ForeColor = System.Drawing.Color.Black; this.lblStatus.Location = new System.Drawing.Point(131, 24); this.lblStatus.Name = "lblStatus"; this.lblStatus.Size = new System.Drawing.Size(500, 76); this.lblStatus.TabIndex = 15; this.lblStatus.Text = "Update check pending."; // // label4 // this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label4.AutoEllipsis = true; this.label4.Font = new System.Drawing.Font("Segoe UI Variable Text Semiligh", 10.25F); this.label4.ForeColor = System.Drawing.Color.Black; this.label4.Location = new System.Drawing.Point(23, 422); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(766, 22); this.label4.TabIndex = 23; this.label4.Text = "Lowering CO₂ and system requirements — this app installs Windows 11 on hardware M" + "icrosoft forgot about."; this.label4.UseCompatibleTextRendering = true; // // UpdatesControlView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScroll = true; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(244)))), ((int)(((byte)(242))))); this.Controls.Add(this.label4); this.Controls.Add(this.lblStatus); this.Controls.Add(this.progressBar); this.Controls.Add(this.updatesListBox); this.Controls.Add(this.assetViewInfo); this.Controls.Add(this.btnInstallUpdates); this.Controls.Add(this.btnCheckUpdates); this.Name = "UpdatesControlView"; this.Size = new System.Drawing.Size(835, 457); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Label assetViewInfo; private System.Windows.Forms.Button btnCheckUpdates; private System.Windows.Forms.CheckedListBox updatesListBox; private System.Windows.Forms.Button btnInstallUpdates; private System.Windows.Forms.ProgressBar progressBar; private System.Windows.Forms.Label lblStatus; private System.Windows.Forms.Label label4; } } ================================================ FILE: Flyoobe/Views/UpdatesControlView.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Windows.Forms; using WUApiLib; namespace Flyoobe { public partial class UpdatesControlView : UserControl, IView { // Keep updates by stable UpdateID (titles are not unique) private readonly Dictionary _byId = new Dictionary(); public UpdatesControlView() { InitializeComponent(); assetViewInfo.Text = "\uE895"; btnInstallUpdates.Visible = false; // hidden until something is found btnInstallUpdates.Enabled = false; } private async void btnCheckUpdates_Click(object sender, EventArgs e) { // UI state while searching btnCheckUpdates.Enabled = false; btnInstallUpdates.Visible = false; // hide during search btnInstallUpdates.Enabled = false; updatesListBox.Items.Clear(); lblStatus.Text = "Checking for updates..."; try { var items = await Task.Run(() => SearchUpdates()); updatesListBox.Items.Clear(); if (items.Count == 0) { updatesListBox.Items.Add("No updates available."); lblStatus.Text = "No updates found."; btnCheckUpdates.Enabled = true; return; } // Show updates (Title + [UpdateID] so we can map back later) foreach (var it in items) updatesListBox.Items.Add($"{it.Title} {(it.KB != null ? "(KB" + it.KB + ") " : "")}[{it.Id}]"); lblStatus.Text = $"{items.Count} update(s) available."; btnInstallUpdates.Visible = true; // show after search btnInstallUpdates.Enabled = true; } catch (COMException ex) { updatesListBox.Items.Add($"Search failed. HRESULT=0x{ex.HResult:X8}"); lblStatus.Text = "Search error."; } catch (Exception ex) { updatesListBox.Items.Add("Unexpected error: " + ex.Message); lblStatus.Text = "Search error."; } finally { btnCheckUpdates.Enabled = true; } } private async void btnInstallUpdates_Click(object sender, EventArgs e) { // Some quick admin check if (!Utils.IsRunningAsAdmin()) { updatesListBox.Items.Add("Please restart the app as Administrator."); lblStatus.Text = "Admin rights required."; return; } // Parse selected UpdateIDs from ListBox text var ids = updatesListBox.SelectedItems.Cast() .Select(o => ExtractId(o.ToString())) .Where(id => id != null) .Distinct() .ToList(); if (ids.Count == 0) { updatesListBox.Items.Add("No updates selected."); return; } // UI state while installing btnInstallUpdates.Enabled = false; btnCheckUpdates.Enabled = false; progressBar.Visible = true; progressBar.Style = ProgressBarStyle.Marquee; lblStatus.Text = "Installing updates..."; try { var (ok, reboot) = await Task.Run(() => Install(ids)); updatesListBox.Items.Add(ok ? "Updates installed successfully." : "Update installation failed."); lblStatus.Text = reboot ? "Installation complete. Restart required." : "Installation complete."; } catch (COMException ex) { updatesListBox.Items.Add($"Install failed. HRESULT=0x{ex.HResult:X8}"); lblStatus.Text = "Install error."; } catch (Exception ex) { updatesListBox.Items.Add("Unexpected error: " + ex.Message); lblStatus.Text = "Install error."; } finally { progressBar.Style = ProgressBarStyle.Blocks; progressBar.Visible = false; btnCheckUpdates.Enabled = true; btnInstallUpdates.Enabled = true; btnInstallUpdates.Visible = true; // show again after install } } // --- Core: search available updates --- private List<(string Id, string Title, string KB)> SearchUpdates() { var resultList = new List<(string, string, string)>(); _byId.Clear(); UpdateSession s = null; IUpdateSearcher srch = null; ISearchResult res = null; try { s = new UpdateSession(); srch = s.CreateUpdateSearcher(); srch.Online = true; // query Microsoft directly; we can here set false if we rely on WSUS res = srch.Search("IsInstalled=0 and IsHidden=0"); foreach (IUpdate u in res.Updates) { var id = u?.Identity?.UpdateID; if (string.IsNullOrEmpty(id)) continue; _byId[id] = u; var kb = (u?.KBArticleIDs != null && u.KBArticleIDs.Count > 0) ? u.KBArticleIDs[0] : null; resultList.Add((id, u?.Title ?? "(no title)", kb)); } return resultList; } finally { // minimal COM cleanup (kept short) if (res != null) Marshal.FinalReleaseComObject(res); if (srch != null) Marshal.FinalReleaseComObject(srch); if (s != null) Marshal.FinalReleaseComObject(s); } } // --- Core: download + install selected updates by UpdateID --- private (bool Success, bool Reboot) Install(List ids) { // collect selected updates (skip already installed) var toDownload = new UpdateCollection(); foreach (var id in ids) if (_byId.TryGetValue(id, out var u) && !u.IsInstalled) toDownload.Add(u); if (toDownload.Count == 0) return (false, false); UpdateSession s = null; IUpdateDownloader dl = null; IDownloadResult dlRes = null; IUpdateInstaller inst = null; IInstallationResult instRes = null; try { s = new UpdateSession(); dl = s.CreateUpdateDownloader(); dl.Updates = toDownload; dlRes = dl.Download(); if (dlRes.ResultCode != OperationResultCode.orcSucceeded) return (false, false); var toInstall = new UpdateCollection(); foreach (IUpdate u in toDownload) if (u.IsDownloaded) toInstall.Add(u); if (toInstall.Count == 0) return (false, false); inst = s.CreateUpdateInstaller(); inst.Updates = toInstall; instRes = inst.Install(); var ok = instRes.ResultCode == OperationResultCode.orcSucceeded; return (ok, instRes.RebootRequired); } finally { if (instRes != null) Marshal.FinalReleaseComObject(instRes); if (inst != null) Marshal.FinalReleaseComObject(inst); if (dlRes != null) Marshal.FinalReleaseComObject(dlRes); if (dl != null) Marshal.FinalReleaseComObject(dl); if (toDownload != null) Marshal.FinalReleaseComObject(toDownload); if (s != null) Marshal.FinalReleaseComObject(s); } } // Extract "...[UpdateID]" → UpdateID private static string ExtractId(string text) { var i = text.LastIndexOf('['); var j = text.LastIndexOf(']'); return (i >= 0 && j > i) ? text.Substring(i + 1, j - i - 1) : null; } public void RefreshView() => btnCheckUpdates_Click(null, null); } } ================================================ FILE: Flyoobe/Views/UpdatesControlView.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: Flyoobe/app.manifest ================================================  true true ================================================ FILE: Flyoobe.Extensions/Developer Essentials.ps1 ================================================ # Developer Essentials – Quick access to developer tools and features # Host: console # Options: Enable Developer Mode; Install WSL; Open Windows Features (silent); Open Device Manager (silent) param([string]$choice) switch ($choice) { "Enable Developer Mode" { Write-Output "Enabling Developer Mode..." reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d 1 Write-Output "✔ Developer Mode enabled." } "Install WSL" { Write-Output "Installing Windows Subsystem for Linux..." Start-Process "wsl.exe" -ArgumentList "--install" -Verb runAs } "Open Windows Features" { Write-Output "Opening Windows Features dialog..." Start-Process "optionalfeatures.exe" } "Open Device Manager" { Write-Output "Opening Device Manager..." Start-Process "devmgmt.msc" } default { Write-Output "Unknown option: $choice" } } ================================================ FILE: Flyoobe.Extensions/EXTENSIONS.md ================================================ # Flyoobe Extensions Here you can find community extensions for Flyoobe. Copy the provided `.ps1` raw link and install it via the **Get Extensions → Install from URL** option in the app. --- ## ⚡ Power Actions **Description:** Control Windows power and session actions directly from Flyoobe. **Options:** - Restart Explorer - Restart PC - Shutdown PC - Log off - Sleep - Hibernate 🔗 [Raw script link](https://raw.githubusercontent.com/builtbybel/Flyoobe/refs/heads/main/Flyoobe.Extensions/Power%20Actions.ps1) --- ## 🛠 Developer Essentials **Description:** Quick access to developer tools and features (Dev Mode, WSL, Windows Features, Device Manager). **Options:** - Enable Developer Mode - Install WSL - Open Windows Features - Open Device Manager 🔗 [Raw script link](https://raw.githubusercontent.com/builtbybel/Flyoobe/refs/heads/main/Flyoobe.Extensions/Developer%20Essentials.ps1) ## 🌐 Network Tools **Description:** Common network troubleshooting actions (DNS flush, Winsock reset, connections, ping). **Options:** - Flush DNS - Reset Winsock - Show active connections - Test Ping (8.8.8.8) 🔗 [Raw script link](https://raw.githubusercontent.com/builtbybel/Flyoobe/refs/heads/main/Flyoobe.Extensions/Network%20Tools.ps1) --- ## 🛡 Microsoft Defender Maintenance **Description:** Update Defender signatures, repair definitions, or check Defender status. **Options:** - Update signatures - Repair definitions and update - Show Defender status 🔗 [Raw script link](https://raw.githubusercontent.com/builtbybel/Flyoobe/refs/heads/main/Flyoobe.Extensions/Microsoft%20Defender%20maintenance.ps1) --- ## 🎮 Gaming Tweaks **Description:** Optimize Windows 11 for gaming (Game Mode, HAGS, Power Plans, DVR). **Options:** - Enable Game Mode - Disable Game Mode - Toggle Hardware GPU Scheduling - Switch Power Plans - Disable Game DVR - Clear Shader Cache 🔗 [Raw script link](https://raw.githubusercontent.com/builtbybel/Flyoobe/refs/heads/main/Flyoobe.Extensions/Gaming%20tweaks.ps1) --- ================================================ FILE: Flyoobe.Extensions/Gaming tweaks.ps1 ================================================ # Description: Gaming Tweaks – optimize Windows 11 for games # Host: console # Options: Enable Game Mode; Disable Game Mode; Toggle Hardware GPU Scheduling; Switch Power Plans; Disable Game DVR; Clear Shader Cache param([string]$choice) function Is-Admin { $id = [Security.Principal.WindowsIdentity]::GetCurrent() $pr = New-Object Security.Principal.WindowsPrincipal($id) return $pr.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } switch ($choice) { "Enable Game Mode" { Write-Output "✔ Enabling Game Mode..." Set-ItemProperty -Path "HKCU:\Software\Microsoft\GameBar" -Name "AllowAutoGameMode" -Value 1 } "Disable Game Mode" { Write-Output "✔ Disabling Game Mode..." Set-ItemProperty -Path "HKCU:\Software\Microsoft\GameBar" -Name "AllowAutoGameMode" -Value 0 } "Toggle Hardware GPU Scheduling" { if (-not (Is-Admin)) { Write-Output "✘ Requires Administrator. Please run Flyoobe as Admin." break } $path = "HKLM:\SYSTEM\CurrentControlSet\Control\GraphicsDrivers" $val = (Get-ItemProperty -Path $path -Name HwSchMode -ErrorAction SilentlyContinue).HwSchMode if ($val -eq 2) { Set-ItemProperty -Path $path -Name HwSchMode -Value 1 -Type DWord Write-Output "✔ Hardware GPU Scheduling disabled (restart required)." } else { Set-ItemProperty -Path $path -Name HwSchMode -Value 2 -Type DWord Write-Output "✔ Hardware GPU Scheduling enabled (restart required)." } } "Switch Power Plans" { Write-Output "Available power plans:" powercfg /list Write-Output "" Write-Output "Use one of these commands to switch manually:" Write-Output " - Balanced: powercfg /setactive SCHEME_BALANCED" Write-Output " - High Performance: powercfg /setactive SCHEME_MIN" Write-Output " - Ultimate Performance: powercfg /setactive SCHEME_MAX" } "Disable Game DVR" { Write-Output "✔ Disabling Game DVR..." Set-ItemProperty -Path "HKCU:\System\GameConfigStore" -Name "GameDVR_Enabled" -Value 0 Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\GameDVR" -Name "AppCaptureEnabled" -Value 0 } "Clear Shader Cache" { $cache = "$env:LOCALAPPDATA\D3DSCache" if (Test-Path $cache) { Write-Output "✔ Clearing shader cache..." Remove-Item "$cache\*" -Force -Recurse -ErrorAction SilentlyContinue } else { Write-Output "ℹ Shader cache folder not found." } } default { Write-Output "✘ Unknown option: $choice" } } Write-Output "`nDone. Some changes may require restart to take effect." ================================================ FILE: Flyoobe.Extensions/Microsoft Defender maintenance.ps1 ================================================ # Microsoft Defender maintenance (update signatures, repair, show status) # Host: console # Options: Update signatures; Repair definitions and update; Show Defender status param([string]$choice) function Get-MpCmdPath { $candidates = @( "$env:ProgramFiles\Windows Defender\MpCmdRun.exe", "$env:ProgramFiles\Microsoft Defender\MpCmdRun.exe" ) foreach ($p in $candidates) { if (Test-Path $p) { return $p } } return $null } function Is-Admin { $id = [Security.Principal.WindowsIdentity]::GetCurrent() $pr = New-Object Security.Principal.WindowsPrincipal($id) return $pr.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } function Show-Status { try { $s = Get-MpComputerStatus Write-Output "=== Microsoft Defender Status ===" Write-Output ("Engine version: {0}" -f $s.AMEngineVersion) Write-Output ("Platform version: {0}" -f $s.AMProductVersion) Write-Output ("AV signature version: {0}" -f $s.AntivirusSignatureVersion) Write-Output ("AV signature last update: {0}" -f $s.AntivirusSignatureLastUpdated) Write-Output ("AS signature version: {0}" -f $s.AntispywareSignatureVersion) Write-Output ("Real-time protection: {0}" -f $s.RealTimeProtectionEnabled) Write-Output ("NIS enabled: {0}" -f $s.NISEnabled) Write-Output ("Service enabled: {0}" -f $s.AMServiceEnabled) } catch { Write-Output "✘ Failed to read Defender status: $($_.Exception.Message)" } } switch ($choice) { "Update signatures" { if (-not (Is-Admin)) { Write-Output "ℹ Tip: Run as Administrator for the most reliable results." } try { # Primary: PowerShell cmdlet Update-MpSignature -ErrorAction Stop Write-Output "✔ Signatures updated via Update-MpSignature." } catch { # Fallback: MpCmdRun $mp = Get-MpCmdPath if ($mp) { Write-Output "↻ Falling back to MpCmdRun.exe ..." & $mp -SignatureUpdate | Out-String | Write-Output } else { Write-Output "✘ MpCmdRun.exe not found and Update-MpSignature failed." } } Show-Status } "Repair definitions and update" { if (-not (Is-Admin)) { Write-Output "✘ Please run this action as Administrator (required to reset definitions)." break } $mp = Get-MpCmdPath if (-not $mp) { Write-Output "✘ MpCmdRun.exe not found." break } try { Write-Output "↻ Removing all definitions (repair) ..." & $mp -RemoveDefinitions -All | Out-String | Write-Output } catch { Write-Output "✘ Failed to remove definitions: $($_.Exception.Message)" } try { Write-Output "↻ Updating signatures ..." Update-MpSignature -ErrorAction Stop Write-Output "✔ Signatures updated." } catch { Write-Output "↻ Fallback: MpCmdRun signature update ..." & $mp -SignatureUpdate | Out-String | Write-Output } Show-Status } "Show Defender status" { Show-Status } default { Write-Output "✘ Unknown option: $choice" } } ================================================ FILE: Flyoobe.Extensions/Network Tools.ps1 ================================================ # Network Tools – Common network troubleshooting actions # Host: console # Options: Flush DNS; Reset Winsock; Show active connections; Test Ping (8.8.8.8) param([string]$choice) switch ($choice) { "Flush DNS" { Write-Output "Flushing DNS cache..." ipconfig /flushdns } "Reset Winsock" { Write-Output "Resetting Winsock..." netsh winsock reset } "Show active connections" { Write-Output "Active TCP connections:" netstat -ano } "Test Ping (8.8.8.8)" { Write-Output "Pinging Google DNS..." ping 8.8.8.8 } default { Write-Output "Unknown option: $choice" } } ================================================ FILE: Flyoobe.Extensions/Power Actions.ps1 ================================================ # Power Actions – Restart Explorer, Restart, Shutdown, Logoff, Sleep, Hibernate # Host: silent # Options: Restart Explorer; Restart PC; Shutdown PC; Log off; Sleep; Hibernate param([string]$choice) switch ($choice) { "Restart Explorer" { Write-Output "Restarting Explorer..." Stop-Process -Name explorer -Force Start-Process explorer.exe } "Restart PC" { Write-Output "Restarting computer..." Restart-Computer -Force } "Shutdown PC" { Write-Output "Shutting down computer..." Stop-Computer -Force } "Log off" { Write-Output "Logging off current user..." shutdown.exe /l } "Sleep" { Write-Output "Putting system to sleep..." rundll32.exe powrprof.dll,SetSuspendState 0,1,0 } "Hibernate" { Write-Output "Hibernating system..." rundll32.exe powrprof.dll,SetSuspendState Hibernate } default { Write-Output "Unknown option: $choice" } } ================================================ FILE: Flyoobe.Extensions/Write-an-Extension.md ================================================ # 🆕 Setup Extensions — Technical Guide (Host · Options · Input) The Setup Extensions system lets you drop PowerShell scripts into `.\scripts\` and have them show up automatically in the Setup Extensions page. Scripts declare behavior via simple header metadata. **This doc explains:** - Which metadata keys are supported - How options & inputs are passed to your script - Host modes (embedded/console/log) and per-option overrides - Categories (Pre/Mid/Post) and filtering --- # ✅ Supported Script Metadata (header comments) Add these at the top of your .ps1: **Description** `# Description: ` - Short, user-friendly description shown under the title. **Category** `# Category: Pre | Mid | Post | All | Tool` - Used to filter views like Pre-Setup, Post-Setup, etc. - Omit or use All to show in every category. **Host** `# Host: embedded | console | log` (default: embedded) - `embedded`: runs inside the app; stdout/stderr is captured and shown in UI - `console`: launches external PowerShell with -NoExit - `log`: runs embedded and streams to the app’s Live Log window **Options** - `# Options: value1; value2; value3; ... `(optional) - Adds a dropdown to pick an action. - The selected value is passed to the script as the first positional argument ($Option or $args[0]). **Per-option host override suffixes (optional):** - `"Action (console)"` → force external console - `"Action (silent)"` → force embedded without log - `"Action (log)"` → force embedded with live log (The suffix is removed before passing the option text to the script.) **Textbox** - `# Input: true | false` (optional) - Shows a text box below the options if true. - The entered text is passed as the second positional argument `($ArgsText or $args[1])`. - `# InputPlaceholder:` (optional, requires `# Input: true`) - Visual placeholder shown in the input box (e.g., hints like Enter IDs…). --- ## 🎛️ How arguments are passed (important) To keep maximum compatibility with new and legacy scripts: - The app uses positional arguments when calling your script: `powershell.exe -NoProfile -ExecutionPolicy Bypass -File "" "