Compare commits

..
33 Commits
Author SHA1 Message Date
Belim ee88265fc7 Merge pull request #310 from bact/patch-1
Update README for Flyoobe links
2025-09-14 09:51:00 +02:00
Arthit Suriyawongkul b8be95a820 Update README for Flyoobe links
Flyby11 -> Flyoobe in links and in the text, where is supposed to

Signed-off-by: Arthit Suriyawongkul <arthit@gmail.com>
2025-09-14 08:18:34 +01:00
Belim 714ac49d91 Update Developer Essentials.ps1 with silent options 2025-09-12 21:48:23 +02:00
Belim cfe5fea46e Extensions: Add Dev Essentials, Network Tools 2025-09-12 21:45:29 +02:00
Belim 594c2fb051 Update EXTENSIONS.md 2025-09-12 21:44:32 +02:00
Belim c3aab0277c Update EXTENSIONS.md 2025-09-12 21:16:53 +02:00
Belim 55a65e0bce Extension: Add Power Actions script 2025-09-12 21:15:59 +02:00
Belim c78b71bdc5 Update README.md 2025-09-11 20:19:48 +02:00
Belim 95a05390ec Create .gitattributes 2025-09-11 17:20:14 +02:00
Belim 416a8ee475 Archived and forgotten in 1.10. ToolSpot 2025-09-11 17:18:32 +02:00
Belim 44543166d4 Rest in code: Flyby11 2025-09-11 17:17:22 +02:00
Belim e6ec735242 Rest in code: Flyby11 2025-09-11 17:16:51 +02:00
Belim 08bd643f22 Rest in code: Flyby11 2025-09-11 17:15:56 +02:00
Belim 33415eeb6d Merge branch 'main' of https://github.com/builtbybel/Flyoobe 2025-09-11 17:13:47 +02:00
Belim 89accb614c Butterfly: Final Merge 2025-09-11 17:13:10 +02:00
Belim 79a8ddee7e Update EXTENSIONS.md 2025-09-08 21:12:06 +02:00
Belim cae76430ae Add files via upload 2025-09-08 21:11:35 +02:00
Belim 03ad5e2051 Update EXTENSIONS.md 2025-09-08 21:08:30 +02:00
Belim 5d91d42fc4 Update EXTENSIONS.md 2025-09-08 21:07:12 +02:00
Belim 24a8820904 Add files via upload 2025-09-08 21:06:43 +02:00
Belim 21fec64a2a Create EXTENSIONS.md 2025-09-08 21:05:29 +02:00
Belim bad09ce2c4 Delete Write-an-Extension.md 2025-09-07 15:50:04 +02:00
Belim f001c0c076 Delete Flyoobe.Extensions/Info.MD 2025-09-07 15:49:48 +02:00
Belim 4b5fdc2366 Create Write-an-Extension.md 2025-09-07 15:49:40 +02:00
Belim f1b5e4edb4 Create Info.MD 2025-09-07 15:49:11 +02:00
Belim c15b200a08 Delete Flyoobe.Extensions 2025-09-07 15:48:44 +02:00
Belim 25a23cf32e Create Flyoobe.Extensions 2025-09-07 15:48:32 +02:00
Belim d34e522d0e Update Write-an-Extension.md 2025-09-07 15:47:31 +02:00
Belim 4250d61c02 Create Write-an-Extension.md 2025-09-07 15:45:36 +02:00
Belim 377014f571 Merge pull request #284 from bovirus/main
Update Strings.it.resx
2025-09-05 08:06:58 +02:00
Belim dea23eaf28 Merge branch 'main' of https://github.com/builtbybel/Flyby11 2025-09-04 18:10:17 +02:00
Belim 257d6cd6c3 Commit InstallView, UpgradeView 2025-09-04 18:10:14 +02:00
bovirus 310521ab05 Update Strings.it.resx 2025-08-30 11:01:33 +02:00
145 changed files with 9570 additions and 578 deletions

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
*.c linguist-language=C
*.h linguist-language=C
*.cpp linguist-language=C++
*.cc linguist-language=C++
*.hpp linguist-language=C++
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -3,7 +3,7 @@ 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", "FlybyScript\Flyby11.csproj", "{503AF34B-7544-4C43-A099-2B948C3FF49A}"
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
File renamed without changes.
File renamed without changes.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

File renamed without changes.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -130,9 +130,10 @@
<EmbeddedResource Include="Locales\Strings.hu.resx" />
<EmbeddedResource Include="Locales\Strings.it.resx" />
<EmbeddedResource Include="Locales\Strings.ja.resx" />
<EmbeddedResource Include="Locales\Strings.ko.resx" />
<EmbeddedResource Include="Locales\Strings.nl.resx" />
<EmbeddedResource Include="Locales\Strings.pl.resx" />
<EmbeddedResource Include="Locales\Strings.ru.resx" />
<EmbeddedResource Include="Locales\Strings.pt-BR.resx" />
<EmbeddedResource Include="Locales\Strings.sv-SE.resx" />
<EmbeddedResource Include="Locales\Strings.tr.resx" />
<EmbeddedResource Include="Locales\Strings.zh-CN.resx" />
File renamed without changes.
@@ -280,6 +280,6 @@
<value>Kiválasztás a számítógépről</value>
</data>
<data name="msgClosing" xml:space="preserve">
<value>Köszönöm, hogy használja az alkalmazásomat!\n\nEzt az alkalmazást a szabadidőmben fejlesztettem ki, hogy segítsek frissíteni a Windows 10-ről a Windows 11-re - még olyan számítógépeken is, amelyek a Microsoft hardverkövetelményei szerint normál esetben nem támogatottak.\n\nAz alkalmazásom segít elkerülni az új számítógép vásárlását, és aktívan hozzájárul a felesleges elektronikai hulladék csökkentéséhez. \nNormális esetben nem számítok fel semmit a projektjeimért - sem a fejlesztésért, sem a támogatásért.\nMivel azonban ez az alkalmazás lényegesen átfogóbb, több funkciót kínál, és több támogatást igényel, hálás lennék, ha fontolóra venné egy kis önkéntes adományozás lehetőségét, ha képes rá.\nTermészetesen csak akkor, ha szeretné és megengedheti magának.\n\nSzeretne most adományozni a PayPal-on?</value>
<value>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?</value>
</data>
</root>
</root>
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
@@ -58,228 +58,228 @@
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="compPatch_debugCancel" xml:space="preserve">
<value>사용자가 바이패스 패치를 취소했습니다.</value>
</data>
</data>
<data name="compPatch_debugNotRemovableDrive" xml:space="preserve">
<value>사용자가 제거할 수 없는 드라이브를 선택하려고 했습니다.</value>
</data>
</data>
<data name="compPatch_debugNoUSBDrive" xml:space="preserve">
<value>패치할 USB 드라이브를 선택하지 않았습니다.</value>
</data>
</data>
<data name="compPatch_msgFailedEx" xml:space="preserve">
<value>바이패스 패치 적용에 실패했습니다:</value>
</data>
</data>
<data name="compPatch_msgNotRemovableDrive" xml:space="preserve">
<value>선택한 경로는 이동식 드라이브가 아닙니다. USB 드라이브를 선택하세요.</value>
</data>
</data>
<data name="compPatch_msgSelectDrive" xml:space="preserve">
<value>Windows 11 설치 파일이 들어 있는 USB 드라이브를 선택하세요.\n이 기능은 특정 시스템 요구 사항을 우회하는 호환성 패치를 추가합니다.\nRufus를 포함한 모든 도구로 준비된 드라이브와 호환됩니다. 드라이브가 준비되었는지 확인하세요!</value>
</data>
</data>
<data name="compPatch_msgSelectDriveConfirm" xml:space="preserve">
<value>선택한 USB 드라이브에 호환성 우회 설정이 적용됩니다. 계속하시겠습니까?</value>
</data>
</data>
<data name="compPatch_msgSuccess" xml:space="preserve">
<value>바이패스 패치가 성공적으로 적용되었습니다!</value>
</data>
</data>
<data name="ctl_FormTitle" xml:space="preserve">
<value>Flyby11 업그레이드 도우미</value>
</data>
</data>
<data name="ctl_inkCompPatch" xml:space="preserve">
<value>ISO에 호환성 패치 적용 (새로 설치)</value>
</data>
</data>
<data name="ctl_linkCiuv" xml:space="preserve">
<value>Windows 11로 업그레이드할 수 있나요?</value>
</data>
</data>
<data name="ctl_linkVote" xml:space="preserve">
<value>업그레이드가 제대로 됐나요?</value>
</data>
</data>
<data name="ctl_statusLabel" xml:space="preserve">
<value>Windows 11 ISO를 끌어서 놓아 패치하고 지원되지 않는 하드웨어에 설치합니다 (내부 업그레이드).</value>
</data>
</data>
<data name="faq_a1" xml:space="preserve">
<value>답변: Microsoft 공식 웹사이트에서 최신 ISO를 다운로드하거나 Fido 다운로더를 사용할 수 있습니다.</value>
</data>
</data>
<data name="faq_a2" xml:space="preserve">
<value>답변: Windows 11을 성공적으로 설치하고 비용을 약간 절약했다면 감사의 표시로 여기에 작은 글을 남겨주세요.</value>
</data>
</data>
<data name="faq_a2Link" xml:space="preserve">
<value>여기를 클릭하여 기부하고 지지를 표해주세요.</value>
</data>
</data>
<data name="faq_a3" xml:space="preserve">
<value>답변: ISO가 마운트되면 설치 프로세스가 백그라운드에서 실행됩니다. Windows 설치 프로그램이 시작되어 컴퓨터에 Windows 11을 설치하는 데 필요한 단계를 안내합니다.</value>
</data>
</data>
<data name="faq_a4" xml:space="preserve">
<value>답변: 오류 메시지를 확인하시고 GitHub에 보고해 주세요.</value>
</data>
</data>
<data name="faq_a5" xml:space="preserve">
<value>답변: 네, Microsoft는 백도어를 열어 두었습니다. 이 방법은 Windows Server 설치 변형을 사용하는 Windows 11 설치 프로세스의 기능을 활용합니다. 일반 Windows 11 설치와 달리, 이 변형은 대부분의 하드웨어 호환성 검사를 건너뜁니다.</value>
</data>
</data>
<data name="faq_a6" xml:space="preserve">
<value>답변: Microsoft에 따르면 PC는 폐기해야 한다고 합니다. 저라면 Windows에서 Linux로 바꾸고 PC를 폐기하는 것을 추천합니다.</value>
</data>
</data>
<data name="faq_a7" xml:space="preserve">
<value>답변: 개발자는 Belim이며 Builtbybel로도 알려져 있습니다. 그는 Windows 커뮤니티에 많은 코드를 기여했습니다.</value>
</data>
</data>
<data name="faq_a7Link" xml:space="preserve">
<value>개발자의 작업에 대해 자세히 알아보려면 여기를 클릭하세요.</value>
</data>
</data>
<data name="faq_downloadFido" xml:space="preserve">
<value>Fido를 통해 다운로드 (권장)</value>
</data>
</data>
<data name="faq_downloadMS" xml:space="preserve">
<value>Microsoft 사이트</value>
</data>
</data>
<data name="faq_header" xml:space="preserve">
<value>자주 묻는 질문 (FAQ)</value>
</data>
</data>
<data name="faq_q1" xml:space="preserve">
<value>질문: 최신 Windows 11 ISO는 어디서 구할 수 있나요?</value>
</data>
</data>
<data name="faq_q2" xml:space="preserve">
<value>질문: 개발자를 어떻게 지원할 수 있나요?</value>
</data>
</data>
<data name="faq_q3" xml:space="preserve">
<value>질문: ISO를 마운트한 후 설정 과정은 어떻게 진행되나요?</value>
</data>
</data>
<data name="faq_q4" xml:space="preserve">
<value>질문: 설치 중에 문제가 발생하면 어떻게 해야 하나요?</value>
</data>
</data>
<data name="faq_q5" xml:space="preserve">
<value>질문: 이 방법을 사용하는 것이 합법인가요?</value>
</data>
</data>
<data name="faq_q6" xml:space="preserve">
<value>질문: 내 PC가 지원되지 않는 경우 어떤 대안이 있나요?</value>
</data>
</data>
<data name="faq_q7" xml:space="preserve">
<value>질문: 개발자는 누구인가요?</value>
</data>
</data>
<data name="ciuView_lblPtAns" xml:space="preserve">
<value>1. 해당 기기는 현재 지원되는 Windows 10 버전을 실행 중입니다. 해당 기기가 현재 지원되는 Windows 10 버전을 실행하고 있지 않은 경우, 지원되는 Windows 10 버전으로 업그레이드하세요.</value>
</data>
</data>
<data name="ciuView_lblPtAns2" xml:space="preserve">
<value>2. 장치가 만족합니다</value>
</data>
</data>
<data name="ciuView_lblPtAns3" xml:space="preserve">
<value>1. 다운로드하고 실행하세요</value>
</data>
</data>
<data name="ciuView_lblPtAns4" xml:space="preserve">
<value>2. 다음 Windows 업데이트 바로 가기를 선택한 다음 업데이트 확인 버튼을 선택합니다.</value>
</data>
</data>
<data name="ciuView_lblPtAns5" xml:space="preserve">
<value>3. 기기가 Windows 11 공식 요구 사항을 충족하지 못하시나요? Windows 업데이트를 통해 호환성 패치를 적용하여 현재 위치 업그레이드를 활성화할 수 있습니다.</value>
</data>
</data>
<data name="ciuView_lblPtHdr" xml:space="preserve">
<value>다음 기준을 충족하는 경우 기존 Windows 10 장치를 Windows 11로 업그레이드할 수 있습니다.</value>
</data>
</data>
<data name="ciuView_lblPtHdr2" xml:space="preserve">
<value>Windows 10 장치가 Windows 11로 업그레이드할 수 있는지 확인하려면 다음 옵션 중 하나를 따르세요.</value>
</data>
</data>
<data name="ciuView_linkPtAns2" xml:space="preserve">
<value>Windows 11을 실행하기 위한 최소 하드웨어 사양.</value>
</data>
</data>
<data name="ciuView_linkPtAns3" xml:space="preserve">
<value>WhyNotWin11 앱을 사용하여 기기가 최소 시스템 요구 사항을 충족하는지 확인하세요.</value>
</data>
</data>
<data name="msg_InstallReady" xml:space="preserve">
<value>이제 Windows 11 설치를 진행할 수 있습니다. 설치 창의 지침을 따르세요.</value>
<comment>Install</comment>
</data>
</data>
<data name="_debugInstallReady" xml:space="preserve">
<value>지원되지 않는 하드웨어에 Windows 11을 설치할 준비가 되었습니다! 'Windows Server' 메시지는 무시하세요. 설치가 완료되었습니다!</value>
<comment>Install</comment>
</data>
</data>
<data name="_debugInstallRunElevated" xml:space="preserve">
<value>상승된 권한으로 설정 프로세스를 시작합니다...</value>
<comment>Install</comment>
</data>
</data>
<data name="_debugStatusHandleIsoEx" xml:space="preserve">
<value>어머나! 오류가 발생했습니다.</value>
<comment>Mounting</comment>
</data>
</data>
<data name="_debugStatusMounting" xml:space="preserve">
<value>ISO 마운트... 잠깐만요!</value>
<comment>Mounting</comment>
</data>
</data>
<data name="_debugStatusMountingFailed" xml:space="preserve">
<value>ISO를 마운트하지 못했습니다. 다시 시도해 주세요.</value>
<comment>Mounting</comment>
</data>
</data>
<data name="_debugStatusMountingSuccess" xml:space="preserve">
<value>ISO가 성공적으로 마운트되었습니다! 이제 Windows 11을 준비하세요!</value>
<comment>Mounting</comment>
</data>
</data>
<data name="_debugStatusRunning" xml:space="preserve">
<value>거의 다 왔어요! 설치 준비를 하고 있어요...</value>
<comment>Install</comment>
</data>
</data>
<data name="_debugStatusSetupFileNotFound" xml:space="preserve">
<value>설치 파일을 찾을 수 없습니다</value>
<comment>Mounting</comment>
</data>
</data>
<data name="ctl_linkSelectComputer" xml:space="preserve">
<value>컴퓨터에서 선택</value>
</data>
</data>
<data name="msgClosing" xml:space="preserve">
<value>제 앱을 사용해주셔서 감사합니다!\n\n저는 여가 시간에 Windows 10에서 Windows 11로 업그레이드하는 데 도움이 되는 이 애플리케이션을 개발했습니다. Microsoft 하드웨어 요구 사항에 따라 일반적으로 지원되지 않는 PC에서도 사용할 수 있습니다.\n\n제 앱은 새 컴퓨터를 구매하지 않도록 도와주고 불필요한 전자 폐기물을 줄이는 데 적극적으로 기여합니다.\n\n일반적으로 저는 프로젝트에 대해 개발이나 지원 비용을 청구하지 않습니다.\n하지만 이 앱은 훨씬 더 포괄적이고, 더 많은 기능을 제공하며, 더 많은 지원이 필요하므로 가능하시다면 소액의 자발적인 기부를 고려해 주시면 감사하겠습니다.\n\n물론, 기부를 원하고 경제적으로 여유가 있으시다면 가능합니다.\n\n지금 PayPal로 기부하시겠습니까?</value>
</data>
</data>
</root>
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Buildnummer
// Revision
//
[assembly: AssemblyVersion("3.0.500")]
[assembly: AssemblyFileVersion("3.0.500")]
[assembly: AssemblyVersion("3.10.510")]
[assembly: AssemblyFileVersion("3.10.510")]
File renamed without changes.
File renamed without changes.
+15
View File
@@ -0,0 +1,15 @@
// CpuCheck.cpp
#include "pch.h"
#include <intrin.h>
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;
}
+155
View File
@@ -0,0 +1,155 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{7a2dd9d3-5d3d-46e8-976a-51a6304ccf45}</ProjectGuid>
<RootNamespace>Flyby11</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;FLYBY11_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
<ClInclude Include="pch.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="CpuCheck.cpp" />
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Quelldateien">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Headerdateien">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Ressourcendateien">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h">
<Filter>Headerdateien</Filter>
</ClInclude>
<ClInclude Include="pch.h">
<Filter>Headerdateien</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
<ClCompile Include="pch.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
<ClCompile Include="CpuCheck.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
</ItemGroup>
</Project>
+19
View File
@@ -0,0 +1,19 @@
// 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;
}
+5
View File
@@ -0,0 +1,5 @@
#pragma once
#define WIN32_LEAN_AND_MEAN // Selten verwendete Komponenten aus Windows-Headern ausschließen
// Windows-Headerdateien
#include <windows.h>
+5
View File
@@ -0,0 +1,5 @@
// 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.
+13
View File
@@ -0,0 +1,13 @@
// 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
@@ -0,0 +1,33 @@
# 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"
}
}
+66
View File
@@ -0,0 +1,66 @@
# 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)
---
+74
View File
@@ -0,0 +1,74 @@
# 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."
@@ -0,0 +1,102 @@
# 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"
}
}
+31
View File
@@ -0,0 +1,31 @@
# 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"
}
}
+43
View File
@@ -0,0 +1,43 @@
# 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"
}
}
+38
View File
@@ -0,0 +1,38 @@
# 🆕 Setup Extensions: Host + Options Support
The **Setup Extensions** system now supports extended script metadata in the header.
This allows script authors to define dropdown menus and control how the script is executed.
---
## ✅ New Metadata Parameters
### `# Description: <string>`
- Short, user-friendly description of what the script does.
- Displayed in the Extensions page below the title.
### `# Host: embedded | console`
- **embedded** = run inside OOBE, output is captured and shown in the app.
- **console** = run in an external PowerShell window with `-NoExit`.
- **Default:** `embedded` (if not specified).
### `# Options: value1; value2; value3; ...`
- Defines multiple selectable actions for a single script.
- A dropdown is automatically shown in the Extensions page.
- The selected value is passed to the script as `$choice`.
---
## 📄 Example Script Header
```powershell
# Description: File Explorer tweaks
# Host: embedded
# Options: Show file extensions; Hide file extensions; Open This PC
param([string]$choice)
switch ($choice) {
"Show file extensions" { ... }
"Hide file extensions" { ... }
"Open This PC" { ... }
}
@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36414.22
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flyoobe.Spot", "Flyoobe.ToolSpot\Flyoobe.Spot.csproj", "{1133824D-6F42-48D4-8F18-A93AB7403DB7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1133824D-6F42-48D4-8F18-A93AB7403DB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1133824D-6F42-48D4-8F18-A93AB7403DB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1133824D-6F42-48D4-8F18-A93AB7403DB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1133824D-6F42-48D4-8F18-A93AB7403DB7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B22B36E3-C594-46AF-AF57-3C03B2F97541}
EndGlobalSection
EndGlobal
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1" />
</startup>
</configuration>
@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{1133824D-6F42-48D4-8F18-A93AB7403DB7}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Flyoobe.Spot</RootNamespace>
<AssemblyName>spot</AssemblyName>
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.manifest" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
@@ -0,0 +1,105 @@
namespace Flyoobe.ToolSpot
{
partial class MainForm
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.listResults = new System.Windows.Forms.ListBox();
this.textSearch = new System.Windows.Forms.TextBox();
this.labelStatus = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// listResults
//
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)(249)))), ((int)(((byte)(243)))), ((int)(((byte)(240)))));
this.listResults.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.listResults.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.listResults.FormattingEnabled = true;
this.listResults.ItemHeight = 17;
this.listResults.Location = new System.Drawing.Point(25, 72);
this.listResults.Name = "listResults";
this.listResults.Size = new System.Drawing.Size(504, 170);
this.listResults.TabIndex = 5;
this.listResults.TabStop = false;
this.listResults.DoubleClick += new System.EventHandler(this.listResults_DoubleClick);
this.listResults.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listResults_KeyDown);
//
// 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(25, 26);
this.textSearch.Name = "textSearch";
this.textSearch.Size = new System.Drawing.Size(504, 29);
this.textSearch.TabIndex = 1;
this.textSearch.Text = "Search";
this.textSearch.Click += new System.EventHandler(this.textSearch_Click);
this.textSearch.TextChanged += new System.EventHandler(this.textSearch_TextChanged);
//
// labelStatus
//
this.labelStatus.Dock = System.Windows.Forms.DockStyle.Bottom;
this.labelStatus.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelStatus.Location = new System.Drawing.Point(0, 251);
this.labelStatus.Name = "labelStatus";
this.labelStatus.Size = new System.Drawing.Size(557, 21);
this.labelStatus.TabIndex = 2;
//
// MainForm
//
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.ClientSize = new System.Drawing.Size(557, 272);
this.Controls.Add(this.labelStatus);
this.Controls.Add(this.textSearch);
this.Controls.Add(this.listResults);
this.Name = "MainForm";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Spot";
this.Load += new System.EventHandler(this.Form1_Load);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListBox listResults;
private System.Windows.Forms.TextBox textSearch;
private System.Windows.Forms.Label labelStatus;
}
}
@@ -0,0 +1,209 @@
/// This tool is part of my Flyoobe app
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace Flyoobe.ToolSpot
{
public partial class MainForm : Form
{ // Path of the text DB
public string DatabasePath { get; set; } =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "spot.txt");
// In-memory list of all tools
private readonly List<ToolItem> _all = new List<ToolItem>();
public MainForm()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
LoadDatabase();
//ApplyFilter(); // show all initially
textSearch.Focus();
}
private void SetStatus(string text)
{
if (labelStatus != null) labelStatus.Text = text;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
// close it
var form = this.FindForm();
form?.Close();
}
}
private void listResults_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) { LaunchSelected(); e.Handled = true; }
}
private void listResults_DoubleClick(object sender, EventArgs e) => LaunchSelected();
private void textSearch_TextChanged(object sender, EventArgs e) => ApplyFilter();
/// <summary>
/// Reads toolspot.txt (Name;Command). Ignores empty and comment lines.
/// </summary>
private void LoadDatabase()
{
_all.Clear();
if (!File.Exists(DatabasePath))
{
SetStatus($"Database not found: {DatabasePath}");
return;
}
foreach (var line in File.ReadAllLines(DatabasePath))
{
var trimmed = line.Trim();
if (string.IsNullOrEmpty(trimmed)) continue;
if (trimmed.StartsWith("#")) continue;
var item = ParseLine(trimmed);
if (item != null) _all.Add(item);
}
SetStatus($"Loaded {_all.Count} tools.");
}
/// <summary>
/// Parses "Name;Command" lines. Returns null if malformed.
/// </summary>
private ToolItem ParseLine(string line)
{
var parts = line.Split(new[] { ';' }, 2);
if (parts.Length != 2) return null;
var name = parts[0].Trim();
var cmd = parts[1].Trim();
if (name.Length == 0 || cmd.Length == 0) return null;
return new ToolItem(name, cmd);
}
/// <summary>
/// Filters list by substring (case-insensitive) from textSearch.
/// </summary>
private void ApplyFilter()
{
var q = (textSearch.Text ?? string.Empty).Trim().ToLower();
var list = string.IsNullOrEmpty(q)
? _all
: _all.Where(t => t.Name.ToLower().Contains(q)).ToList();
listResults.BeginUpdate();
listResults.Items.Clear();
foreach (var t in list) listResults.Items.Add(t);
listResults.EndUpdate();
if (listResults.Items.Count > 0) listResults.SelectedIndex = 0;
SetStatus(listResults.Items.Count > 0 ? $"{listResults.Items.Count} result(s)" : "No results");
}
/// <summary>
/// Launches the selected tool's command. Supports URIs, .msc/.cpl, exe + args.
/// </summary>
private void LaunchSelected()
{
if (!(listResults.SelectedItem is ToolItem t)) return;
try
{
// Split command into FileName + Arguments (handles quoted paths)
SplitCommand(t.Command, out var fileName, out var args);
var psi = new ProcessStartInfo
{
FileName = fileName,
Arguments = args,
UseShellExecute = true // required for ms-settings:, .msc/.cpl
};
Process.Start(psi);
}
catch (Exception ex)
{
MessageBox.Show("Could not launch: " + ex.Message, "Quick Tools",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Splits a command line into executable and arguments.
/// Examples:
/// notepad.exe
/// "C:\Path With Spaces\app.exe" --flag
/// chrome.exe --settings
/// For URIs / shell verbs (e.g., ms-settings:...), no split is needed.
/// </summary>
private void SplitCommand(string command, out string fileName, out string args)
{
command = command.Trim();
// If it's a URI-like command (ms-settings:, http:, etc.), pass as-is.
if (command.Contains(":") && !command.Contains("\\"))
{
fileName = command;
args = string.Empty;
return;
}
// Quoted path case: "C:\Program Files\App\app.exe" arg1 arg2
if (command.StartsWith("\""))
{
int end = command.IndexOf('"', 1);
if (end > 0)
{
fileName = command.Substring(1, end - 1);
args = command.Substring(end + 1).TrimStart();
return;
}
}
// Unquoted: split on first space
int space = command.IndexOf(' ');
if (space > 0)
{
fileName = command.Substring(0, space);
args = command.Substring(space + 1);
}
else
{
fileName = command;
args = string.Empty;
}
}
private class ToolItem
{
public string Name { get; }
public string Command { get; }
public ToolItem(string name, string command)
{ Name = name; Command = command; }
public override string ToString() => Name; // shown in ListBox
}
private void textSearch_Click(object sender, EventArgs e)
{
textSearch.Clear();
}
}
}
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Flyoobe.ToolSpot
{
internal static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
@@ -0,0 +1,33 @@
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("Spot")]
[assembly: AssemblyDescription("Flyoobe Spot")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Builtbybel")]
[assembly: AssemblyProduct("Flyoobe Spot")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("A Belim app creation")]
[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("1133824d-6f42-48d4-8f18-a93ab7403db7")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
[assembly: AssemblyVersion("0.2.0.0")]
[assembly: AssemblyFileVersion("0.2.0.0")]
@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 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.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Flyoobe.Spot.Properties {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// 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() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[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.Spot.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 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.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Flyoobe.Spot.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;
}
}
}
}
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC-Manifestoptionen
Wenn Sie die Ebene der Benutzerkontensteuerung für Windows ändern möchten, ersetzen Sie den
Knoten "requestedExecutionLevel" wie folgt.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Durch Angabe des Elements "requestedExecutionLevel" wird die Datei- und Registrierungsvirtualisierung deaktiviert.
Entfernen Sie dieses Element, wenn diese Virtualisierung aus Gründen der Abwärtskompatibilität
für die Anwendung erforderlich ist.
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Eine Liste der Windows-Versionen, unter denen diese Anwendung getestet
und für die sie entwickelt wurde. Wenn Sie die Auskommentierung der entsprechenden Elemente aufheben,
wird von Windows automatisch die kompatibelste Umgebung ausgewählt. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- Gibt an, dass die Anwendung mit DPI-Werten kompatibel ist und von Windows nicht automatisch auf höhere
DPI-Werte skaliert wird. WPF-Anwendungen (Windows Presentation Foundation) sind automatisch mit DPI-Werten kompatibel, eine Aktivierung
ist nicht erforderlich. Für Windows Forms-Anwendungen für .NET Framework 4.6, die diese Einstellung aktivieren, muss
auch die Einstellung "'EnableWindowsFormsHighDpiAutoResizing" in der Datei "app.config" auf TRUE festgelegt werden.
Hierdurch können für die Anwendung lange Pfade verwendet werden. Weitere Informationen finden Sie unter https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation.-->
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
<!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>
+51
View File
@@ -0,0 +1,51 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36221.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flyoobe", "Flyoobe\Flyoobe.csproj", "{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Flyby11", "Flyby11\Flyby11.vcxproj", "{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}"
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
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Debug|x64.ActiveCfg = Debug|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Debug|x64.Build.0 = Debug|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Debug|x86.ActiveCfg = Debug|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Debug|x86.Build.0 = Debug|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Release|Any CPU.Build.0 = Release|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Release|x64.ActiveCfg = Release|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Release|x64.Build.0 = Release|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Release|x86.ActiveCfg = Release|Any CPU
{50CA0D4D-45AD-4E03-BFC5-64FFF4CDA36C}.Release|x86.Build.0 = Release|Any CPU
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Debug|Any CPU.ActiveCfg = Debug|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Debug|Any CPU.Build.0 = Debug|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Debug|x64.ActiveCfg = Debug|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Debug|x64.Build.0 = Debug|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Debug|x86.ActiveCfg = Debug|Win32
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Debug|x86.Build.0 = Debug|Win32
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Release|Any CPU.ActiveCfg = Release|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Release|Any CPU.Build.0 = Release|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Release|x64.ActiveCfg = Release|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Release|x64.Build.0 = Release|x64
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Release|x86.ActiveCfg = Release|Win32
{7A2DD9D3-5D3D-46E8-976A-51A6304CCF45}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {263B972C-E7F5-43F6-AF4B-9C138C57DEDB}
EndGlobalSection
EndGlobal
+25 -26
View File
@@ -28,7 +28,7 @@ namespace Flyoobe
{
await Task.Delay(1000);
// Call update check when form loads
await CheckForUpdateAsync();
await CheckForUpdate();
}
private void ApplyRoundedCorners()
@@ -75,25 +75,6 @@ namespace Flyoobe
this.Region = new Region(path); // apply rounded region
}
private void btnGitHub_Click(object sender, EventArgs e)
{
Process.Start("https://github.com/builtbybel/Flyby11");
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnDonate_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
{
FileName = "https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG",
UseShellExecute = true
});
}
private void chkDonated_CheckedChanged(object sender, EventArgs e)
{
DonationHelper.SetDonationStatus(chkDonated.Checked);
@@ -112,9 +93,9 @@ namespace Flyoobe
return Version.Parse(version);
}
private async Task CheckForUpdateAsync()
private async Task CheckForUpdate()
{
const string githubApiUrl = "https://api.github.com/repos/builtbybel/Flyby11/releases/latest";
const string githubApiUrl = "https://api.github.com/repos/builtbybel/Flyoobe/releases/latest";
try
{
@@ -163,7 +144,7 @@ namespace Flyoobe
}
else
{
// User has a dev or newer version
// User has a nightly/dev or newer version
UpdateLabel($"Flyoobe version {currentVersion} (dev version?)");
}
}
@@ -180,7 +161,8 @@ namespace Flyoobe
// Update label text
linkAppVersion.Text = text;
// If clickable, show bold & underline and make cursor a hand
// If clickable,
// show bold ; underline ; make cursor a hand
if (clickable)
{
linkAppVersion.Font = new Font(linkAppVersion.Font, FontStyle.Bold | FontStyle.Underline);
@@ -201,11 +183,28 @@ namespace Flyoobe
{
Process.Start(new ProcessStartInfo
{
FileName = "https://github.com/builtbybel/Flyby11/releases/latest",
FileName = "https://github.com/builtbybel/Flyoobe/releases/latest",
UseShellExecute = true
});
}
private void btnGitHub_Click(object sender, EventArgs e)
{
Process.Start("https://github.com/builtbybel/Flyoobe");
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnDonate_Click(object sender, EventArgs e)
{
Process.Start(new ProcessStartInfo
{
FileName = "https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG",
UseShellExecute = true
});
}
}
}
-12
View File
@@ -1,6 +1,5 @@
using Flyoobe; // for FeatureNode
using Settings.Ads;
using Settings.AI;
using Settings.Edge;
using Settings.Gaming;
using Settings.Issues;
@@ -57,7 +56,6 @@ namespace Features
new FeatureNode(new EdgeShoppingAssistant()),
new FeatureNode(new FirstRunExperience()),
new FeatureNode(new GamerMode()),
new FeatureNode(new HubsSidebar()),
new FeatureNode(new ImportOnEachLaunch()),
new FeatureNode(new StartupBoost()),
new FeatureNode(new TabPageQuickLinks()),
@@ -118,16 +116,6 @@ namespace Features
new FeatureNode(new WelcomeExperienceAds())
}
},
new FeatureNode("AI")
{
Children = new List<FeatureNode>
{
new FeatureNode(new CopilotTaskbar()),
new FeatureNode(new Recall()),
new FeatureNode(new ClickToDo())
}
}
};
}
}
+5 -5
View File
@@ -7,9 +7,9 @@ namespace Settings.Privacy
{
internal class LocationTracking : FeatureBase
{
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\LocationAndSensors";
private const string valueName = "LocationEnabled";
private const int recommendedValue = 0;
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()
{
@@ -38,7 +38,7 @@ namespace Settings.Privacy
{
try
{
Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName, recommendedValue, RegistryValueKind.DWord);
return Task.FromResult(true);
}
catch (Exception ex)
@@ -53,7 +53,7 @@ namespace Settings.Privacy
{
try
{
Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord);
return true;
}
+23 -10
View File
@@ -63,6 +63,10 @@
<Compile Include="AboutForm.Designer.cs">
<DependentUpon>AboutForm.cs</DependentUpon>
</Compile>
<Compile Include="ToolHubView\ToolHubHelper.cs" />
<Compile Include="ToolHubView\ToolHubUrlDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Helper\DonationHelper.cs" />
<Compile Include="Helper\CopilotHelper.cs" />
<Compile Include="InstallView\BackupDriversProvider.cs" />
@@ -77,6 +81,7 @@
<Compile Include="InstallView\RunSetupFromIsoProvider.cs" />
<Compile Include="InstallView\ToolHelper.cs" />
<Compile Include="InstallView\VentoyProvider.cs" />
<Compile Include="UpgradeView\EsuEnrollmentHandler.cs" />
<Compile Include="UpgradeView\IsoHandler.cs" />
<Compile Include="LogForm.cs">
<SubType>Form</SubType>
@@ -89,18 +94,18 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="ToolHubView\ToolDefinition.cs" />
<Compile Include="ToolHubView\ToolHubDefinition.cs" />
<Compile Include="ToolHubView\ToolHubControlView.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="ToolHubView\ToolHubControlView.Designer.cs">
<DependentUpon>ToolHubControlView.cs</DependentUpon>
</Compile>
<Compile Include="ToolHubView\ToolItemControl.cs">
<Compile Include="ToolHubView\ToolHubItemControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="ToolHubView\ToolItemControl.Designer.cs">
<DependentUpon>ToolItemControl.cs</DependentUpon>
<Compile Include="ToolHubView\ToolHubItemControl.Designer.cs">
<DependentUpon>ToolHubItemControl.cs</DependentUpon>
</Compile>
<Compile Include="Views\AccountControlView.cs">
<SubType>UserControl</SubType>
@@ -108,6 +113,12 @@
<Compile Include="Views\AccountControlView.Designer.cs">
<DependentUpon>AccountControlView.cs</DependentUpon>
</Compile>
<Compile Include="Views\AiControlView.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Views\AiControlView.Designer.cs">
<DependentUpon>AiControlView.cs</DependentUpon>
</Compile>
<Compile Include="Views\AppsControlView.cs">
<SubType>UserControl</SubType>
</Compile>
@@ -127,9 +138,6 @@
<Compile Include="Features\Ads\TailoredExperiences.cs" />
<Compile Include="Features\Ads\TipsAndSuggestions.cs" />
<Compile Include="Features\Ads\WelcomeExperienceAds.cs" />
<Compile Include="Features\AI\ClickToDo.cs" />
<Compile Include="Features\AI\CopilotTaskbar.cs" />
<Compile Include="Features\AI\Recall.cs" />
<Compile Include="Features\Edge\BrowserSignin.cs" />
<Compile Include="Features\Edge\DefaultTopSites.cs" />
<Compile Include="Features\Edge\DefautBrowserSetting.cs" />
@@ -137,7 +145,6 @@
<Compile Include="Features\Edge\EdgeShoppingAssistant.cs" />
<Compile Include="Features\Edge\FirstRunExperience.cs" />
<Compile Include="Features\Edge\GamerMode.cs" />
<Compile Include="Features\Edge\HubsSidebar.cs" />
<Compile Include="Features\Edge\ImportOnEachLaunch.cs" />
<Compile Include="Features\Edge\StartupBoost.cs" />
<Compile Include="Features\Edge\TabPageQuickLinks.cs" />
@@ -247,12 +254,15 @@
<EmbeddedResource Include="ToolHubView\ToolHubControlView.resx">
<DependentUpon>ToolHubControlView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ToolHubView\ToolItemControl.resx">
<DependentUpon>ToolItemControl.cs</DependentUpon>
<EmbeddedResource Include="ToolHubView\ToolHubItemControl.resx">
<DependentUpon>ToolHubItemControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Views\AccountControlView.resx">
<DependentUpon>AccountControlView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Views\AiControlView.resx">
<DependentUpon>AiControlView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Views\AppsControlView.resx">
<DependentUpon>AppsControlView.cs</DependentUpon>
</EmbeddedResource>
@@ -273,6 +283,9 @@
<SubType>Designer</SubType>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Views\HomeControlView.resx">
<DependentUpon>HomeControlView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Views\InstallerControlView.resx">
<DependentUpon>InstallerControlView.cs</DependentUpon>
</EmbeddedResource>
+1 -19
View File
@@ -2,6 +2,7 @@
using System;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;
namespace Flyoobe
{
@@ -43,25 +44,6 @@ namespace Flyoobe
}
}
/// <summary>
/// Opens the GitHub project page in the default browser.
/// </summary>
public static void OpenGitHubPage(object sender, EventArgs e)
{
try
{
Process.Start(new ProcessStartInfo
{
FileName = GitHubUrl,
UseShellExecute = true
});
}
catch (Exception ex)
{
Logger.Log($"Failed to open GitHub page: {ex.Message}", LogLevel.Error);
}
}
/// <summary>
/// Checks if the application is running with administrative privileges.
/// </summary>
+50 -12
View File
@@ -5,13 +5,19 @@ using System.Windows.Forms;
namespace Flyoobe
{
// Native provider that exports all installed drivers to C:\DriversBackup using:
// pnputil.exe /export-driver * C:\DriversBackup
// 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 * <chosenParent>\DriversBackup
// Behavior:
// - Prompts user to choose a parent folder (defaults to C:\).
// - Always creates/uses "<chosenParent>\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 (exports to C:\\DriversBackup)";
public string DisplayName => "Backup installed drivers (choose folder)";
public string HomepageUrl => null;
public string DirectDownloadUrl => null;
public string[] ExactExeNames => new[] { "pnputil.exe" };
@@ -20,18 +26,48 @@ namespace Flyoobe
public bool IsExternalTool => false;
public string Hint =>
"Exports all currently installed device drivers (INF + binaries) to C:\\DriversBackup. " +
"After a clean install, point Device Manager to this folder to restore drivers even without internet.";
"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)
{
const string target = @"C:\DriversBackup";
// Default suggestion for the parent, the actual export target will be <parent>\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: <parent>\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 runs 'pnputil /export-driver *' with administrative rights."))
"\r\n\r\nThis will run 'pnputil /export-driver *' with administrative rights."))
return null;
// Ensure the target DriversBackup folder exists
try
{
Directory.CreateDirectory(target);
@@ -47,7 +83,7 @@ namespace Flyoobe
try
{
// Start pnputil as elevated process
// Start pnputil as an elevated process targeting the 'DriversBackup' subfolder
var psi = new ProcessStartInfo
{
FileName = "pnputil.exe",
@@ -69,15 +105,17 @@ namespace Flyoobe
proc.WaitForExit();
}
// Now export is complete > count drivers
// Count exported INF files to provide a quick summary
int infCount = 0;
try
{
infCount = Directory.GetFiles(target, "*.inf", SearchOption.AllDirectories).Length;
}
catch { /* ignore */ }
catch
{ // Ignore counting errors; we can still show success without the count
}
MessageBox.Show(owner,
MessageBox.Show(owner,
"Driver export completed.\r\n\r\n" +
$"Target: {target}\r\n" +
$"Exported driver packages: {infCount}\r\n\r\n" +
@@ -94,7 +132,7 @@ namespace Flyoobe
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return null;
return null; // returning null indicates no further action needed
}
}
}
+6 -6
View File
@@ -81,7 +81,7 @@
//
// btnQuickRepair
//
this.btnQuickRepair.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnQuickRepair.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | 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;
@@ -89,7 +89,7 @@
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(101, 422);
this.btnQuickRepair.Location = new System.Drawing.Point(512, 357);
this.btnQuickRepair.Name = "btnQuickRepair";
this.btnQuickRepair.Size = new System.Drawing.Size(138, 27);
this.btnQuickRepair.TabIndex = 337;
@@ -98,7 +98,7 @@
//
// btnCreateUsb
//
this.btnCreateUsb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnCreateUsb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | 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;
@@ -106,7 +106,7 @@
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(245, 422);
this.btnCreateUsb.Location = new System.Drawing.Point(656, 357);
this.btnCreateUsb.Name = "btnCreateUsb";
this.btnCreateUsb.Size = new System.Drawing.Size(138, 27);
this.btnCreateUsb.TabIndex = 338;
@@ -115,11 +115,11 @@
//
// lblOneClick
//
this.lblOneClick.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.lblOneClick.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | 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(7, 425);
this.lblOneClick.Location = new System.Drawing.Point(418, 360);
this.lblOneClick.Name = "lblOneClick";
this.lblOneClick.Size = new System.Drawing.Size(89, 27);
this.lblOneClick.TabIndex = 336;
+1 -1
View File
@@ -282,7 +282,7 @@ namespace Flyoobe
return null;
}
// Selects the provider in the combo (for UI consistency) and runs it via existing pipeline.
// 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);
+137 -66
View File
@@ -28,31 +28,40 @@
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.panelControls = new System.Windows.Forms.Panel();
this.linkHome = new System.Windows.Forms.LinkLabel();
this.btnNext = new System.Windows.Forms.Button();
this.navPanel = new System.Windows.Forms.FlowLayoutPanel();
this.linkSubHeader = new System.Windows.Forms.LinkLabel();
this.btnNotification = new System.Windows.Forms.Button();
this.panelHost = new System.Windows.Forms.Panel();
this.treeNavigation = new System.Windows.Forms.TreeView();
this.btnRefresh = new System.Windows.Forms.Button();
this.btnToolSpot = new System.Windows.Forms.Button();
this.btnExtensions = new System.Windows.Forms.Button();
this.panelContainer = new System.Windows.Forms.Panel();
this.lblHeader = new System.Windows.Forms.Label();
this.btnAbout = new System.Windows.Forms.Button();
this.btnAskCopilot = new System.Windows.Forms.Button();
this.contextDropDown = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripExtensions = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripAddExtensionUrl = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripAddExtensionLocal = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripExtensionGuide = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripExtensionSource = new System.Windows.Forms.ToolStripMenuItem();
this.panelControls.SuspendLayout();
this.panelContainer.SuspendLayout();
this.contextDropDown.SuspendLayout();
this.SuspendLayout();
//
// panelControls
//
this.panelControls.AutoScroll = true;
this.panelControls.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(247)))), ((int)(((byte)(242)))));
this.panelControls.Controls.Add(this.linkHome);
this.panelControls.Controls.Add(this.btnNext);
this.panelControls.Controls.Add(this.navPanel);
this.panelControls.Controls.Add(this.linkSubHeader);
this.panelControls.Controls.Add(this.btnNotification);
this.panelControls.Controls.Add(this.panelHost);
this.panelControls.Controls.Add(this.treeNavigation);
this.panelControls.Controls.Add(this.btnRefresh);
this.panelControls.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelControls.Location = new System.Drawing.Point(0, 0);
@@ -60,22 +69,36 @@
this.panelControls.Size = new System.Drawing.Size(883, 503);
this.panelControls.TabIndex = 3;
//
// linkHome
// btnNext
//
this.linkHome.ActiveLinkColor = System.Drawing.Color.DeepPink;
this.linkHome.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.linkHome.AutoSize = true;
this.linkHome.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 11.5F, System.Drawing.FontStyle.Bold);
this.linkHome.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkHome.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(138)))), ((int)(((byte)(211)))));
this.linkHome.Location = new System.Drawing.Point(695, 35);
this.linkHome.Name = "linkHome";
this.linkHome.Size = new System.Drawing.Size(48, 26);
this.linkHome.TabIndex = 338;
this.linkHome.TabStop = true;
this.linkHome.Text = "Setup";
this.linkHome.UseCompatibleTextRendering = true;
this.linkHome.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkHome_LinkClicked);
this.btnNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnNext.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(242)))), ((int)(((byte)(244)))));
this.btnNext.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(138)))), ((int)(((byte)(211)))));
this.btnNext.FlatAppearance.BorderSize = 0;
this.btnNext.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(215)))), ((int)(((byte)(235)))), ((int)(((byte)(255)))));
this.btnNext.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(215)))), ((int)(((byte)(235)))), ((int)(((byte)(255)))));
this.btnNext.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnNext.Font = new System.Drawing.Font("Segoe MDL2 Assets", 25.25F);
this.btnNext.ForeColor = System.Drawing.Color.Gray;
this.btnNext.Location = new System.Drawing.Point(835, 429);
this.btnNext.Name = "btnNext";
this.btnNext.Size = new System.Drawing.Size(45, 57);
this.btnNext.TabIndex = 340;
this.btnNext.TabStop = false;
this.btnNext.UseVisualStyleBackColor = false;
//
// navPanel
//
this.navPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.navPanel.AutoScroll = true;
this.navPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(247)))), ((int)(((byte)(242)))), ((int)(((byte)(244)))));
this.navPanel.Font = new System.Drawing.Font("Segoe UI Variable Small", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.navPanel.Location = new System.Drawing.Point(0, 429);
this.navPanel.Name = "navPanel";
this.navPanel.Size = new System.Drawing.Size(834, 75);
this.navPanel.TabIndex = 339;
this.navPanel.WrapContents = false;
//
// linkSubHeader
//
@@ -102,7 +125,7 @@
this.btnNotification.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(215)))), ((int)(((byte)(235)))), ((int)(((byte)(255)))));
this.btnNotification.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnNotification.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnNotification.Location = new System.Drawing.Point(748, 34);
this.btnNotification.Location = new System.Drawing.Point(729, 0);
this.btnNotification.Name = "btnNotification";
this.btnNotification.Size = new System.Drawing.Size(123, 22);
this.btnNotification.TabIndex = 337;
@@ -117,31 +140,11 @@
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.Location = new System.Drawing.Point(7, 22);
this.panelHost.Location = new System.Drawing.Point(7, 29);
this.panelHost.Name = "panelHost";
this.panelHost.Size = new System.Drawing.Size(682, 468);
this.panelHost.Size = new System.Drawing.Size(873, 400);
this.panelHost.TabIndex = 333;
//
// treeNavigation
//
this.treeNavigation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Right)));
this.treeNavigation.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(247)))), ((int)(((byte)(242)))));
this.treeNavigation.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.treeNavigation.Font = new System.Drawing.Font("Segoe UI Variable Text", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.treeNavigation.HideSelection = false;
this.treeNavigation.HotTracking = true;
this.treeNavigation.Location = new System.Drawing.Point(695, 75);
this.treeNavigation.Name = "treeNavigation";
this.treeNavigation.Scrollable = false;
this.treeNavigation.ShowLines = false;
this.treeNavigation.ShowNodeToolTips = true;
this.treeNavigation.ShowPlusMinus = false;
this.treeNavigation.ShowRootLines = false;
this.treeNavigation.Size = new System.Drawing.Size(186, 416);
this.treeNavigation.TabIndex = 3;
this.treeNavigation.TabStop = false;
//
// btnRefresh
//
this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
@@ -162,26 +165,26 @@
this.btnRefresh.UseVisualStyleBackColor = false;
this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
//
// btnToolSpot
// btnExtensions
//
this.btnToolSpot.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnToolSpot.AutoSize = true;
this.btnToolSpot.BackColor = System.Drawing.Color.Transparent;
this.btnToolSpot.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(138)))), ((int)(((byte)(211)))));
this.btnToolSpot.FlatAppearance.BorderSize = 0;
this.btnToolSpot.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(215)))), ((int)(((byte)(235)))), ((int)(((byte)(255)))));
this.btnToolSpot.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(215)))), ((int)(((byte)(235)))), ((int)(((byte)(255)))));
this.btnToolSpot.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnToolSpot.Font = new System.Drawing.Font("Segoe MDL2 Assets", 10.25F);
this.btnToolSpot.ForeColor = System.Drawing.Color.Black;
this.btnToolSpot.Location = new System.Drawing.Point(916, 1);
this.btnToolSpot.Name = "btnToolSpot";
this.btnToolSpot.Size = new System.Drawing.Size(26, 25);
this.btnToolSpot.TabIndex = 338;
this.btnToolSpot.TabStop = false;
this.btnToolSpot.Text = "...";
this.btnToolSpot.UseVisualStyleBackColor = false;
this.btnToolSpot.Click += new System.EventHandler(this.btnToolSpot_Click);
this.btnExtensions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnExtensions.AutoSize = true;
this.btnExtensions.BackColor = System.Drawing.Color.Transparent;
this.btnExtensions.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(138)))), ((int)(((byte)(211)))));
this.btnExtensions.FlatAppearance.BorderSize = 0;
this.btnExtensions.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(215)))), ((int)(((byte)(235)))), ((int)(((byte)(255)))));
this.btnExtensions.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(215)))), ((int)(((byte)(235)))), ((int)(((byte)(255)))));
this.btnExtensions.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnExtensions.Font = new System.Drawing.Font("Segoe MDL2 Assets", 11.5F, System.Drawing.FontStyle.Bold);
this.btnExtensions.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.btnExtensions.Location = new System.Drawing.Point(913, 1);
this.btnExtensions.Name = "btnExtensions";
this.btnExtensions.Size = new System.Drawing.Size(29, 27);
this.btnExtensions.TabIndex = 338;
this.btnExtensions.TabStop = false;
this.btnExtensions.Text = "...";
this.btnExtensions.UseVisualStyleBackColor = false;
this.btnExtensions.Click += new System.EventHandler(this.btnExtensions_Click);
//
// panelContainer
//
@@ -249,13 +252,73 @@
this.btnAskCopilot.UseVisualStyleBackColor = false;
this.btnAskCopilot.Click += new System.EventHandler(this.btnAskCopilot_Click);
//
// contextDropDown
//
this.contextDropDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(247)))), ((int)(((byte)(242)))));
this.contextDropDown.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 10.5F);
this.contextDropDown.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripExtensions,
this.toolStripAddExtensionUrl,
this.toolStripAddExtensionLocal,
this.toolStripExtensionGuide,
this.toolStripSeparator1,
this.toolStripExtensionSource});
this.contextDropDown.Name = "contextDropDown";
this.contextDropDown.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
this.contextDropDown.Size = new System.Drawing.Size(200, 176);
//
// toolStripExtensions
//
this.toolStripExtensions.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
this.toolStripExtensions.Name = "toolStripExtensions";
this.toolStripExtensions.Size = new System.Drawing.Size(199, 24);
this.toolStripExtensions.Text = "Manage extensions";
this.toolStripExtensions.Click += new System.EventHandler(this.toolStripExtensions_Click);
//
// toolStripAddExtensionUrl
//
this.toolStripAddExtensionUrl.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0);
this.toolStripAddExtensionUrl.Name = "toolStripAddExtensionUrl";
this.toolStripAddExtensionUrl.Size = new System.Drawing.Size(199, 24);
this.toolStripAddExtensionUrl.Text = "Install from Url...";
this.toolStripAddExtensionUrl.Click += new System.EventHandler(this.toolStripAddExtensionUrl_Click);
//
// toolStripAddExtensionLocal
//
this.toolStripAddExtensionLocal.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0);
this.toolStripAddExtensionLocal.Name = "toolStripAddExtensionLocal";
this.toolStripAddExtensionLocal.Size = new System.Drawing.Size(199, 24);
this.toolStripAddExtensionLocal.Text = "Import from file...";
this.toolStripAddExtensionLocal.Click += new System.EventHandler(this.toolStripAddExtensionLocal_Click);
//
// toolStripExtensionGuide
//
this.toolStripExtensionGuide.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0);
this.toolStripExtensionGuide.Name = "toolStripExtensionGuide";
this.toolStripExtensionGuide.Size = new System.Drawing.Size(199, 24);
this.toolStripExtensionGuide.Text = "Write an extension";
this.toolStripExtensionGuide.Click += new System.EventHandler(this.toolStripExtensionGuide_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(196, 6);
//
// toolStripExtensionSource
//
this.toolStripExtensionSource.Margin = new System.Windows.Forms.Padding(0, 5, 0, 2);
this.toolStripExtensionSource.Name = "toolStripExtensionSource";
this.toolStripExtensionSource.Size = new System.Drawing.Size(199, 24);
this.toolStripExtensionSource.Text = "Extension folder...";
this.toolStripExtensionSource.Click += new System.EventHandler(this.toolStripExtensionSource_Click);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(154)))), ((int)(((byte)(154)))), ((int)(((byte)(154)))));
this.ClientSize = new System.Drawing.Size(945, 565);
this.Controls.Add(this.btnToolSpot);
this.Controls.Add(this.btnExtensions);
this.Controls.Add(this.btnAbout);
this.Controls.Add(this.btnAskCopilot);
this.Controls.Add(this.panelContainer);
@@ -271,6 +334,7 @@
this.panelControls.ResumeLayout(false);
this.panelControls.PerformLayout();
this.panelContainer.ResumeLayout(false);
this.contextDropDown.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -284,11 +348,18 @@
private System.Windows.Forms.Button btnAskCopilot;
private System.Windows.Forms.Button btnAbout;
private System.Windows.Forms.Button btnNotification;
private System.Windows.Forms.TreeView treeNavigation;
private System.Windows.Forms.Panel panelHost;
private System.Windows.Forms.LinkLabel linkSubHeader;
private System.Windows.Forms.Button btnToolSpot;
private System.Windows.Forms.LinkLabel linkHome;
private System.Windows.Forms.FlowLayoutPanel navPanel;
private System.Windows.Forms.Button btnNext;
private System.Windows.Forms.ContextMenuStrip contextDropDown;
private System.Windows.Forms.ToolStripMenuItem toolStripAddExtensionUrl;
private System.Windows.Forms.ToolStripMenuItem toolStripAddExtensionLocal;
private System.Windows.Forms.ToolStripMenuItem toolStripExtensionGuide;
private System.Windows.Forms.ToolStripMenuItem toolStripExtensionSource;
private System.Windows.Forms.Button btnExtensions;
private System.Windows.Forms.ToolStripMenuItem toolStripExtensions;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
}
}
+47 -42
View File
@@ -21,20 +21,24 @@ namespace Flyoobe
private void MainForm_Load(object sender, EventArgs e)
{
InitializeButtons();
// Calculate DPI scaling factor once for this form.
// Used to build navigation buttons and badges in a size
float dpiScale = GetDpiScale();
_navigator = new ViewNavigator(panelHost, treeNavigation, title =>
// Initialize ViewNavigator, which manages loading and switching between different views inside host panel
_navigator = new ViewNavigator(panelHost, navPanel, btnNext, title =>
{
// lblHeader.Text = title;
linkSubHeader.Text = $"Running - {title} - {Program.GetAppVersion()}";
});
// Register views
_navigator.RegisterView("Home", () => new HomeControlView(_navigator));
_navigator.RegisterView("Upgrade", () => new UpgradeControlView());
_navigator.RegisterView("Install only", () => new InstallControlView());
_navigator.RegisterView("Reinstall", () => new InstallControlView());
_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());
@@ -44,7 +48,7 @@ namespace Flyoobe
_navigator.RegisterView("Extensions", () => new ToolHub.ToolHubControlView());
// Load OOBE navigation with system status
_navigator.LoadDefaultNavigation();
_navigator.BuildBottomNavigation(dpiScale);
// Show initial view
_navigator.ShowView("Home");
@@ -54,9 +58,9 @@ namespace Flyoobe
{
CopilotHelper.SetupCopilotButton(btnAskCopilot, 20);
btnExtensions.Text = "\uEA86";
btnAbout.Text = "\uE946";
btnRefresh.Text = "\uE72C";
btnToolSpot.Text = "\uE721";
}
private void btnAbout_Click(object sender, EventArgs e)
@@ -154,52 +158,53 @@ namespace Flyoobe
if (_navigator.CurrentView is IView view)
{
view.RefreshView();
btnNotification.Visible = false; // Hide notification button after refresh
btnNotification.Visible = false;
}
}
private void btnToolSpot_Click(object sender, EventArgs e)
/// <summary>
/// Calculates the current DPI scale factor of the main form.
/// This is used to size navigation buttons and UI elements consistently
/// across different display scaling settings (100%, 125%, 150%, ...).
/// Returns 1.0f at 96 DPI (default baseline).
/// </summary>
private float GetDpiScale()
{
// Path: <AppBase>\app\Foobe.Toolspot.exe
string exePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app", "spot.exe");
if (!File.Exists(exePath))
using (Graphics g = this.CreateGraphics())
{
MessageBox.Show("Toolspot not found:\n" + exePath, "Flyoobe",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
try
{
// Make MainForm dim (semi-transparent)
this.Opacity = 0.85;
var proc = new Process();
proc.StartInfo.FileName = exePath;
proc.EnableRaisingEvents = true;
proc.Exited += (s, ev) =>
{
// Restore opacity on UI thread
if (this.IsHandleCreated)
{
this.BeginInvoke((Action)(() => this.Opacity = 1.0));
}
};
proc.Start();
}
catch (Exception ex)
{
this.Opacity = 1.0; // safety reset
MessageBox.Show("Could not start Toolspot:\n" + ex.Message, "Flyoobe",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return g.DpiX / 96f; // 96 dpi = baseline (100% scaling)
}
}
private void linkHome_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
private void btnExtensions_Click(object sender, EventArgs e)
{
_navigator.ShowView("Home");
var location = btnExtensions.PointToScreen(new Point(0, btnExtensions.Height));
contextDropDown.Show(location);
}
private async void toolStripAddExtensionUrl_Click(object sender, EventArgs e)
{
await ToolHub.ExtensionsHelper.InstallFromUrlAsync(this, _navigator);
}
private void toolStripAddExtensionLocal_Click(object sender, EventArgs e)
{
ToolHub.ExtensionsHelper.ImportLocalFile(this, _navigator);
}
private void toolStripExtensionGuide_Click(object sender, EventArgs e)
{
ToolHub.ExtensionsHelper.OpenExtensionGuide();
}
private void toolStripExtensionSource_Click(object sender, EventArgs e)
{
ToolHub.ExtensionsHelper.OpenScriptsFolder(this);
}
private void toolStripExtensions_Click(object sender, EventArgs e)
{
ToolHub.ExtensionsHelper.SwitchToExtensionsView(_navigator);
}
}
}
+3
View File
@@ -117,4 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextDropDown.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>
+2 -2
View File
@@ -28,5 +28,5 @@ using System.Runtime.InteropServices;
// Buildnummer
// Revision
//
[assembly: AssemblyVersion("1.6.246")]
[assembly: AssemblyFileVersion("1.6.246")]
[assembly: AssemblyVersion("1.10.357")]
[assembly: AssemblyFileVersion("1.10.357")]
+129
View File
@@ -0,0 +1,129 @@
namespace Flyoobe.ToolHub
{
partial class ToolHubControlView
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Komponenten-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.flowLayoutPanelTools = new System.Windows.Forms.FlowLayoutPanel();
this.textSearch = new System.Windows.Forms.TextBox();
this.contextDropDown = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripAddExtensionUrl = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripAddExtensionLocal = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripExtensionGuide = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripExtensionSource = new System.Windows.Forms.ToolStripMenuItem();
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(18, 64);
this.flowLayoutPanelTools.Name = "flowLayoutPanelTools";
this.flowLayoutPanelTools.Size = new System.Drawing.Size(814, 361);
this.flowLayoutPanelTools.TabIndex = 0;
//
// 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", 9.75F);
this.textSearch.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.textSearch.Location = new System.Drawing.Point(196, 18);
this.textSearch.Name = "textSearch";
this.textSearch.Size = new System.Drawing.Size(473, 25);
this.textSearch.TabIndex = 10;
this.textSearch.Text = "Search";
this.textSearch.Click += new System.EventHandler(this.textSearch_Click);
this.textSearch.TextChanged += new System.EventHandler(this.textSearch_TextChanged);
//
// contextDropDown
//
this.contextDropDown.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.contextDropDown.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripAddExtensionUrl,
this.toolStripAddExtensionLocal,
this.toolStripExtensionGuide,
this.toolStripExtensionSource});
this.contextDropDown.Name = "contextDropDown";
this.contextDropDown.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
this.contextDropDown.Size = new System.Drawing.Size(173, 92);
//
// toolStripAddExtensionUrl
//
this.toolStripAddExtensionUrl.Name = "toolStripAddExtensionUrl";
this.toolStripAddExtensionUrl.Size = new System.Drawing.Size(172, 22);
this.toolStripAddExtensionUrl.Text = "Install from Url...";
//
// toolStripAddExtensionLocal
//
this.toolStripAddExtensionLocal.Name = "toolStripAddExtensionLocal";
this.toolStripAddExtensionLocal.Size = new System.Drawing.Size(172, 22);
this.toolStripAddExtensionLocal.Text = "Import from file...";
//
// toolStripExtensionGuide
//
this.toolStripExtensionGuide.Name = "toolStripExtensionGuide";
this.toolStripExtensionGuide.Size = new System.Drawing.Size(172, 22);
this.toolStripExtensionGuide.Text = "Write an extension";
//
// toolStripExtensionSource
//
this.toolStripExtensionSource.Name = "toolStripExtensionSource";
this.toolStripExtensionSource.Size = new System.Drawing.Size(172, 22);
this.toolStripExtensionSource.Text = "Extension folder...";
//
// 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.textSearch);
this.Controls.Add(this.flowLayoutPanelTools);
this.Name = "ToolHubControlView";
this.Size = new System.Drawing.Size(835, 457);
this.contextDropDown.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelTools;
private System.Windows.Forms.TextBox textSearch;
private System.Windows.Forms.ContextMenuStrip contextDropDown;
private System.Windows.Forms.ToolStripMenuItem toolStripAddExtensionUrl;
private System.Windows.Forms.ToolStripMenuItem toolStripAddExtensionLocal;
private System.Windows.Forms.ToolStripMenuItem toolStripExtensionGuide;
private System.Windows.Forms.ToolStripMenuItem toolStripExtensionSource;
}
}
+174
View File
@@ -0,0 +1,174 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Windows.Forms;
namespace Flyoobe.ToolHub
{
public partial class ToolHubControlView : UserControl, IView
{
private List<ToolHubDefinition> _allTools = new List<ToolHubDefinition>();
public string ViewTitle => "Setup Extensions";
public ToolHubControlView()
{
InitializeComponent();
LoadTools();
}
private void LoadTools()
{
_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);
return;
}
// Get all .ps1 files in the folder
string[] scriptFiles = Directory.GetFiles(scriptDirectory, "*.ps1");
// 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
// Get description + options from script metadata
var meta = ReadMetadataFromScript(scriptPath);
var tool = new ToolHubDefinition(fileName, meta.description, icon, scriptPath);
tool.Options.AddRange(meta.options);
tool.UseConsole = meta.useConsole;
var control = new ToolHubItemControl(tool);
flowLayoutPanelTools.Controls.Add(control);
_allTools.Add(tool); // Save original list
}
DisplayFilteredTools("");
}
private (string description, List<string> options, bool useConsole) ReadMetadataFromScript(string scriptPath)
{
string description = "No description available.";
var options = new List<string>();
bool useConsole = false;
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(10);
foreach (var line in lines)
{
if (string.IsNullOrWhiteSpace(line)) continue;
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();
}
// Parse host
else if (line.StartsWith("# Host:", StringComparison.OrdinalIgnoreCase))
{
var raw = line.Substring(7).Trim().ToLowerInvariant();
if (raw == "console")
useConsole = true;
}
else if (line.StartsWith("#"))
{
// Use the first regular comment as description (if none yet)
if (description == "No description available.")
description = line.TrimStart('#').Trim();
}
}
}
catch
{
// Ignore errors and keep defaults
}
return (description, options, useConsole);
}
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)
// Default icon for uncategorized tools
return "\uE7C5"; // Wrench icon (default tool)
}
private void DisplayFilteredTools(string filter)
{
flowLayoutPanelTools.SuspendLayout();
flowLayoutPanelTools.Controls.Clear();
// Apply case-insensitive search filter
foreach (var tool in _allTools)
{
if (string.IsNullOrWhiteSpace(filter) ||
tool.Title.ToLower().Contains(filter.ToLower()) ||
tool.Description.ToLower().Contains(filter.ToLower()))
{
var control = new ToolHubItemControl(tool);
flowLayoutPanelTools.Controls.Add(control);
}
}
flowLayoutPanelTools.ResumeLayout();
}
public void RefreshView()
{
textSearch.Clear();
flowLayoutPanelTools.Controls.Clear();
LoadTools();
}
private void textSearch_TextChanged(object sender, EventArgs e)
{
var keyword = textSearch.Text.Trim();
DisplayFilteredTools(keyword);
}
private void textSearch_Click(object sender, EventArgs e)
{
textSearch.Clear();
}
}
}
Loaded 100 of 145 files, more files were not shown because too many files have changed in this diff. Show more