diff --git a/.gitignore b/.gitignore
index 356df988..2b9a7ea6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
obj/
bin/
-.vs
\ No newline at end of file
+.vs/
+/Ink Canvas/obj
diff --git a/.idea/.idea.Ink Canvas/.idea/vcs.xml b/.idea/.idea.Ink Canvas/.idea/vcs.xml
index 35eb1ddf..e7cf2141 100644
--- a/.idea/.idea.Ink Canvas/.idea/vcs.xml
+++ b/.idea/.idea.Ink Canvas/.idea/vcs.xml
@@ -2,5 +2,6 @@
+
\ No newline at end of file
diff --git a/.vs/Ink Canvas/CopilotIndices/17.14.698.11175/CodeChunks.db b/.vs/Ink Canvas/CopilotIndices/17.14.698.11175/CodeChunks.db
deleted file mode 100644
index a8efda1e..00000000
Binary files a/.vs/Ink Canvas/CopilotIndices/17.14.698.11175/CodeChunks.db and /dev/null differ
diff --git a/.vs/Ink Canvas/CopilotIndices/17.14.698.11175/SemanticSymbols.db b/.vs/Ink Canvas/CopilotIndices/17.14.698.11175/SemanticSymbols.db
deleted file mode 100644
index 0ca53835..00000000
Binary files a/.vs/Ink Canvas/CopilotIndices/17.14.698.11175/SemanticSymbols.db and /dev/null differ
diff --git a/.vs/Ink Canvas/DesignTimeBuild/.dtbcache.v2 b/.vs/Ink Canvas/DesignTimeBuild/.dtbcache.v2
deleted file mode 100644
index 7f91f5de..00000000
Binary files a/.vs/Ink Canvas/DesignTimeBuild/.dtbcache.v2 and /dev/null differ
diff --git a/.vs/Ink Canvas/v17/.futdcache.v2 b/.vs/Ink Canvas/v17/.futdcache.v2
deleted file mode 100644
index b2809c26..00000000
Binary files a/.vs/Ink Canvas/v17/.futdcache.v2 and /dev/null differ
diff --git a/.vs/Ink Canvas/v17/.suo b/.vs/Ink Canvas/v17/.suo
deleted file mode 100644
index 80086562..00000000
Binary files a/.vs/Ink Canvas/v17/.suo and /dev/null differ
diff --git a/.vs/Ink Canvas/v17/DocumentLayout.backup.json b/.vs/Ink Canvas/v17/DocumentLayout.backup.json
deleted file mode 100644
index 208d4d68..00000000
--- a/.vs/Ink Canvas/v17/DocumentLayout.backup.json
+++ /dev/null
@@ -1,398 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|c:\\users\\dubi906w\\source\\repos\\icc-ce\\ink canvas\\mainwindow_cs\\mw_floatingbaricons.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|solutionrelative:ink canvas\\mainwindow_cs\\mw_floatingbaricons.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\README.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:README.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\privacy.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:privacy.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Manual.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Manual.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\LICENSE||{8B382828-6202-11D1-8870-0000F87579D2}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:LICENSE||{8B382828-6202-11D1-8870-0000F87579D2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas.sln.DotSettings.user||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Ink Canvas.sln.DotSettings.user||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|c:\\users\\dubi906w\\source\\repos\\icc-ce\\ink canvas\\mainwindow_cs\\mw_ppt.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|solutionrelative:ink canvas\\mainwindow_cs\\mw_ppt.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|c:\\users\\dubi906w\\source\\repos\\icc-ce\\ink canvas\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
- "RelativeMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|solutionrelative:ink canvas\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 210,
- "SelectedChildIndex": 48,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{387cb18d-6153-4156-9257-9ac3f9207bbe}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{e8b06f52-6d01-11d2-aa7d-00c04f990343}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{46c87f81-5a06-43a8-9e25-85d33bac49f8}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{269a02dc-6af8-11d3-bdc4-00c04f688e50}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{99b8fa2f-ab90-4f57-9c32-949f146f1914}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{c79b74ff-f1d7-4c94-aefa-4d22bfe1b1f9}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:2:0:{34c7837f-3b3a-449c-bdf0-bdad86cbaf4a}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{37aba9be-445a-11d3-9949-00c04f68fd0a}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{dcc4ea97-1c0c-482b-b205-e541c0df9728}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{75188d03-9892-4ae2-abf1-207126247ce5}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{eefa5220-e298-11d0-8f78-00a0c9110057}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{4a9b7e51-aa16-11d0-a8c5-00a0c921a4d2}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:3:0:{34c7837f-3b3a-449c-bdf0-bdad86cbaf4a}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:153:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:154:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:152:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:151:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:150:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:148:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:149:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:136:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:144:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:147:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:145:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:146:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:143:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:142:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:141:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:140:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:139:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:138:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:137:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:134:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:129:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:129:0:{75188d03-9892-4ae2-abf1-207126247ce5}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{b1e99781-ab81-11d0-b683-00aa00a3ee26}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "MW_FloatingBarIcons.cs",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "RelativeDocumentMoniker": "Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "RelativeToolTip": "Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "ViewState": "AgIAAOgCAAAAAAAAAAAuwEoGAAAIAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-05-31T10:49:24.719Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "README.md",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\README.md",
- "RelativeDocumentMoniker": "README.md",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\README.md",
- "RelativeToolTip": "README.md",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
- "WhenOpened": "2025-05-31T10:48:22.883Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "MainWindow.xaml",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow.xaml",
- "RelativeDocumentMoniker": "Ink Canvas\\MainWindow.xaml",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow.xaml",
- "RelativeToolTip": "Ink Canvas\\MainWindow.xaml",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
- "WhenOpened": "2025-05-24T13:22:56.715Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 9,
- "Title": "Microsoft.Common.CurrentVersion.targets",
- "DocumentMoniker": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "RelativeDocumentMoniker": "..\\..\\..\\..\\..\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "ToolTip": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "RelativeToolTip": "..\\..\\..\\..\\..\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "ViewState": "AgIAAGsJAAAAAAAAAAAQwIEJAAAEAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003801|",
- "WhenOpened": "2025-05-24T13:06:01.053Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
- "Title": "MW_PPT.cs",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "RelativeDocumentMoniker": "Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "RelativeToolTip": "Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "ViewState": "AgIAAFgAAAAAAAAAAAAUwHQAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-05-24T13:04:47.205Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
- "Title": "README.md",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "RelativeDocumentMoniker": "..\\..\\..\\..\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "RelativeToolTip": "..\\..\\..\\..\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
- "WhenOpened": "2025-05-24T13:04:01.407Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "privacy.txt",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\privacy.txt",
- "RelativeDocumentMoniker": "privacy.txt",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\privacy.txt",
- "RelativeToolTip": "privacy.txt",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
- "WhenOpened": "2025-05-24T13:04:01.337Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "Manual.md",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Manual.md",
- "RelativeDocumentMoniker": "Manual.md",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Manual.md",
- "RelativeToolTip": "Manual.md",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
- "WhenOpened": "2025-05-24T13:04:00.986Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "LICENSE",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\LICENSE",
- "RelativeDocumentMoniker": "LICENSE",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\LICENSE",
- "RelativeToolTip": "LICENSE",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2025-05-24T13:04:00.902Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "Ink Canvas.sln.DotSettings.user",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas.sln.DotSettings.user",
- "RelativeDocumentMoniker": "Ink Canvas.sln.DotSettings.user",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas.sln.DotSettings.user",
- "RelativeToolTip": "Ink Canvas.sln.DotSettings.user",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003464|",
- "WhenOpened": "2025-05-24T13:04:00.792Z"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{d84ee353-0bef-5a41-a649-8f89aca5d84d}"
- }
- ]
- },
- {
- "DockedWidth": 204,
- "SelectedChildIndex": -1,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:1:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{590a070c-4fcd-52d9-87da-dfaa11710261}"
- }
- ]
- },
- {
- "DockedWidth": 190,
- "SelectedChildIndex": -1,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{f4fc5ff1-28ef-4b04-ad02-6b298310ccc7}"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/Ink Canvas/v17/DocumentLayout.json b/.vs/Ink Canvas/v17/DocumentLayout.json
deleted file mode 100644
index 208d4d68..00000000
--- a/.vs/Ink Canvas/v17/DocumentLayout.json
+++ /dev/null
@@ -1,398 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|c:\\users\\dubi906w\\source\\repos\\icc-ce\\ink canvas\\mainwindow_cs\\mw_floatingbaricons.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|solutionrelative:ink canvas\\mainwindow_cs\\mw_floatingbaricons.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\README.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:README.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\privacy.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:privacy.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Manual.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Manual.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\LICENSE||{8B382828-6202-11D1-8870-0000F87579D2}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:LICENSE||{8B382828-6202-11D1-8870-0000F87579D2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas.sln.DotSettings.user||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Ink Canvas.sln.DotSettings.user||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|c:\\users\\dubi906w\\source\\repos\\icc-ce\\ink canvas\\mainwindow_cs\\mw_ppt.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|solutionrelative:ink canvas\\mainwindow_cs\\mw_ppt.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|c:\\users\\dubi906w\\source\\repos\\icc-ce\\ink canvas\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
- "RelativeMoniker": "D:0:0:{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}|Ink Canvas\\InkCanvasForClass.csproj|solutionrelative:ink canvas\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 210,
- "SelectedChildIndex": 48,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{387cb18d-6153-4156-9257-9ac3f9207bbe}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{e8b06f52-6d01-11d2-aa7d-00c04f990343}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{46c87f81-5a06-43a8-9e25-85d33bac49f8}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{269a02dc-6af8-11d3-bdc4-00c04f688e50}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{99b8fa2f-ab90-4f57-9c32-949f146f1914}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{c79b74ff-f1d7-4c94-aefa-4d22bfe1b1f9}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:2:0:{34c7837f-3b3a-449c-bdf0-bdad86cbaf4a}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{37aba9be-445a-11d3-9949-00c04f68fd0a}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{dcc4ea97-1c0c-482b-b205-e541c0df9728}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{75188d03-9892-4ae2-abf1-207126247ce5}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{eefa5220-e298-11d0-8f78-00a0c9110057}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{4a9b7e51-aa16-11d0-a8c5-00a0c921a4d2}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:3:0:{34c7837f-3b3a-449c-bdf0-bdad86cbaf4a}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:153:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:154:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:152:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:151:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:150:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:148:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:149:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:136:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:144:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:147:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:145:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:146:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:143:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:142:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:141:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:140:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:139:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:138:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:137:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:134:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:129:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:129:0:{75188d03-9892-4ae2-abf1-207126247ce5}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{b1e99781-ab81-11d0-b683-00aa00a3ee26}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "MW_FloatingBarIcons.cs",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "RelativeDocumentMoniker": "Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "RelativeToolTip": "Ink Canvas\\MainWindow_cs\\MW_FloatingBarIcons.cs",
- "ViewState": "AgIAAOgCAAAAAAAAAAAuwEoGAAAIAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-05-31T10:49:24.719Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "README.md",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\README.md",
- "RelativeDocumentMoniker": "README.md",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\README.md",
- "RelativeToolTip": "README.md",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
- "WhenOpened": "2025-05-31T10:48:22.883Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "MainWindow.xaml",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow.xaml",
- "RelativeDocumentMoniker": "Ink Canvas\\MainWindow.xaml",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow.xaml",
- "RelativeToolTip": "Ink Canvas\\MainWindow.xaml",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
- "WhenOpened": "2025-05-24T13:22:56.715Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 9,
- "Title": "Microsoft.Common.CurrentVersion.targets",
- "DocumentMoniker": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "RelativeDocumentMoniker": "..\\..\\..\\..\\..\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "ToolTip": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "RelativeToolTip": "..\\..\\..\\..\\..\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets",
- "ViewState": "AgIAAGsJAAAAAAAAAAAQwIEJAAAEAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003801|",
- "WhenOpened": "2025-05-24T13:06:01.053Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
- "Title": "MW_PPT.cs",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "RelativeDocumentMoniker": "Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "RelativeToolTip": "Ink Canvas\\MainWindow_cs\\MW_PPT.cs",
- "ViewState": "AgIAAFgAAAAAAAAAAAAUwHQAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-05-24T13:04:47.205Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
- "Title": "README.md",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "RelativeDocumentMoniker": "..\\..\\..\\..\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "RelativeToolTip": "..\\..\\..\\..\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\README.md",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
- "WhenOpened": "2025-05-24T13:04:01.407Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "privacy.txt",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\privacy.txt",
- "RelativeDocumentMoniker": "privacy.txt",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\privacy.txt",
- "RelativeToolTip": "privacy.txt",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
- "WhenOpened": "2025-05-24T13:04:01.337Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "Manual.md",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Manual.md",
- "RelativeDocumentMoniker": "Manual.md",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Manual.md",
- "RelativeToolTip": "Manual.md",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
- "WhenOpened": "2025-05-24T13:04:00.986Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "LICENSE",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\LICENSE",
- "RelativeDocumentMoniker": "LICENSE",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\LICENSE",
- "RelativeToolTip": "LICENSE",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2025-05-24T13:04:00.902Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "Ink Canvas.sln.DotSettings.user",
- "DocumentMoniker": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas.sln.DotSettings.user",
- "RelativeDocumentMoniker": "Ink Canvas.sln.DotSettings.user",
- "ToolTip": "C:\\Users\\dubi906w\\source\\repos\\icc-ce\\Ink Canvas.sln.DotSettings.user",
- "RelativeToolTip": "Ink Canvas.sln.DotSettings.user",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003464|",
- "WhenOpened": "2025-05-24T13:04:00.792Z"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{d84ee353-0bef-5a41-a649-8f89aca5d84d}"
- }
- ]
- },
- {
- "DockedWidth": 204,
- "SelectedChildIndex": -1,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:1:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{590a070c-4fcd-52d9-87da-dfaa11710261}"
- }
- ]
- },
- {
- "DockedWidth": 190,
- "SelectedChildIndex": -1,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{f4fc5ff1-28ef-4b04-ad02-6b298310ccc7}"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/ProjectEvaluation/ink canvas.metadata.v9.bin b/.vs/ProjectEvaluation/ink canvas.metadata.v9.bin
deleted file mode 100644
index e2a9a5da..00000000
Binary files a/.vs/ProjectEvaluation/ink canvas.metadata.v9.bin and /dev/null differ
diff --git a/.vs/ProjectEvaluation/ink canvas.projects.v9.bin b/.vs/ProjectEvaluation/ink canvas.projects.v9.bin
deleted file mode 100644
index a2cd7cce..00000000
Binary files a/.vs/ProjectEvaluation/ink canvas.projects.v9.bin and /dev/null differ
diff --git a/.vs/ProjectEvaluation/ink canvas.strings.v9.bin b/.vs/ProjectEvaluation/ink canvas.strings.v9.bin
deleted file mode 100644
index 7498260c..00000000
Binary files a/.vs/ProjectEvaluation/ink canvas.strings.v9.bin and /dev/null differ
diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json
deleted file mode 100644
index b09ea6c8..00000000
--- a/.vs/VSWorkspaceState.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "ExpandedNodes": [
- ""
- ],
- "SelectedNode": "\\Ink Canvas.sln",
- "PreviewInSolutionExplorer": false
-}
\ No newline at end of file
diff --git a/.vs/icc-0610.2.2/FileContentIndex/777fbe68-06ce-4859-8b8d-d763f120f2c0.vsidx b/.vs/icc-0610.2.2/FileContentIndex/777fbe68-06ce-4859-8b8d-d763f120f2c0.vsidx
deleted file mode 100644
index 69e6ba72..00000000
Binary files a/.vs/icc-0610.2.2/FileContentIndex/777fbe68-06ce-4859-8b8d-d763f120f2c0.vsidx and /dev/null differ
diff --git a/.vs/icc-0610.2.2/FileContentIndex/95c8e0b1-8689-4e23-84a6-a09fc53d1455.vsidx b/.vs/icc-0610.2.2/FileContentIndex/95c8e0b1-8689-4e23-84a6-a09fc53d1455.vsidx
deleted file mode 100644
index 072d526b..00000000
Binary files a/.vs/icc-0610.2.2/FileContentIndex/95c8e0b1-8689-4e23-84a6-a09fc53d1455.vsidx and /dev/null differ
diff --git a/.vs/icc-0610.2.2/v17/.wsuo b/.vs/icc-0610.2.2/v17/.wsuo
deleted file mode 100644
index 187600a8..00000000
Binary files a/.vs/icc-0610.2.2/v17/.wsuo and /dev/null differ
diff --git a/.vs/icc-0610.2.2/v17/DocumentLayout.backup.json b/.vs/icc-0610.2.2/v17/DocumentLayout.backup.json
deleted file mode 100644
index 27e2d25f..00000000
--- a/.vs/icc-0610.2.2/v17/DocumentLayout.backup.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\System.ValueTuple.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Settings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\OSVersionExt.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Office.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.Wpf.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Newtonsoft.Json.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.Plugins.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\InkCanvasForClass.exe.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IAWinFX.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IALoader.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IACore.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 0,
- "Children": [
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "System.ValueTuple.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\System.ValueTuple.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\System.ValueTuple.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\System.ValueTuple.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\System.ValueTuple.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:48.138Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "Settings.json",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Settings.json",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Settings.json",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Settings.json",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Settings.json",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
- "WhenOpened": "2025-05-24T13:02:44.878Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "OSVersionExt.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\OSVersionExt.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\OSVersionExt.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\OSVersionExt.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\OSVersionExt.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.837Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "Office.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Office.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Office.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Office.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Office.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.774Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "NHotkey.Wpf.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.718Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "NHotkey.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\NHotkey.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\NHotkey.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.662Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
- "Title": "Newtonsoft.Json.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.589Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "Microsoft.Office.Interop.PowerPoint.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.932Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
- "Title": "MdXaml.Plugins.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.838Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 9,
- "Title": "MdXaml.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\MdXaml.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\MdXaml.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.776Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 10,
- "Title": "iNKORE.UI.WPF.Modern.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.573Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 11,
- "Title": "iNKORE.UI.WPF.Modern.Controls.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.432Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 12,
- "Title": "iNKORE.UI.WPF.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:42.807Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 13,
- "Title": "InkCanvasForClass.exe.config",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
- "WhenOpened": "2025-05-24T13:02:27.288Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 14,
- "Title": "ICSharpCode.AvalonEdit.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.847Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 15,
- "Title": "IAWinFX.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IAWinFX.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\IAWinFX.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IAWinFX.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\IAWinFX.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.816Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 16,
- "Title": "IALoader.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IALoader.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\IALoader.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IALoader.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\IALoader.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.784Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 17,
- "Title": "IACore.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IACore.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\IACore.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IACore.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\IACore.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.753Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 18,
- "Title": "Hardcodet.NotifyIcon.Wpf.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.113Z"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/icc-0610.2.2/v17/DocumentLayout.json b/.vs/icc-0610.2.2/v17/DocumentLayout.json
deleted file mode 100644
index 10391208..00000000
--- a/.vs/icc-0610.2.2/v17/DocumentLayout.json
+++ /dev/null
@@ -1,338 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\icc.png||{177559E0-D141-11D0-92DF-00A0C9138C45}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:icc.png||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\AutomaticUpdateVersionControl.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:AutomaticUpdateVersionControl.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\System.ValueTuple.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Settings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\OSVersionExt.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Office.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.Wpf.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Newtonsoft.Json.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.Plugins.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\InkCanvasForClass.exe.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IAWinFX.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IALoader.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IACore.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 0,
- "Children": [
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "icc.png - PNG [256x256, 32 \u4F4D, PNG]",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\icc.png",
- "RelativeDocumentMoniker": "icc.png",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\icc.png - PNG [256x256, 32 \u4F4D, PNG]",
- "RelativeToolTip": "icc.png - PNG [256x256, 32 \u4F4D, PNG]",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
- "WhenOpened": "2025-05-24T13:03:45.63Z",
- "EditorCaption": " - PNG [256x256, 32 \u4F4D, PNG]"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "AutomaticUpdateVersionControl.txt",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\AutomaticUpdateVersionControl.txt",
- "RelativeDocumentMoniker": "AutomaticUpdateVersionControl.txt",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\AutomaticUpdateVersionControl.txt",
- "RelativeToolTip": "AutomaticUpdateVersionControl.txt",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
- "WhenOpened": "2025-05-24T13:03:45.517Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": ".gitignore",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\.gitignore",
- "RelativeDocumentMoniker": ".gitignore",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.2\\.gitignore",
- "RelativeToolTip": ".gitignore",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2025-05-24T13:03:43.13Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "System.ValueTuple.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\System.ValueTuple.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\System.ValueTuple.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\System.ValueTuple.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\System.ValueTuple.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:48.138Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "Settings.json",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Settings.json",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Settings.json",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Settings.json",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Settings.json",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
- "WhenOpened": "2025-05-24T13:02:44.878Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "OSVersionExt.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\OSVersionExt.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\OSVersionExt.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\OSVersionExt.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\OSVersionExt.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.837Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
- "Title": "Office.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Office.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Office.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Office.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Office.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.774Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "NHotkey.Wpf.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\NHotkey.Wpf.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.718Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
- "Title": "NHotkey.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\NHotkey.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\NHotkey.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\NHotkey.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.662Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 9,
- "Title": "Newtonsoft.Json.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Newtonsoft.Json.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:44.589Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 10,
- "Title": "Microsoft.Office.Interop.PowerPoint.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Microsoft.Office.Interop.PowerPoint.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.932Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 11,
- "Title": "MdXaml.Plugins.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\MdXaml.Plugins.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.838Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 12,
- "Title": "MdXaml.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\MdXaml.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\MdXaml.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\MdXaml.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.776Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 13,
- "Title": "iNKORE.UI.WPF.Modern.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.573Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 14,
- "Title": "iNKORE.UI.WPF.Modern.Controls.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.Modern.Controls.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:43.432Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 15,
- "Title": "iNKORE.UI.WPF.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\iNKORE.UI.WPF.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:42.807Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 16,
- "Title": "InkCanvasForClass.exe.config",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\InkCanvasForClass.exe.config",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
- "WhenOpened": "2025-05-24T13:02:27.288Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 17,
- "Title": "ICSharpCode.AvalonEdit.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\ICSharpCode.AvalonEdit.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.847Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 18,
- "Title": "IAWinFX.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IAWinFX.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\IAWinFX.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IAWinFX.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\IAWinFX.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.816Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 19,
- "Title": "IALoader.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IALoader.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\IALoader.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IALoader.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\IALoader.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.784Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 20,
- "Title": "IACore.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IACore.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\IACore.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\IACore.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\IACore.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.753Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 21,
- "Title": "Hardcodet.NotifyIcon.Wpf.dll",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "RelativeDocumentMoniker": "..\\..\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "RelativeToolTip": "..\\..\\InkCanvasForClass\\Hardcodet.NotifyIcon.Wpf.dll",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001697|",
- "WhenOpened": "2025-05-24T13:02:22.113Z"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/icc-0610.2.2/v17/workspaceFileList.bin b/.vs/icc-0610.2.2/v17/workspaceFileList.bin
deleted file mode 100644
index 8d13c3ee..00000000
Binary files a/.vs/icc-0610.2.2/v17/workspaceFileList.bin and /dev/null differ
diff --git a/.vs/icc-0610.2.3/FileContentIndex/29319a2c-7faa-4ee5-8d24-17c238ca803e.vsidx b/.vs/icc-0610.2.3/FileContentIndex/29319a2c-7faa-4ee5-8d24-17c238ca803e.vsidx
deleted file mode 100644
index b74c61fd..00000000
Binary files a/.vs/icc-0610.2.3/FileContentIndex/29319a2c-7faa-4ee5-8d24-17c238ca803e.vsidx and /dev/null differ
diff --git a/.vs/icc-0610.2.3/FileContentIndex/34c6dd5d-6075-49b2-ab2c-4e8d079d036e.vsidx b/.vs/icc-0610.2.3/FileContentIndex/34c6dd5d-6075-49b2-ab2c-4e8d079d036e.vsidx
deleted file mode 100644
index 5a4c68f0..00000000
Binary files a/.vs/icc-0610.2.3/FileContentIndex/34c6dd5d-6075-49b2-ab2c-4e8d079d036e.vsidx and /dev/null differ
diff --git a/.vs/icc-0610.2.3/FileContentIndex/7a5efc25-7ca5-4a7f-a0e0-0e8bf3996d0a.vsidx b/.vs/icc-0610.2.3/FileContentIndex/7a5efc25-7ca5-4a7f-a0e0-0e8bf3996d0a.vsidx
deleted file mode 100644
index b23372c0..00000000
Binary files a/.vs/icc-0610.2.3/FileContentIndex/7a5efc25-7ca5-4a7f-a0e0-0e8bf3996d0a.vsidx and /dev/null differ
diff --git a/.vs/icc-0610.2.3/FileContentIndex/9947b71c-9e8d-4a20-80aa-4e44b1609bf2.vsidx b/.vs/icc-0610.2.3/FileContentIndex/9947b71c-9e8d-4a20-80aa-4e44b1609bf2.vsidx
deleted file mode 100644
index da5eb89f..00000000
Binary files a/.vs/icc-0610.2.3/FileContentIndex/9947b71c-9e8d-4a20-80aa-4e44b1609bf2.vsidx and /dev/null differ
diff --git a/.vs/icc-0610.2.3/FileContentIndex/e1d7dcd2-b73f-4c9a-b51c-9ba3cb8d4cbb.vsidx b/.vs/icc-0610.2.3/FileContentIndex/e1d7dcd2-b73f-4c9a-b51c-9ba3cb8d4cbb.vsidx
deleted file mode 100644
index 8e02f030..00000000
Binary files a/.vs/icc-0610.2.3/FileContentIndex/e1d7dcd2-b73f-4c9a-b51c-9ba3cb8d4cbb.vsidx and /dev/null differ
diff --git a/.vs/icc-0610.2.3/v17/.wsuo b/.vs/icc-0610.2.3/v17/.wsuo
deleted file mode 100644
index a7e1b305..00000000
Binary files a/.vs/icc-0610.2.3/v17/.wsuo and /dev/null differ
diff --git a/.vs/icc-0610.2.3/v17/DocumentLayout.backup.json b/.vs/icc-0610.2.3/v17/DocumentLayout.backup.json
deleted file mode 100644
index 48317cfd..00000000
--- a/.vs/icc-0610.2.3/v17/DocumentLayout.backup.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\icc.png||{177559E0-D141-11D0-92DF-00A0C9138C45}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:icc.png||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\AutomaticUpdateVersionControl.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:AutomaticUpdateVersionControl.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 0,
- "Children": [
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "icc.png",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\icc.png",
- "RelativeDocumentMoniker": "icc.png",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\icc.png",
- "RelativeToolTip": "icc.png",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
- "WhenOpened": "2025-05-24T13:12:49.619Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "AutomaticUpdateVersionControl.txt",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\AutomaticUpdateVersionControl.txt",
- "RelativeDocumentMoniker": "AutomaticUpdateVersionControl.txt",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\AutomaticUpdateVersionControl.txt",
- "RelativeToolTip": "AutomaticUpdateVersionControl.txt",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
- "WhenOpened": "2025-05-24T13:12:49.575Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": ".gitignore",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\.gitignore",
- "RelativeDocumentMoniker": ".gitignore",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\.gitignore",
- "RelativeToolTip": ".gitignore",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2025-05-24T13:12:49.025Z"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/icc-0610.2.3/v17/DocumentLayout.json b/.vs/icc-0610.2.3/v17/DocumentLayout.json
deleted file mode 100644
index b53370fc..00000000
--- a/.vs/icc-0610.2.3/v17/DocumentLayout.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\icc.png||{177559E0-D141-11D0-92DF-00A0C9138C45}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:icc.png||{177559E0-D141-11D0-92DF-00A0C9138C45}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\AutomaticUpdateVersionControl.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:AutomaticUpdateVersionControl.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}",
- "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 1,
- "Children": [
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "icc.png - PNG [1328x1328, 32 \u4F4D, PNG]",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\icc.png",
- "RelativeDocumentMoniker": "icc.png",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\icc.png - PNG [1328x1328, 32 \u4F4D, PNG]",
- "RelativeToolTip": "icc.png - PNG [1328x1328, 32 \u4F4D, PNG]",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
- "WhenOpened": "2025-05-24T13:12:49.619Z",
- "EditorCaption": " - PNG [1328x1328, 32 \u4F4D, PNG]"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "AutomaticUpdateVersionControl.txt",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\AutomaticUpdateVersionControl.txt",
- "RelativeDocumentMoniker": "AutomaticUpdateVersionControl.txt",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\AutomaticUpdateVersionControl.txt",
- "RelativeToolTip": "AutomaticUpdateVersionControl.txt",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
- "WhenOpened": "2025-05-24T13:12:49.575Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": ".gitignore",
- "DocumentMoniker": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\.gitignore",
- "RelativeDocumentMoniker": ".gitignore",
- "ToolTip": "C:\\Users\\Administrator\\Desktop\\ICC CE\\icc-0610.2.3\\.gitignore",
- "RelativeToolTip": ".gitignore",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2025-05-24T13:12:49.025Z"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/icc-0610.2.3/v17/workspaceFileList.bin b/.vs/icc-0610.2.3/v17/workspaceFileList.bin
deleted file mode 100644
index 7eed11ec..00000000
Binary files a/.vs/icc-0610.2.3/v17/workspaceFileList.bin and /dev/null differ
diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite
deleted file mode 100644
index 2f3e4033..00000000
Binary files a/.vs/slnx.sqlite and /dev/null differ
diff --git a/AutomaticUpdateVersionControl.txt b/AutomaticUpdateVersionControl.txt
index f2f7432d..76cbaaf4 100644
--- a/AutomaticUpdateVersionControl.txt
+++ b/AutomaticUpdateVersionControl.txt
@@ -1 +1 @@
-1.7.6.0
+1.7.7.0
diff --git a/Ink Canvas.sln.DotSettings.user b/Ink Canvas.sln.DotSettings.user
index 5ef2d603..0401f804 100644
--- a/Ink Canvas.sln.DotSettings.user
+++ b/Ink Canvas.sln.DotSettings.user
@@ -1,2 +1,4 @@
- WARNING
\ No newline at end of file
+ WARNING
+ C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\MSBuild.exe
+ 1114112
\ No newline at end of file
diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs
index 1237f47d..e3ac9b51 100644
--- a/Ink Canvas/App.xaml.cs
+++ b/Ink Canvas/App.xaml.cs
@@ -1,3 +1,8 @@
+using Hardcodet.Wpf.TaskbarNotification;
+using Ink_Canvas.Helpers;
+using iNKORE.UI.WPF.Modern.Controls;
+using Microsoft.Win32;
+using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -13,11 +18,6 @@ using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Threading;
-using Hardcodet.Wpf.TaskbarNotification;
-using Ink_Canvas.Helpers;
-using iNKORE.UI.WPF.Modern.Controls;
-using Microsoft.Win32;
-using Newtonsoft.Json;
using Application = System.Windows.Application;
using MessageBox = System.Windows.MessageBox;
using Timer = System.Threading.Timer;
@@ -91,19 +91,19 @@ namespace Ink_Canvas
// 检测操作系统版本
var osVersion = Environment.OSVersion;
bool isWindows7 = osVersion.Version.Major == 6 && osVersion.Version.Minor == 1;
-
+
if (isWindows7)
{
LogHelper.WriteLogToFile("检测到Windows 7系统,配置TLS协议支持");
-
+
// 启用所有TLS版本以支持Windows 7
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
-
+
// 配置ServicePointManager以支持Windows 7
ServicePointManager.DefaultConnectionLimit = 10;
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false;
-
+
LogHelper.WriteLogToFile("TLS协议配置完成,已启用TLS 1.2/1.1/1.0支持");
}
else
@@ -122,7 +122,7 @@ namespace Ink_Canvas
private void InitializeCrashListeners()
{
if (crashListenersInitialized) return;
-
+
try
{
// 确保崩溃日志目录存在
@@ -130,22 +130,22 @@ namespace Ink_Canvas
{
Directory.CreateDirectory(crashLogFile);
}
-
+
// 注册非UI线程未处理异常处理程序
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
-
+
// 注册控制台Ctrl+C等终止信号处理
Console.CancelKeyPress += Console_CancelKeyPress;
-
+
// 注册系统会话结束事件(关机、注销等)
SystemEvents.SessionEnding += SystemEvents_SessionEnding;
-
+
// 注册进程退出处理程序
AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
-
+
// 尝试注册Windows关闭消息监听
SetConsoleCtrlHandler(ConsoleCtrlHandler, true);
-
+
// 如果系统支持,添加Windows Management Instrumentation监听器
try
{
@@ -156,7 +156,7 @@ namespace Ink_Canvas
{
LogHelper.WriteLogToFile($"设置WMI进程监控失败: {wmiEx.Message}", LogHelper.LogType.Warning);
}
-
+
crashListenersInitialized = true;
LogHelper.WriteLogToFile("已初始化崩溃监听器");
}
@@ -165,7 +165,7 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile($"初始化崩溃监听器失败: {ex.Message}", LogHelper.LogType.Error);
}
}
-
+
// 新增:动态加载WMI监控(避免直接引用System.Management)
private void TrySetupWmiMonitoring()
{
@@ -179,7 +179,7 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile("未找到System.Management程序集,跳过WMI监控", LogHelper.LogType.Warning);
return;
}
-
+
// 使用反射创建WMI查询
var watcherType = assembly.GetType("System.Management.ManagementEventWatcher");
if (watcherType == null)
@@ -187,13 +187,13 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile("未找到ManagementEventWatcher类型,跳过WMI监控", LogHelper.LogType.Warning);
return;
}
-
+
// 构建WMI查询字符串
string queryString = $"SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.ProcessId = {currentProcessId}";
-
+
// 创建ManagementEventWatcher实例
object watcher = Activator.CreateInstance(watcherType, queryString);
-
+
// 获取EventArrived事件信息
var eventInfo = watcherType.GetEvent("EventArrived");
if (eventInfo == null)
@@ -201,16 +201,16 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile("未找到EventArrived事件,跳过WMI监控", LogHelper.LogType.Warning);
return;
}
-
+
// 创建委托并订阅事件
Type delegateType = eventInfo.EventHandlerType;
var handler = Delegate.CreateDelegate(delegateType, this, GetType().GetMethod("WmiEventHandler", BindingFlags.NonPublic | BindingFlags.Instance));
eventInfo.AddEventHandler(watcher, handler);
-
+
// 启动监听
var startMethod = watcherType.GetMethod("Start");
startMethod.Invoke(watcher, null);
-
+
LogHelper.WriteLogToFile("已成功启动WMI进程监控");
}
catch (Exception ex)
@@ -218,7 +218,7 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile($"动态加载WMI监控失败: {ex.Message}", LogHelper.LogType.Warning);
}
}
-
+
// WMI事件处理方法(通过反射调用)
private void WmiEventHandler(object sender, EventArgs e)
{
@@ -246,13 +246,13 @@ namespace Ink_Canvas
// 新增:Windows控制台控制处理程序
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate handler, bool add);
-
+
private delegate bool ConsoleCtrlDelegate(int ctrlType);
-
+
private static bool ConsoleCtrlHandler(int ctrlType)
{
string eventType = "未知控制类型";
-
+
// 使用传统switch语句替代switch表达式
switch (ctrlType)
{
@@ -275,27 +275,27 @@ namespace Ink_Canvas
eventType = $"未知控制类型({ctrlType})";
break;
}
-
+
WriteCrashLog($"接收到系统控制信号: {eventType}");
-
+
// 返回true表示已处理该事件
return false;
}
-
+
// 新增:系统会话结束事件处理
private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
string reason = e.Reason == SessionEndReasons.Logoff ? "用户注销" : "系统关机";
WriteCrashLog($"系统会话即将结束: {reason}");
}
-
+
// 新增:控制台取消事件处理
private void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
WriteCrashLog($"接收到控制台中断信号: {e.SpecialKey}");
e.Cancel = true; // 取消默认处理
}
-
+
// 新增:处理非UI线程的未处理异常
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
@@ -304,9 +304,9 @@ namespace Ink_Canvas
var exception = e.ExceptionObject as Exception;
string errorMessage = exception?.ToString() ?? "未知异常";
lastErrorMessage = errorMessage;
-
+
WriteCrashLog($"捕获到未处理的异常: {errorMessage}");
-
+
if (e.IsTerminating)
{
WriteCrashLog("应用程序即将终止");
@@ -325,20 +325,20 @@ namespace Ink_Canvas
catch { }
}
}
-
+
// 新增:处理进程退出事件
private void CurrentDomain_ProcessExit(object sender, EventArgs e)
{
TimeSpan runDuration = DateTime.Now - appStartTime;
WriteCrashLog($"应用程序退出,运行时长: {runDuration}");
-
+
// 如果有最后错误消息,记录到日志
if (!string.IsNullOrEmpty(lastErrorMessage))
{
WriteCrashLog($"最后错误信息: {lastErrorMessage}");
}
}
-
+
// 新增:记录崩溃日志
private static void WriteCrashLog(string message)
{
@@ -349,22 +349,22 @@ namespace Ink_Canvas
{
Directory.CreateDirectory(crashLogFile);
}
-
+
string logFileName = Path.Combine(crashLogFile, $"crash_{DateTime.Now:yyyyMMdd}.log");
-
+
// 收集系统状态信息
string memoryUsage = (Process.GetCurrentProcess().WorkingSet64 / (1024 * 1024)) + " MB";
string cpuTime = Process.GetCurrentProcess().TotalProcessorTime.ToString();
string processUptime = (DateTime.Now - Process.GetCurrentProcess().StartTime).ToString();
-
+
string statusInfo = $"[内存: {memoryUsage}, CPU时间: {cpuTime}, 运行时长: {processUptime}]";
-
+
// 写入日志
File.AppendAllText(
logFileName,
$"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [PID:{currentProcessId}] {message}\r\n{statusInfo}\r\n\r\n"
);
-
+
// 同时记录到主日志
LogHelper.WriteLogToFile(message, LogHelper.LogType.Error);
}
@@ -402,11 +402,11 @@ namespace Ink_Canvas
{
Ink_Canvas.MainWindow.ShowNewMessage("抱歉,出现未预期的异常,可能导致 InkCanvasForClass 运行不稳定。\n建议保存墨迹后重启应用。");
LogHelper.NewLog(e.Exception.ToString());
-
+
// 新增:记录到崩溃日志
lastErrorMessage = e.Exception.ToString();
WriteCrashLog($"UI线程未处理异常: {e.Exception}");
-
+
e.Handled = true;
SyncCrashActionFromSettings(); // 新增:崩溃时同步最新设置
@@ -435,10 +435,20 @@ namespace Ink_Canvas
void App_Startup(object sender, StartupEventArgs e)
{
- /*if (!StoreHelper.IsStoreApp) */RootPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
+ /*if (!StoreHelper.IsStoreApp) */
+ RootPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
LogHelper.NewLog(string.Format("Ink Canvas Starting (Version: {0})", Assembly.GetExecutingAssembly().GetName().Version));
-
+
+ // 在应用启动时自动释放IACore相关DLL
+ try
+ {
+ Helpers.IACoreDllExtractor.ExtractIACoreDlls();
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"释放IACore DLL时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
// 记录应用启动(设备标识符)
DeviceIdentifier.RecordAppLaunch();
@@ -456,14 +466,16 @@ namespace Ink_Canvas
LogHelper.NewLog("Ink Canvas automatically closed");
IsAppExitByUser = true; // 多开时标记为用户主动退出
// 写入退出信号,确保看门狗不会重启
- try {
+ try
+ {
StartupCount.Reset();
File.WriteAllText(watchdogExitSignalFile, "exit");
if (watchdogProcess != null && !watchdogProcess.HasExited)
{
watchdogProcess.Kill();
}
- } catch { }
+ }
+ catch { }
Environment.Exit(0);
}
@@ -475,7 +487,7 @@ namespace Ink_Canvas
try
{
LogHelper.WriteLogToFile("开始Office注册表检测");
-
+
// 检查Office安装
if (!IsOfficeInstalled())
{
@@ -504,7 +516,7 @@ namespace Ink_Canvas
{
LogHelper.WriteLogToFile($"注册表路径不存在: {regPath}", LogHelper.LogType.Warning);
// 尝试创建路径
- try
+ try
{
using (RegistryKey createKey = Registry.CurrentUser.CreateSubKey(regPath, true))
{
@@ -525,23 +537,23 @@ namespace Ink_Canvas
// 备份路径更改为软件根目录下的saves/RegistryBackups文件夹
string backupPath = Path.Combine(RootPath, "saves", "RegistryBackups");
LogHelper.WriteLogToFile($"备份路径: {backupPath}");
-
- if (!Directory.Exists(backupPath))
+
+ if (!Directory.Exists(backupPath))
{
Directory.CreateDirectory(backupPath);
LogHelper.WriteLogToFile($"创建备份目录: {backupPath}");
}
-
+
string backupFile = Path.Combine(backupPath, $"SecurityBackup_{version}_{DateTime.Now:yyyyMMddHHmmss}.reg");
LogHelper.WriteLogToFile($"创建备份文件: {backupFile}");
-
+
// 使用UTF8编码写入注册表文件
using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8))
{
sw.WriteLine("Windows Registry Editor Version 5.00\n");
sw.WriteLine();
sw.WriteLine($"[{Registry.CurrentUser.Name}\\{regPath}]");
-
+
foreach (string valueName in baseKey.GetValueNames())
{
object value = baseKey.GetValue(valueName);
@@ -605,9 +617,9 @@ namespace Ink_Canvas
SenderScrollViewer.ScrollToVerticalOffset(SenderScrollViewer.VerticalOffset - e.Delta * 10 * SystemInformation.MouseWheelScrollLines / (double)120);
e.Handled = true;
}
- catch { }
+ catch { }
}
- catch { }
+ catch { }
}
// 新增:用于设置崩溃后操作类型
@@ -722,7 +734,7 @@ namespace Ink_Canvas
// 新增:记录应用退出状态
string exitType = IsAppExitByUser ? "用户主动退出" : "应用程序退出";
WriteCrashLog($"{exitType},退出代码: {e.ApplicationExitCode}");
-
+
// 记录应用退出(设备标识符)
try
{
@@ -733,7 +745,7 @@ namespace Ink_Canvas
{
LogHelper.WriteLogToFile($"记录设备标识符退出信息失败: {deviceEx.Message}", LogHelper.LogType.Error);
}
-
+
if (IsAppExitByUser)
{
// 写入退出信号文件,通知看门狗正常退出
@@ -745,7 +757,7 @@ namespace Ink_Canvas
}
}
}
- catch (Exception ex)
+ catch (Exception ex)
{
// 尝试记录最后的错误
try
@@ -773,7 +785,7 @@ namespace Ink_Canvas
return true;
}
}
-
+
// 2. 检查64位注册表中的Office
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Microsoft\\Office"))
{
@@ -783,7 +795,7 @@ namespace Ink_Canvas
return true;
}
}
-
+
// 3. 检查Office 365/Click-to-Run安装
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun"))
{
@@ -793,7 +805,7 @@ namespace Ink_Canvas
return true;
}
}
-
+
// 4. 检查Office 365部署配置
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\15.0\\ClickToRun"))
{
@@ -803,7 +815,7 @@ namespace Ink_Canvas
return true;
}
}
-
+
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\16.0\\ClickToRun"))
{
if (key != null)
@@ -832,7 +844,7 @@ namespace Ink_Canvas
return false;
}
}
-
+
///
/// 显示权限不足的错误提示
///
@@ -986,7 +998,7 @@ namespace Ink_Canvas
{
var platformVersion = key.GetValue("Platform") as string;
var clickToRunVersion = key.GetValue("VersionToReport") as string;
-
+
if (!string.IsNullOrEmpty(platformVersion))
{
var majorVersion = platformVersion.Split('.').FirstOrDefault();
@@ -1046,13 +1058,13 @@ namespace Ink_Canvas
// 检查Office 365 Outlook和PowerPoint的特定路径
string[] apps = { "outlook", "powerpoint" };
-
+
foreach (var app in apps)
{
// 检查用户级别的注册表
string regPath = $"Software\\Microsoft\\Office\\16.0\\{app}\\Security";
LogHelper.WriteLogToFile($"检查Office 365特定应用注册表: {regPath}");
-
+
try
{
// 先检查是否存在该路径
@@ -1063,14 +1075,14 @@ namespace Ink_Canvas
{
string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_{app}_{DateTime.Now:yyyyMMddHHmmss}.reg");
LogHelper.WriteLogToFile($"创建Office 365 {app}备份文件: {backupFile}");
-
+
// 使用UTF8编码写入注册表文件
using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8))
{
sw.WriteLine("Windows Registry Editor Version 5.00\n");
sw.WriteLine();
sw.WriteLine($"[{Registry.CurrentUser.Name}\\{regPath}]");
-
+
foreach (string valueName in baseKey.GetValueNames())
{
object value = baseKey.GetValue(valueName);
@@ -1104,11 +1116,11 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile($"修改 {app} 注册表时出错: {ex.Message}", LogHelper.LogType.Error);
}
}
-
+
// 尝试通过Office信任中心路径修改
string trustCenterPath = "Software\\Microsoft\\Office\\16.0\\Common\\Security\\FileValidation";
LogHelper.WriteLogToFile($"检查信任中心路径: {trustCenterPath}");
-
+
try
{
// 先检查是否存在该路径
@@ -1119,14 +1131,14 @@ namespace Ink_Canvas
{
string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_TrustCenter_{DateTime.Now:yyyyMMddHHmmss}.reg");
LogHelper.WriteLogToFile($"创建信任中心备份文件: {backupFile}");
-
+
// 使用UTF8编码写入注册表文件
using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8))
{
sw.WriteLine("Windows Registry Editor Version 5.00\n");
sw.WriteLine();
sw.WriteLine($"[{Registry.CurrentUser.Name}\\{trustCenterPath}]");
-
+
foreach (string valueName in baseKey.GetValueNames())
{
object value = baseKey.GetValue(valueName);
@@ -1150,7 +1162,7 @@ namespace Ink_Canvas
{
LogHelper.WriteLogToFile($"修改信任中心路径时出错: {ex.Message}", LogHelper.LogType.Error);
}
-
+
// 尝试修改EnableEditWhileViewingPolicy
string policyPath = "Software\\Policies\\Microsoft\\Office\\16.0\\Common\\Security";
try
@@ -1163,14 +1175,14 @@ namespace Ink_Canvas
{
string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_Policy_{DateTime.Now:yyyyMMddHHmmss}.reg");
LogHelper.WriteLogToFile($"创建策略备份文件: {backupFile}");
-
+
// 使用UTF8编码写入注册表文件
using (StreamWriter sw = new StreamWriter(backupFile, false, Encoding.UTF8))
{
sw.WriteLine("Windows Registry Editor Version 5.00\n");
sw.WriteLine();
sw.WriteLine($"[{Registry.CurrentUser.Name}\\{policyPath}]");
-
+
foreach (string valueName in baseKey.GetValueNames())
{
object value = baseKey.GetValue(valueName);
diff --git a/Ink Canvas/AssemblyInfo.cs b/Ink Canvas/AssemblyInfo.cs
index 2fcd67b5..858d6840 100644
--- a/Ink Canvas/AssemblyInfo.cs
+++ b/Ink Canvas/AssemblyInfo.cs
@@ -49,5 +49,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.76.0")]
-[assembly: AssemblyFileVersion("1.7.6.0")]
+[assembly: AssemblyVersion("1.7.7.5")]
+[assembly: AssemblyFileVersion("1.7.7.5")]
diff --git a/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs b/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs
index c7701754..56a2e6f3 100644
--- a/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs
+++ b/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs
@@ -354,7 +354,7 @@ namespace Ink_Canvas.Helpers
{
public double SmoothingStrength { get; set; } = 0.3;
public double ResampleInterval { get; set; } = 3.0;
- public int InterpolationSteps { get; set; } = 8;
+ public int InterpolationSteps { get; set; } = 8;
public Stroke SmoothStroke(Stroke stroke)
{
diff --git a/Ink Canvas/Helpers/AutoUpdateHelper.cs b/Ink Canvas/Helpers/AutoUpdateHelper.cs
index e0a45e5a..138c0090 100644
--- a/Ink Canvas/Helpers/AutoUpdateHelper.cs
+++ b/Ink Canvas/Helpers/AutoUpdateHelper.cs
@@ -1,4 +1,6 @@
-using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@@ -16,8 +18,6 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
namespace Ink_Canvas.Helpers
{
@@ -129,7 +129,7 @@ namespace Ink_Canvas.Helpers
// 检测是否为Windows 7
var osVersion = Environment.OSVersion;
bool isWindows7 = osVersion.Version.Major == 6 && osVersion.Version.Minor == 1;
-
+
if (isWindows7)
{
// Windows 7使用特殊配置
@@ -137,7 +137,7 @@ namespace Ink_Canvas.Helpers
{
// 配置HttpClientHandler以支持Windows 7
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
-
+
using (var client = new HttpClient(handler))
{
client.Timeout = TimeSpan.FromSeconds(5);
@@ -179,9 +179,9 @@ namespace Ink_Canvas.Helpers
{
var groups = ChannelLineGroups[channel];
var availableGroups = new List<(UpdateLineGroup group, long delay)>();
-
+
LogHelper.WriteLogToFile($"AutoUpdate | 开始检测通道 {channel} 下所有线路组延迟...");
-
+
foreach (var group in groups)
{
// 跳过"智教联盟"和"inkeys"线路组,不参与延迟检测和排序
@@ -202,13 +202,13 @@ namespace Ink_Canvas.Helpers
LogHelper.WriteLogToFile($"AutoUpdate | 线路组 {group.GroupName} 不可用", LogHelper.LogType.Warning);
}
}
-
+
// 按延迟排序,延迟最小的排在前面
var orderedGroups = availableGroups
.OrderBy(x => x.delay)
.Select(x => x.group)
.ToList();
-
+
// 将"智教联盟"线路组插入到最前面(如果存在)
var zhiJiaoGroup = groups.FirstOrDefault(g => g.GroupName == "智教联盟");
if (zhiJiaoGroup != null)
@@ -216,7 +216,7 @@ namespace Ink_Canvas.Helpers
orderedGroups.Insert(0, zhiJiaoGroup);
LogHelper.WriteLogToFile("AutoUpdate | 智教联盟线路组已插入到首位");
}
-
+
// 将"inkeys"线路组插入到第二位(如果存在)
var inkeysGroup = groups.FirstOrDefault(g => g.GroupName == "inkeys");
if (inkeysGroup != null)
@@ -224,7 +224,7 @@ namespace Ink_Canvas.Helpers
orderedGroups.Insert(1, inkeysGroup);
LogHelper.WriteLogToFile("AutoUpdate | inkeys线路组已插入到第二位");
}
-
+
if (orderedGroups.Count > 0)
{
LogHelper.WriteLogToFile($"AutoUpdate | 找到 {orderedGroups.Count} 个可用线路组,按延迟排序:");
@@ -237,7 +237,7 @@ namespace Ink_Canvas.Helpers
{
LogHelper.WriteLogToFile("AutoUpdate | 所有线路组均不可用", LogHelper.LogType.Error);
}
-
+
return orderedGroups;
}
@@ -247,7 +247,7 @@ namespace Ink_Canvas.Helpers
// 检测是否为Windows 7
var osVersion = Environment.OSVersion;
bool isWindows7 = osVersion.Version.Major == 6 && osVersion.Version.Minor == 1;
-
+
if (isWindows7)
{
// Windows 7使用特殊配置
@@ -257,29 +257,29 @@ namespace Ink_Canvas.Helpers
{
// 配置HttpClientHandler以支持Windows 7
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
-
+
using (HttpClient client = new HttpClient(handler))
{
client.Timeout = RequestTimeout;
LogHelper.WriteLogToFile($"AutoUpdate | 发送HTTP请求到: {fileUrl}");
-
+
var downloadTask = client.GetAsync(fileUrl);
var timeoutTask = Task.Delay(RequestTimeout);
-
+
var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
{
LogHelper.WriteLogToFile($"AutoUpdate | 请求超时 ({RequestTimeout.TotalSeconds}秒)", LogHelper.LogType.Error);
return null;
}
-
+
HttpResponseMessage response = await downloadTask;
LogHelper.WriteLogToFile($"AutoUpdate | HTTP响应状态: {response.StatusCode}");
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
content = content.Trim();
-
+
// 如果内容包含HTML(可能是GitHub页面而不是原始内容),尝试提取版本号
if (content.Contains("();
var finishedBlocks = new ConcurrentDictionary();
long[] blockDownloaded = new long[blockCount];
-
+
for (int i = 0; i < blockCount; i++)
{
long start = i * blockSize;
long end = Math.Min(start + blockSize - 1, totalSize - 1);
blockQueue.Enqueue(new BlockTask { Index = i, Start = start, End = end, RetryCount = 0 });
}
-
+
CancellationTokenSource cts = new CancellationTokenSource();
var tasks = new List();
-
+
for (int t = 0; t < threadCount; t++)
{
tasks.Add(Task.Run(async () =>
@@ -837,7 +837,7 @@ namespace Ink_Canvas.Helpers
{
bool success = false;
string tempPath = destinationPath + $".part{block.Index}";
-
+
for (int retry = block.RetryCount; retry < maxRetry && !success; retry++)
{
try
@@ -850,7 +850,7 @@ namespace Ink_Canvas.Helpers
// 增加连接超时设置
client.Timeout = TimeSpan.FromSeconds(30);
-
+
var downloadCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token);
var lastReadTime = DateTime.UtcNow;
bool dataReceived = false;
@@ -865,7 +865,7 @@ namespace Ink_Canvas.Helpers
byte[] buffer = new byte[8192];
int read;
long blockDownloadedBytes = 0;
-
+
while (true)
{
var readTask = stream.ReadAsync(buffer, 0, buffer.Length, downloadCts.Token);
@@ -885,7 +885,7 @@ namespace Ink_Canvas.Helpers
blockDownloaded[block.Index] = blockDownloadedBytes;
lastReadTime = DateTime.UtcNow;
dataReceived = true;
-
+
// 合并所有块进度
long totalDownloaded = blockDownloaded.Sum();
double percent = (double)totalDownloaded / totalSize * 100;
@@ -893,12 +893,12 @@ namespace Ink_Canvas.Helpers
}
}
}
-
+
if (!dataReceived)
{
throw new IOException("分块下载超时无数据");
}
-
+
// 验证分块大小是否正确
var fileInfo = new FileInfo(tempPath);
long expectedSize = block.End - block.Start + 1;
@@ -915,13 +915,13 @@ namespace Ink_Canvas.Helpers
{
LogHelper.WriteLogToFile($"AutoUpdate | 分块{block.Index}下载失败,第{retry + 1}次: {ex.Message}", LogHelper.LogType.Warning);
progressCallback?.Invoke(0, $"分块{block.Index}下载失败,第{retry + 1}次: {ex.Message}");
-
+
// 清理可能损坏的分块文件
if (File.Exists(tempPath))
{
try { File.Delete(tempPath); } catch { }
}
-
+
// 增加重试间隔,避免频繁重试
await Task.Delay(2000 * (retry + 1));
}
@@ -946,21 +946,21 @@ namespace Ink_Canvas.Helpers
}
}));
}
-
+
await Task.WhenAll(tasks);
-
+
if (cts.IsCancellationRequested || finishedBlocks.Count != blockCount)
{
LogHelper.WriteLogToFile($"AutoUpdate | {threadCount}线程下载失败,完成分块数: {finishedBlocks.Count}/{blockCount}", LogHelper.LogType.Warning);
progressCallback?.Invoke(0, $"{threadCount}线程下载失败,完成分块数: {finishedBlocks.Count}/{blockCount}");
-
+
// 清理分块文件
for (int i = 0; i < blockCount; i++)
{
string tempPath = destinationPath + $".part{i}";
if (File.Exists(tempPath)) File.Delete(tempPath);
}
-
+
if (threadCount == threadOptions.Last())
{
// 已经是最后一次尝试,降级为单线程
@@ -973,7 +973,7 @@ namespace Ink_Canvas.Helpers
progressCallback?.Invoke(0, $"{threadCount}线程下载失败,尝试降级为{threadOptions[Array.IndexOf(threadOptions, threadCount) + 1]}线程");
continue;
}
-
+
// 合并所有块
try
{
@@ -986,7 +986,7 @@ namespace Ink_Canvas.Helpers
{
throw new FileNotFoundException($"分块文件不存在: {tempPath}");
}
-
+
using (var input = new FileStream(tempPath, FileMode.Open, FileAccess.Read))
{
await input.CopyToAsync(output);
@@ -994,7 +994,7 @@ namespace Ink_Canvas.Helpers
File.Delete(tempPath);
}
}
-
+
progressCallback?.Invoke(100, $"多线程下载完成({threadCount}线程)");
LogHelper.WriteLogToFile($"AutoUpdate | 多线程下载完成({threadCount}线程)");
@@ -1007,7 +1007,7 @@ namespace Ink_Canvas.Helpers
progressCallback?.Invoke(0, "文件大小校验失败,已删除损坏文件");
return false;
}
-
+
// ZIP文件完整性校验
if (destinationPath.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
{
@@ -1043,12 +1043,12 @@ namespace Ink_Canvas.Helpers
{
LogHelper.WriteLogToFile($"AutoUpdate | 开始单线程下载: {fileUrl}");
progressCallback?.Invoke(0, "开始单线程下载");
-
+
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
client.Timeout = TimeSpan.FromMinutes(10); // 单线程下载设置更长的超时时间
-
+
using (var resp = await client.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead))
{
resp.EnsureSuccessStatusCode();
@@ -1059,12 +1059,12 @@ namespace Ink_Canvas.Helpers
int read;
long downloaded = 0;
var lastProgressUpdate = DateTime.UtcNow;
-
+
while ((read = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await fs.WriteAsync(buffer, 0, read);
downloaded += read;
-
+
// 限制进度更新频率,避免UI卡顿
if (DateTime.UtcNow - lastProgressUpdate > TimeSpan.FromMilliseconds(500))
{
@@ -1079,7 +1079,7 @@ namespace Ink_Canvas.Helpers
}
}
}
-
+
progressCallback?.Invoke(100, "单线程下载完成");
LogHelper.WriteLogToFile("AutoUpdate | 单线程下载完成");
return true;
@@ -1103,9 +1103,9 @@ namespace Ink_Canvas.Helpers
var resp = await client.SendAsync(req);
if (resp.IsSuccessStatusCode && resp.Content.Headers.ContentLength.HasValue)
return resp.Content.Headers.ContentLength.Value;
- }
- }
- catch { }
+ }
+ }
+ catch { }
return -1;
}
@@ -1146,13 +1146,13 @@ namespace Ink_Canvas.Helpers
Directory.CreateDirectory(backupDir);
LogHelper.WriteLogToFile($"创建备份目录: {backupDir}");
}
-
+
string backupFileName = $"Settings_BeforeUpdate_v{version}_{DateTime.Now:yyyyMMdd_HHmmss}.json";
string backupPath = Path.Combine(backupDir, backupFileName);
-
+
string settingsJson = JsonConvert.SerializeObject(MainWindow.Settings, Formatting.Indented);
File.WriteAllText(backupPath, settingsJson);
-
+
LogHelper.WriteLogToFile($"更新前自动备份设置成功: {backupPath}");
}
else
@@ -1164,7 +1164,7 @@ namespace Ink_Canvas.Helpers
{
LogHelper.WriteLogToFile($"更新前自动备份设置时出错: {ex.Message}", LogHelper.LogType.Error);
}
-
+
string zipFilePath = Path.Combine(updatesFolderPath, $"InkCanvasForClass.CE.{version}.zip");
LogHelper.WriteLogToFile($"AutoUpdate | 检查ZIP文件: {zipFilePath}");
@@ -1185,21 +1185,21 @@ namespace Ink_Canvas.Helpers
string currentAppDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
int currentProcessId = Process.GetCurrentProcess().Id;
string appPath = Assembly.GetExecutingAssembly().Location;
-
+
LogHelper.WriteLogToFile($"AutoUpdate | 当前应用程序目录: {currentAppDir}");
LogHelper.WriteLogToFile($"AutoUpdate | 当前进程ID: {currentProcessId}");
LogHelper.WriteLogToFile($"AutoUpdate | 静默更新模式: {isInSilence}");
string batchFilePath = Path.Combine(Path.GetTempPath(), "UpdateICC_" + Guid.NewGuid().ToString().Substring(0, 8) + ".bat");
LogHelper.WriteLogToFile($"AutoUpdate | 创建更新批处理文件: {batchFilePath}");
-
+
StringBuilder batchContent = new StringBuilder();
batchContent.AppendLine("@echo off");
-
+
batchContent.AppendLine("echo Set objShell = CreateObject(\"WScript.Shell\") > \"%temp%\\hideme.vbs\"");
batchContent.AppendLine("echo objShell.Run \"cmd /c \"\"\" ^& WScript.Arguments(0) ^& \"\"\"\", 0, True >> \"%temp%\\hideme.vbs\"");
batchContent.AppendLine("echo Wscript.Sleep 100 >> \"%temp%\\hideme.vbs\"");
-
+
string updateBatPath = Path.Combine(Path.GetTempPath(), "ICCUpdate_" + Guid.NewGuid().ToString().Substring(0, 8) + ".bat");
batchContent.AppendLine($"echo @echo off > \"{updateBatPath}\"");
batchContent.AppendLine($"echo set PROC_ID={currentProcessId} >> \"{updateBatPath}\"");
@@ -1209,32 +1209,32 @@ namespace Ink_Canvas.Helpers
batchContent.AppendLine($"echo timeout /t 1 /nobreak ^> nul >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo goto CHECK_PROCESS >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
-
+
batchContent.AppendLine($"echo echo Application closed, starting update process... >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo timeout /t 2 /nobreak ^> nul >> \"{updateBatPath}\"");
-
+
string extractPath = Path.Combine(updatesFolderPath, $"Extract_{version}");
batchContent.AppendLine($"echo echo Extracting update files... >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo if exist \"{extractPath}\" rd /s /q \"{extractPath}\" >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo mkdir \"{extractPath}\" >> \"{updateBatPath}\"");
-
+
batchContent.AppendLine($"echo powershell -command \"Expand-Archive -Path '{zipFilePath.Replace("'", "''")}' -DestinationPath '{extractPath.Replace("'", "''")}' -Force\" >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo goto ERROR_EXIT >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
-
+
batchContent.AppendLine($"echo echo Copying updated files to application directory... >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo xcopy /s /y /e \"{extractPath}\\*\" \"{currentAppDir}\\\" >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo goto ERROR_EXIT >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
-
+
batchContent.AppendLine($"echo echo Cleaning up temporary files... >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo if exist \"{extractPath}\" rd /s /q \"{extractPath}\" >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo if exist \"{zipFilePath}\" del /f /q \"{zipFilePath}\" >> \"{updateBatPath}\"");
-
+
batchContent.AppendLine($"echo echo Update completed successfully! >> \"{updateBatPath}\"");
-
+
if (isInSilence)
{
batchContent.AppendLine($"echo echo 自动启动应用程序... >> \"{updateBatPath}\"");
@@ -1242,7 +1242,7 @@ namespace Ink_Canvas.Helpers
}
else
{
- batchContent.AppendLine($"echo taskkill /F /IM \"InkCanvasForClass.exe\" >nul 2>nul >> \"{updateBatPath}\"");
+ batchContent.AppendLine($"echo taskkill /F /IM \"InkCanvasForClass.exe\" >nul 2>nul >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo :: 检查应用程序是否已经在运行 >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo tasklist /FI \"IMAGENAME eq InkCanvasForClass.exe\" | find /i \"InkCanvasForClass.exe\" > nul >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\"");
@@ -1252,10 +1252,10 @@ namespace Ink_Canvas.Helpers
batchContent.AppendLine($"echo echo 应用程序已经在运行,不再重复启动 >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo ) >> \"{updateBatPath}\"");
}
-
+
batchContent.AppendLine($"echo exit /b 0 >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo goto EXIT >> \"{updateBatPath}\"");
-
+
if (isInSilence)
{
batchContent.AppendLine($"echo :ERROR_EXIT >> \"{updateBatPath}\"");
@@ -1268,7 +1268,7 @@ namespace Ink_Canvas.Helpers
batchContent.AppendLine($"echo start \"\" cmd /c \"echo Update failed! ^& pause\" >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo exit /b 1 >> \"{updateBatPath}\"");
}
-
+
batchContent.AppendLine($"echo :EXIT >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo del \"{updateBatPath}\" >> \"{updateBatPath}\"");
batchContent.AppendLine($"echo exit >> \"{updateBatPath}\"");
@@ -1276,10 +1276,10 @@ namespace Ink_Canvas.Helpers
batchContent.AppendLine($"wscript \"%temp%\\hideme.vbs\" \"{updateBatPath}\"");
batchContent.AppendLine("del \"%temp%\\hideme.vbs\"");
batchContent.AppendLine("exit");
-
+
File.WriteAllText(batchFilePath, batchContent.ToString());
LogHelper.WriteLogToFile("AutoUpdate | 创建更新批处理文件完成");
-
+
Process.Start(new ProcessStartInfo
{
FileName = batchFilePath,
@@ -1287,7 +1287,7 @@ namespace Ink_Canvas.Helpers
UseShellExecute = true,
WindowStyle = ProcessWindowStyle.Hidden
});
-
+
LogHelper.WriteLogToFile("AutoUpdate | 启动更新批处理进程(隐藏窗口)");
}
catch (Exception ex)
@@ -1306,7 +1306,7 @@ namespace Ink_Canvas.Helpers
// 检测是否为Windows 7
var osVersion = Environment.OSVersion;
bool isWindows7 = osVersion.Version.Major == 6 && osVersion.Version.Minor == 1;
-
+
if (isWindows7)
{
// Windows 7使用特殊配置
@@ -1316,7 +1316,7 @@ namespace Ink_Canvas.Helpers
{
// 配置HttpClientHandler以支持Windows 7
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
-
+
using (HttpClient client = new HttpClient(handler))
{
client.Timeout = RequestTimeout;
@@ -1430,7 +1430,7 @@ namespace Ink_Canvas.Helpers
try
{
LogHelper.WriteLogToFile($"AutoUpdate | 开始修复版本,通道: {channel}");
-
+
// 获取远程版本号(自动选择最快线路组,始终下载远程版本,版本修复模式)
var (remoteVersion, group, _) = await CheckForUpdates(channel, true, true);
if (string.IsNullOrEmpty(remoteVersion) || group == null)
@@ -1438,9 +1438,9 @@ namespace Ink_Canvas.Helpers
LogHelper.WriteLogToFile("AutoUpdate | 修复版本时获取远程版本失败", LogHelper.LogType.Error);
return false;
}
-
+
LogHelper.WriteLogToFile($"AutoUpdate | 修复版本远程版本: {remoteVersion}");
-
+
// 无论版本是否为最新,都下载远程版本
bool downloadResult = await DownloadSetupFile(remoteVersion, group);
if (!downloadResult)
@@ -1448,11 +1448,12 @@ namespace Ink_Canvas.Helpers
LogHelper.WriteLogToFile("AutoUpdate | 修复版本时下载更新失败", LogHelper.LogType.Error);
return false;
}
-
+
// 执行安装,非静默模式
InstallNewVersionApp(remoteVersion, false);
App.IsAppExitByUser = true;
- Application.Current.Dispatcher.Invoke(() => {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
Application.Current.Shutdown();
});
return true;
@@ -1503,27 +1504,27 @@ namespace Ink_Canvas.Helpers
// 检测是否为Windows 7
var osVersion = Environment.OSVersion;
bool isWindows7 = osVersion.Version.Major == 6 && osVersion.Version.Minor == 1;
-
+
if (!isWindows7)
{
LogHelper.WriteLogToFile("AutoUpdate | 当前系统不是Windows 7,跳过TLS连接测试");
return true; // 非Windows 7系统直接返回成功
}
-
+
LogHelper.WriteLogToFile("AutoUpdate | 开始测试Windows 7 TLS连接...");
-
+
// 测试GitHub连接
var testUrl = "https://github.com/InkCanvasForClass/community/raw/refs/heads/main/AutomaticUpdateVersionControl.txt";
-
+
using (var handler = new HttpClientHandler())
{
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
-
+
using (var client = new HttpClient(handler))
{
client.Timeout = TimeSpan.FromSeconds(10);
var response = await client.GetAsync(testUrl);
-
+
if (response.IsSuccessStatusCode)
{
LogHelper.WriteLogToFile("AutoUpdate | Windows 7 TLS连接测试成功");
@@ -1580,7 +1581,8 @@ namespace Ink_Canvas.Helpers
LogHelper.WriteLogToFile($"AutoUpdate | 手动安装版本: {version}");
InstallNewVersionApp(version, false);
App.IsAppExitByUser = true;
- Application.Current.Dispatcher.Invoke(() => {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
Application.Current.Shutdown();
});
return true;
diff --git a/Ink Canvas/Helpers/AvoidFullScreenHelper.cs b/Ink Canvas/Helpers/AvoidFullScreenHelper.cs
index 88a6cdc2..06ef4db8 100644
--- a/Ink Canvas/Helpers/AvoidFullScreenHelper.cs
+++ b/Ink Canvas/Helpers/AvoidFullScreenHelper.cs
@@ -13,8 +13,8 @@ namespace Ink_Canvas.Helpers
{
private static readonly DependencyProperty IsAvoidFullScreenEnabledProperty =
DependencyProperty.RegisterAttached(
- "IsAvoidFullScreenEnabled",
- typeof(bool),
+ "IsAvoidFullScreenEnabled",
+ typeof(bool),
typeof(AvoidFullScreenHelper));
private static bool _isBoardMode;
@@ -122,19 +122,19 @@ namespace Ink_Canvas.Helpers
{
// 获取所有显示器
var screens = Screen.AllScreens;
-
+
// 确定窗口主要位于哪个显示器上
Screen targetScreen = null;
double maxIntersection = 0;
-
+
foreach (var screen in screens)
{
var screenRect = new Rect(
- screen.WorkingArea.X,
- screen.WorkingArea.Y,
- screen.WorkingArea.Width,
+ screen.WorkingArea.X,
+ screen.WorkingArea.Y,
+ screen.WorkingArea.Width,
screen.WorkingArea.Height);
-
+
var intersection = Rect.Intersect(windowRect, screenRect);
if (intersection.Width * intersection.Height > maxIntersection)
{
@@ -142,11 +142,11 @@ namespace Ink_Canvas.Helpers
targetScreen = screen;
}
}
-
+
// 如果没找到,使用主显示器
if (targetScreen == null)
targetScreen = Screen.PrimaryScreen;
-
+
return new Rect(
targetScreen.WorkingArea.X,
targetScreen.WorkingArea.Y,
@@ -159,21 +159,21 @@ namespace Ink_Canvas.Helpers
// 调整尺寸以适应工作区域
if (windowRect.Width > workingArea.Width)
windowRect.Width = workingArea.Width;
-
+
if (windowRect.Height > workingArea.Height)
windowRect.Height = workingArea.Height;
-
+
// 调整位置以确保窗口完全在工作区域内
if (windowRect.Left < workingArea.Left)
windowRect.X = workingArea.Left;
else if (windowRect.Right > workingArea.Right)
windowRect.X = workingArea.Right - windowRect.Width;
-
+
if (windowRect.Top < workingArea.Top)
windowRect.Y = workingArea.Top;
else if (windowRect.Bottom > workingArea.Bottom)
windowRect.Y = workingArea.Bottom - windowRect.Height;
-
+
return windowRect;
}
}
diff --git a/Ink Canvas/Helpers/DelAutoSavedFiles.cs b/Ink Canvas/Helpers/DelAutoSavedFiles.cs
index b88a8388..c541753f 100644
--- a/Ink Canvas/Helpers/DelAutoSavedFiles.cs
+++ b/Ink Canvas/Helpers/DelAutoSavedFiles.cs
@@ -1,47 +1,64 @@
using System;
using System.IO;
-namespace Ink_Canvas.Helpers {
- internal class DelAutoSavedFiles {
- public static void DeleteFilesOlder(string directoryPath, int daysThreshold) {
+namespace Ink_Canvas.Helpers
+{
+ internal class DelAutoSavedFiles
+ {
+ public static void DeleteFilesOlder(string directoryPath, int daysThreshold)
+ {
string[] extensionsToDel = { ".icstk", ".png" };
- if (Directory.Exists(directoryPath)) {
+ if (Directory.Exists(directoryPath))
+ {
// 获取目录中的所有子目录
string[] subDirectories = Directory.GetDirectories(directoryPath, "*", SearchOption.AllDirectories);
- foreach (string subDirectory in subDirectories) {
- try {
+ foreach (string subDirectory in subDirectories)
+ {
+ try
+ {
// 获取子目录下的所有文件
string[] files = Directory.GetFiles(subDirectory);
- foreach (string filePath in files) {
+ foreach (string filePath in files)
+ {
// 获取文件的创建日期
DateTime creationDate = File.GetCreationTime(filePath);
// 获取文件的扩展名
string fileExtension = Path.GetExtension(filePath);
// 如果文件的创建日期早于指定天数且是要删除的扩展名,则删除文件
- if (creationDate < DateTime.Now.AddDays(-daysThreshold)) {
+ if (creationDate < DateTime.Now.AddDays(-daysThreshold))
+ {
if (Array.Exists(extensionsToDel, ext => ext.Equals(fileExtension, StringComparison.OrdinalIgnoreCase))
- || Path.GetFileName(filePath).Equals("Position", StringComparison.OrdinalIgnoreCase)) {
+ || Path.GetFileName(filePath).Equals("Position", StringComparison.OrdinalIgnoreCase))
+ {
File.Delete(filePath);
}
}
}
- } catch (Exception ex) {
+ }
+ catch (Exception ex)
+ {
LogHelper.WriteLogToFile("DelAutoSavedFiles | 处理文件时出错: " + ex, LogHelper.LogType.Error);
}
}
- try { // 递归删除空文件夹
+ try
+ { // 递归删除空文件夹
DeleteEmptyFolders(directoryPath);
- } catch (Exception ex) {
+ }
+ catch (Exception ex)
+ {
LogHelper.WriteLogToFile("DelAutoSavedFiles | 处理文件时出错: " + ex, LogHelper.LogType.Error);
}
}
}
- private static void DeleteEmptyFolders(string directoryPath) {
- foreach (string dir in Directory.GetDirectories(directoryPath)) {
+ private static void DeleteEmptyFolders(string directoryPath)
+ {
+ foreach (string dir in Directory.GetDirectories(directoryPath))
+ {
DeleteEmptyFolders(dir);
- if (Directory.GetFiles(dir).Length == 0 && Directory.GetDirectories(dir).Length == 0) {
+ if (Directory.GetFiles(dir).Length == 0 && Directory.GetDirectories(dir).Length == 0)
+ {
Directory.Delete(dir, false);
}
}
diff --git a/Ink Canvas/Helpers/DelayActionHelper.cs b/Ink Canvas/Helpers/DelayActionHelper.cs
index 5f2dd0e7..66cb70c8 100644
--- a/Ink Canvas/Helpers/DelayActionHelper.cs
+++ b/Ink Canvas/Helpers/DelayActionHelper.cs
@@ -14,10 +14,13 @@ namespace Ink_Canvas.Helpers
/// 同步的對象,一般傳入控件,不需要可null
public void DebounceAction(int timeMs, ISynchronizeInvoke inv, Action action)
{
- lock (this) {
- if (_timerDebounce == null) {
+ lock (this)
+ {
+ if (_timerDebounce == null)
+ {
_timerDebounce = new Timer(timeMs) { AutoReset = false };
- _timerDebounce.Elapsed += (o, e) => {
+ _timerDebounce.Elapsed += (o, e) =>
+ {
_timerDebounce.Stop(); _timerDebounce.Close(); _timerDebounce = null;
InvokeAction(action, inv);
};
diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs
index 51912ee6..a82fe3a8 100644
--- a/Ink Canvas/Helpers/DeviceIdentifier.cs
+++ b/Ink Canvas/Helpers/DeviceIdentifier.cs
@@ -1,3 +1,5 @@
+using Microsoft.Win32;
+using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
@@ -5,8 +7,6 @@ using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
-using Microsoft.Win32;
-using Newtonsoft.Json;
namespace Ink_Canvas.Helpers
{
@@ -128,7 +128,7 @@ namespace Ink_Canvas.Helpers
{
// 收集硬件信息
var hardwareInfo = new StringBuilder();
-
+
// 使用反射获取硬件信息,避免直接引用System.Management
try
{
@@ -143,10 +143,10 @@ namespace Ink_Canvas.Helpers
var searcher = Activator.CreateInstance(searcherType, "SELECT ProcessorId FROM Win32_Processor");
var getMethod = searcherType.GetMethod("Get");
var enumerator = getMethod.Invoke(searcher, null);
-
+
var moveNextMethod = enumerator.GetType().GetMethod("MoveNext");
var currentProperty = enumerator.GetType().GetProperty("Current");
-
+
if ((bool)moveNextMethod.Invoke(enumerator, null))
{
var obj = currentProperty.GetValue(enumerator);
@@ -154,7 +154,7 @@ namespace Ink_Canvas.Helpers
var processorId = indexer.GetValue(obj, new object[] { "ProcessorId" });
hardwareInfo.Append(processorId?.ToString() ?? "");
}
-
+
var disposeMethod = searcher.GetType().GetMethod("Dispose");
disposeMethod?.Invoke(searcher, null);
}
@@ -167,10 +167,10 @@ namespace Ink_Canvas.Helpers
var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BaseBoard");
var getMethod = searcherType.GetMethod("Get");
var enumerator = getMethod.Invoke(searcher, null);
-
+
var moveNextMethod = enumerator.GetType().GetMethod("MoveNext");
var currentProperty = enumerator.GetType().GetProperty("Current");
-
+
if ((bool)moveNextMethod.Invoke(enumerator, null))
{
var obj = currentProperty.GetValue(enumerator);
@@ -178,7 +178,7 @@ namespace Ink_Canvas.Helpers
var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" });
hardwareInfo.Append(serialNumber?.ToString() ?? "");
}
-
+
var disposeMethod = searcher.GetType().GetMethod("Dispose");
disposeMethod?.Invoke(searcher, null);
}
@@ -191,10 +191,10 @@ namespace Ink_Canvas.Helpers
var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BIOS");
var getMethod = searcherType.GetMethod("Get");
var enumerator = getMethod.Invoke(searcher, null);
-
+
var moveNextMethod = enumerator.GetType().GetMethod("MoveNext");
var currentProperty = enumerator.GetType().GetProperty("Current");
-
+
if ((bool)moveNextMethod.Invoke(enumerator, null))
{
var obj = currentProperty.GetValue(enumerator);
@@ -202,7 +202,7 @@ namespace Ink_Canvas.Helpers
var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" });
hardwareInfo.Append(serialNumber?.ToString() ?? "");
}
-
+
var disposeMethod = searcher.GetType().GetMethod("Dispose");
disposeMethod?.Invoke(searcher, null);
}
@@ -215,10 +215,10 @@ namespace Ink_Canvas.Helpers
var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_DiskDrive WHERE MediaType='Fixed hard disk media'");
var getMethod = searcherType.GetMethod("Get");
var enumerator = getMethod.Invoke(searcher, null);
-
+
var moveNextMethod = enumerator.GetType().GetMethod("MoveNext");
var currentProperty = enumerator.GetType().GetProperty("Current");
-
+
if ((bool)moveNextMethod.Invoke(enumerator, null))
{
var obj = currentProperty.GetValue(enumerator);
@@ -226,7 +226,7 @@ namespace Ink_Canvas.Helpers
var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" });
hardwareInfo.Append(serialNumber?.ToString() ?? "");
}
-
+
var disposeMethod = searcher.GetType().GetMethod("Dispose");
disposeMethod?.Invoke(searcher, null);
}
@@ -251,7 +251,7 @@ namespace Ink_Canvas.Helpers
// 取前25个字符,确保唯一性
string deviceId = hashString.Substring(0, 25);
-
+
// 添加校验位(第25位)
int checksum = 0;
for (int i = 0; i < 24; i++)
@@ -260,7 +260,7 @@ namespace Ink_Canvas.Helpers
}
checksum %= 36; // 0-9, A-Z
char checksumChar = checksum < 10 ? (char)(checksum + '0') : (char)(checksum - 10 + 'A');
-
+
return deviceId.Substring(0, 24) + checksumChar;
}
}
@@ -281,7 +281,7 @@ namespace Ink_Canvas.Helpers
string timestamp = DateTime.Now.Ticks.ToString("X");
string random = Guid.NewGuid().ToString("N").Substring(0, 8);
string combined = timestamp + random;
-
+
using (var sha256 = SHA256.Create())
{
byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(combined));
@@ -2746,4 +2746,4 @@ namespace Ink_Canvas.Helpers
}
}
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/Ink Canvas/Helpers/ForegroundWindowInfo.cs b/Ink Canvas/Helpers/ForegroundWindowInfo.cs
index baaee5a1..6926a610 100644
--- a/Ink Canvas/Helpers/ForegroundWindowInfo.cs
+++ b/Ink Canvas/Helpers/ForegroundWindowInfo.cs
@@ -25,7 +25,8 @@ namespace Ink_Canvas.Helpers
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[StructLayout(LayoutKind.Sequential)]
- public struct RECT {
+ public struct RECT
+ {
public int Left;
public int Top;
public int Right;
@@ -35,7 +36,8 @@ namespace Ink_Canvas.Helpers
public int Height => Bottom - Top;
}
- public static string WindowTitle() {
+ public static string WindowTitle()
+ {
IntPtr foregroundWindowHandle = GetForegroundWindow();
const int nChars = 256;
@@ -45,7 +47,8 @@ namespace Ink_Canvas.Helpers
return windowTitle.ToString();
}
- public static string WindowClassName() {
+ public static string WindowClassName()
+ {
IntPtr foregroundWindowHandle = GetForegroundWindow();
const int nChars = 256;
@@ -55,7 +58,8 @@ namespace Ink_Canvas.Helpers
return className.ToString();
}
- public static RECT WindowRect() {
+ public static RECT WindowRect()
+ {
IntPtr foregroundWindowHandle = GetForegroundWindow();
RECT windowRect;
@@ -64,15 +68,19 @@ namespace Ink_Canvas.Helpers
return windowRect;
}
- public static string ProcessName() {
+ public static string ProcessName()
+ {
IntPtr foregroundWindowHandle = GetForegroundWindow();
uint processId;
GetWindowThreadProcessId(foregroundWindowHandle, out processId);
- try {
+ try
+ {
Process process = Process.GetProcessById((int)processId);
return process.ProcessName;
- } catch (ArgumentException) {
+ }
+ catch (ArgumentException)
+ {
// Process with the given ID not found
return "Unknown";
}
@@ -89,7 +97,8 @@ namespace Ink_Canvas.Helpers
Process process = Process.GetProcessById((int)processId);
return process.MainModule.FileName;
}
- catch {
+ catch
+ {
// Process with the given ID not found
return "Unknown";
}
diff --git a/Ink Canvas/Helpers/FullScreenHelper.Win32.cs b/Ink Canvas/Helpers/FullScreenHelper.Win32.cs
index 6cae5edd..cc109c54 100644
--- a/Ink Canvas/Helpers/FullScreenHelper.Win32.cs
+++ b/Ink Canvas/Helpers/FullScreenHelper.Win32.cs
@@ -81,7 +81,7 @@ namespace Ink_Canvas.Helpers
public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
public static IntPtr GetWindowLongPtr(IntPtr hWnd, GetWindowLongFields nIndex) =>
- GetWindowLongPtr(hWnd, (int) nIndex);
+ GetWindowLongPtr(hWnd, (int)nIndex);
public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
{
@@ -99,7 +99,7 @@ namespace Ink_Canvas.Helpers
public static extern IntPtr GetWindowLongPtr_x64(IntPtr hWnd, int nIndex);
public static IntPtr SetWindowLongPtr(IntPtr hWnd, GetWindowLongFields nIndex, IntPtr dwNewLong) =>
- SetWindowLongPtr(hWnd, (int) nIndex, dwNewLong);
+ SetWindowLongPtr(hWnd, (int)nIndex, dwNewLong);
public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
{
diff --git a/Ink Canvas/Helpers/FullScreenHelper.cs b/Ink Canvas/Helpers/FullScreenHelper.cs
index 3aed061f..a1dced48 100644
--- a/Ink Canvas/Helpers/FullScreenHelper.cs
+++ b/Ink Canvas/Helpers/FullScreenHelper.cs
@@ -67,12 +67,12 @@ namespace Ink_Canvas.Helpers
//获取当前窗口的位置大小状态并保存
var placement = new WINDOWPLACEMENT();
- placement.Size = (uint) Marshal.SizeOf(placement);
+ placement.Size = (uint)Marshal.SizeOf(placement);
Win32.User32.GetWindowPlacement(hwnd, ref placement);
window.SetValue(BeforeFullScreenWindowPlacementProperty, placement);
//修改窗口样式
- var style = (WindowStyles) Win32.User32.GetWindowLongPtr(hwnd, GetWindowLongFields.GWL_STYLE);
+ var style = (WindowStyles)Win32.User32.GetWindowLongPtr(hwnd, GetWindowLongFields.GWL_STYLE);
window.SetValue(BeforeFullScreenWindowStyleProperty, style);
//将窗口恢复到还原模式,在有标题栏的情况下最大化模式下无法全屏,
//这里采用还原,不修改标题栏的方式
@@ -81,7 +81,7 @@ namespace Ink_Canvas.Helpers
//去掉WS_MAXIMIZEBOX,禁用最大化,如果最大化会退出全屏
//去掉WS_MAXIMIZE,使窗口变成还原状态,不使用ShowWindow(hwnd, ShowWindowCommands.SW_RESTORE),避免看到窗口变成还原状态这一过程(也避免影响窗口的Visible状态)
style &= (~(WindowStyles.WS_THICKFRAME | WindowStyles.WS_MAXIMIZEBOX | WindowStyles.WS_MAXIMIZE));
- Win32.User32.SetWindowLongPtr(hwnd, GetWindowLongFields.GWL_STYLE, (IntPtr) style);
+ Win32.User32.SetWindowLongPtr(hwnd, GetWindowLongFields.GWL_STYLE, (IntPtr)style);
//禁用 DWM 过渡动画 忽略返回值,若DWM关闭不做处理
Win32.Dwmapi.DwmSetWindowAttribute(hwnd, DWMWINDOWATTRIBUTE.DWMWA_TRANSITIONS_FORCEDISABLED, 1,
@@ -95,8 +95,8 @@ namespace Ink_Canvas.Helpers
//不能用 placement 的坐标,placement是工作区坐标,不是屏幕坐标。
//使用窗口当前的矩形调用下设置窗口位置和尺寸的方法,让Hook来进行调整窗口位置和尺寸到全屏模式
- Win32.User32.SetWindowPos(hwnd, (IntPtr) HwndZOrder.HWND_TOPMOST, rect.Left, rect.Top, rect.Width,
- rect.Height, (int) WindowPositionFlags.SWP_NOZORDER);
+ Win32.User32.SetWindowPos(hwnd, (IntPtr)HwndZOrder.HWND_TOPMOST, rect.Left, rect.Top, rect.Width,
+ rect.Height, (int)WindowPositionFlags.SWP_NOZORDER);
}
}
}
@@ -139,7 +139,7 @@ namespace Ink_Canvas.Helpers
//不要改变Style里的WS_MAXIMIZE,否则会使窗口变成最大化状态,但是尺寸不对
//也不要设置回Style里的WS_MINIMIZE,否则会导致窗口最小化按钮显示成还原按钮
Win32.User32.SetWindowLongPtr(hwnd, GetWindowLongFields.GWL_STYLE,
- (IntPtr) (style & (~(WindowStyles.WS_MAXIMIZE | WindowStyles.WS_MINIMIZE))));
+ (IntPtr)(style & (~(WindowStyles.WS_MAXIMIZE | WindowStyles.WS_MINIMIZE))));
if ((style & WindowStyles.WS_MINIMIZE) != 0)
{
@@ -201,7 +201,7 @@ namespace Ink_Canvas.Helpers
try
{
//得到WINDOWPOS结构体
- var pos = (WindowPosition) Marshal.PtrToStructure(lParam, typeof(WindowPosition));
+ var pos = (WindowPosition)Marshal.PtrToStructure(lParam, typeof(WindowPosition));
if ((pos.Flags & WindowPositionFlags.SWP_NOMOVE) != 0 &&
(pos.Flags & WindowPositionFlags.SWP_NOSIZE) != 0)
@@ -245,7 +245,7 @@ namespace Ink_Canvas.Helpers
//使用目标矩形获取显示器信息
var monitor = Win32.User32.MonitorFromRect(targetRect, MonitorFlag.MONITOR_DEFAULTTOPRIMARY);
var info = new MonitorInfo();
- info.Size = (uint) Marshal.SizeOf(info);
+ info.Size = (uint)Marshal.SizeOf(info);
if (Win32.User32.GetMonitorInfo(monitor, ref info))
{
//基于显示器信息设置窗口尺寸位置
diff --git a/Ink Canvas/Helpers/HardwareAcceleratedInkProcessor.cs b/Ink Canvas/Helpers/HardwareAcceleratedInkProcessor.cs
index 9ac6f811..ccea253c 100644
--- a/Ink Canvas/Helpers/HardwareAcceleratedInkProcessor.cs
+++ b/Ink Canvas/Helpers/HardwareAcceleratedInkProcessor.cs
@@ -24,11 +24,11 @@ namespace Ink_Canvas.Helpers
// 创建硬件加速的渲染目标
_renderTarget = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
_drawingVisual = new DrawingVisual();
-
+
// 启用硬件加速
RenderOptions.SetBitmapScalingMode(_drawingVisual, BitmapScalingMode.HighQuality);
RenderOptions.SetEdgeMode(_drawingVisual, EdgeMode.Aliased);
-
+
_isInitialized = true;
}
@@ -46,10 +46,10 @@ namespace Ink_Canvas.Helpers
{
// 使用PathGeometry进行硬件加速的曲线拟合
var pathGeometry = CreateSmoothPathGeometry(originalStroke.StylusPoints);
-
+
// 将PathGeometry转换回StylusPoint集合
var smoothedPoints = ConvertPathGeometryToStylusPoints(pathGeometry, originalStroke.StylusPoints);
-
+
return new Stroke(new StylusPointCollection(smoothedPoints))
{
DrawingAttributes = originalStroke.DrawingAttributes.Clone()
@@ -69,11 +69,11 @@ namespace Ink_Canvas.Helpers
{
var pathGeometry = new PathGeometry();
var pathFigure = new PathFigure();
-
+
if (points.Count < 2) return pathGeometry;
-
+
pathFigure.StartPoint = new Point(points[0].X, points[0].Y);
-
+
// 使用贝塞尔曲线段创建平滑路径,增加插点密度
for (int i = 0; i < points.Count - 1; i += 2) // 从i+=3改为i+=2,增加插点密度
{
@@ -84,7 +84,7 @@ namespace Ink_Canvas.Helpers
var bezierSegment = new BezierSegment(p1, p2, p3, true);
pathFigure.Segments.Add(bezierSegment);
}
-
+
pathGeometry.Figures.Add(pathFigure);
return pathGeometry;
}
@@ -96,11 +96,11 @@ namespace Ink_Canvas.Helpers
{
var result = new List();
var flattened = pathGeometry.GetFlattenedPathGeometry();
-
+
foreach (var figure in flattened.Figures)
{
result.Add(new StylusPoint(figure.StartPoint.X, figure.StartPoint.Y, 0.5f));
-
+
foreach (var segment in figure.Segments)
{
if (segment is LineSegment lineSegment)
@@ -116,10 +116,10 @@ namespace Ink_Canvas.Helpers
}
}
}
-
+
// 保持原始压感信息
InterpolatePressure(result, originalPoints);
-
+
return result;
}
@@ -129,13 +129,13 @@ namespace Ink_Canvas.Helpers
private void InterpolatePressure(List smoothedPoints, StylusPointCollection originalPoints)
{
if (originalPoints.Count == 0 || smoothedPoints.Count == 0) return;
-
+
for (int i = 0; i < smoothedPoints.Count; i++)
{
double ratio = (double)i / (smoothedPoints.Count - 1);
int originalIndex = (int)(ratio * (originalPoints.Count - 1));
originalIndex = Math.Max(0, Math.Min(originalIndex, originalPoints.Count - 1));
-
+
var point = smoothedPoints[i];
float pressure = originalPoints[originalIndex].PressureFactor;
smoothedPoints[i] = new StylusPoint(point.X, point.Y, Math.Max(pressure, 0.1f));
@@ -148,23 +148,23 @@ namespace Ink_Canvas.Helpers
public static StylusPoint[] ParallelBezierInterpolation(StylusPoint[] controlPoints, int segments = 32)
{
if (controlPoints.Length < 4) return controlPoints;
-
+
var result = new StylusPoint[segments * (controlPoints.Length / 4)];
-
+
Parallel.For(0, controlPoints.Length / 4, segmentIndex =>
{
var p0 = controlPoints[segmentIndex * 4];
var p1 = controlPoints[segmentIndex * 4 + 1];
var p2 = controlPoints[segmentIndex * 4 + 2];
var p3 = controlPoints[segmentIndex * 4 + 3];
-
+
for (int i = 0; i < segments; i++)
{
double t = (double)i / (segments - 1);
result[segmentIndex * segments + i] = CubicBezierFast(p0, p1, p2, p3, t);
}
});
-
+
return result;
}
@@ -178,11 +178,11 @@ namespace Ink_Canvas.Helpers
double uu = u * u;
double uuu = uu * u;
double ttt = tt * t;
-
+
double x = uuu * p0.X + 3 * uu * t * p1.X + 3 * u * tt * p2.X + ttt * p3.X;
double y = uuu * p0.Y + 3 * uu * t * p1.Y + 3 * u * tt * p2.Y + ttt * p3.Y;
float pressure = (float)(p1.PressureFactor * u + p2.PressureFactor * t);
-
+
return new StylusPoint(x, y, Math.Max(pressure, 0.1f));
}
@@ -239,17 +239,17 @@ namespace Ink_Canvas.Helpers
case InkSmoothingQuality.HighPerformance:
SmoothingStrength = 0.4;
ResampleInterval = 2.0;
- InterpolationSteps = 16;
+ InterpolationSteps = 16;
break;
case InkSmoothingQuality.Balanced:
SmoothingStrength = 0.6;
ResampleInterval = 1.2;
- InterpolationSteps = 32;
+ InterpolationSteps = 32;
break;
case InkSmoothingQuality.HighQuality:
SmoothingStrength = 0.8;
ResampleInterval = 0.8;
- InterpolationSteps = 64;
+ InterpolationSteps = 64;
break;
}
}
diff --git a/Ink Canvas/Helpers/IACoreDllExtractor.cs b/Ink Canvas/Helpers/IACoreDllExtractor.cs
new file mode 100644
index 00000000..a2f9dc37
--- /dev/null
+++ b/Ink Canvas/Helpers/IACoreDllExtractor.cs
@@ -0,0 +1,167 @@
+using System;
+using System.IO;
+using System.Reflection;
+
+namespace Ink_Canvas.Helpers
+{
+ ///
+ /// IACore DLL自动释放器
+ /// 在应用启动时自动释放IACore相关的DLL文件到应用程序目录
+ ///
+ public static class IACoreDllExtractor
+ {
+ private static readonly string[] RequiredDlls = {
+ "IACore.dll",
+ "IALoader.dll",
+ "IAWinFX.dll"
+ };
+
+ ///
+ /// 在应用启动时释放IACore相关DLL
+ ///
+ public static void ExtractIACoreDlls()
+ {
+ try
+ {
+ string appDirectory = AppDomain.CurrentDomain.BaseDirectory;
+ LogHelper.WriteLogToFile("开始检查并释放IACore相关DLL文件");
+
+ foreach (string dllName in RequiredDlls)
+ {
+ string targetPath = Path.Combine(appDirectory, dllName);
+
+ // 检查文件是否已存在且有效
+ if (File.Exists(targetPath) && IsValidDll(targetPath))
+ {
+ LogHelper.WriteLogToFile($"{dllName} 已存在且有效,跳过释放");
+ continue;
+ }
+
+ // 从嵌入资源中释放DLL
+ if (ExtractDllFromResource(dllName, targetPath))
+ {
+ LogHelper.WriteLogToFile($"成功释放 {dllName} 到 {targetPath}");
+ }
+ else
+ {
+ LogHelper.WriteLogToFile($"警告:无法释放 {dllName},可能影响形状识别功能", LogHelper.LogType.Warning);
+ }
+ }
+
+ LogHelper.WriteLogToFile("IACore DLL释放检查完成");
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"释放IACore DLL时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 从嵌入资源中提取DLL文件
+ ///
+ private static bool ExtractDllFromResource(string dllName, string targetPath)
+ {
+ try
+ {
+ Assembly assembly = Assembly.GetExecutingAssembly();
+ string resourceName = $"Ink_Canvas.Resources.IACore.{dllName}";
+
+ using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
+ {
+ if (resourceStream == null)
+ {
+ LogHelper.WriteLogToFile($"未找到嵌入资源: {resourceName}", LogHelper.LogType.Warning);
+ return false;
+ }
+
+ // 确保目标目录存在
+ string targetDirectory = Path.GetDirectoryName(targetPath);
+ if (!Directory.Exists(targetDirectory))
+ {
+ Directory.CreateDirectory(targetDirectory);
+ }
+
+ // 写入文件
+ using (FileStream fileStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write))
+ {
+ resourceStream.CopyTo(fileStream);
+ }
+
+ return true;
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"从资源提取 {dllName} 失败: {ex.Message}", LogHelper.LogType.Error);
+ return false;
+ }
+ }
+
+ ///
+ /// 检查DLL文件是否有效
+ ///
+ private static bool IsValidDll(string filePath)
+ {
+ try
+ {
+ if (!File.Exists(filePath))
+ return false;
+
+ FileInfo fileInfo = new FileInfo(filePath);
+
+ // 检查文件大小(空文件或过小的文件可能无效)
+ if (fileInfo.Length < 1024) // 小于1KB可能无效
+ return false;
+
+ // 简单检查PE头(DLL文件应该以MZ开头)
+ using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
+ {
+ byte[] buffer = new byte[2];
+ if (fs.Read(buffer, 0, 2) == 2)
+ {
+ return buffer[0] == 0x4D && buffer[1] == 0x5A; // "MZ"
+ }
+ }
+
+ return false;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ ///
+ /// 清理释放的DLL文件(可选,在应用退出时调用)
+ ///
+ public static void CleanupExtractedDlls()
+ {
+ try
+ {
+ string appDirectory = AppDomain.CurrentDomain.BaseDirectory;
+
+ foreach (string dllName in RequiredDlls)
+ {
+ string filePath = Path.Combine(appDirectory, dllName);
+
+ if (File.Exists(filePath))
+ {
+ try
+ {
+ File.Delete(filePath);
+ LogHelper.WriteLogToFile($"已清理 {dllName}");
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"清理 {dllName} 失败: {ex.Message}", LogHelper.LogType.Warning);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"清理IACore DLL时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+ }
+}
diff --git a/Ink Canvas/Helpers/InkSmoothingManager.cs b/Ink Canvas/Helpers/InkSmoothingManager.cs
index c6490e41..3d2e5db5 100644
--- a/Ink Canvas/Helpers/InkSmoothingManager.cs
+++ b/Ink Canvas/Helpers/InkSmoothingManager.cs
@@ -25,7 +25,7 @@ namespace Ink_Canvas.Helpers
_uiDispatcher = uiDispatcher;
_config = InkSmoothingConfig.FromSettings();
_config.ApplyQualitySettings();
-
+
_asyncSmoothing = new AsyncAdvancedBezierSmoothing(uiDispatcher)
{
SmoothingStrength = _config.SmoothingStrength,
@@ -34,7 +34,7 @@ namespace Ink_Canvas.Helpers
UseHardwareAcceleration = _config.UseHardwareAcceleration,
MaxConcurrentTasks = _config.MaxConcurrentTasks
};
-
+
_hardwareProcessor = new HardwareAcceleratedInkProcessor();
_performanceMonitor = new InkSmoothingPerformanceMonitor();
}
@@ -42,7 +42,7 @@ namespace Ink_Canvas.Helpers
///
/// 平滑笔画(自动选择最佳方法)
///
- public async Task SmoothStrokeAsync(Stroke originalStroke,
+ public async Task SmoothStrokeAsync(Stroke originalStroke,
Action onCompleted = null,
CancellationToken cancellationToken = default)
{
@@ -142,7 +142,7 @@ namespace Ink_Canvas.Helpers
{
var newConfig = InkSmoothingConfig.FromSettings();
newConfig.ApplyQualitySettings();
-
+
_asyncSmoothing.SmoothingStrength = newConfig.SmoothingStrength;
_asyncSmoothing.ResampleInterval = newConfig.ResampleInterval;
_asyncSmoothing.InterpolationSteps = newConfig.InterpolationSteps;
@@ -189,11 +189,11 @@ namespace Ink_Canvas.Helpers
public static InkSmoothingConfig GetRecommendedConfig()
{
var config = new InkSmoothingConfig();
-
+
// 根据系统性能调整配置
var processorCount = Environment.ProcessorCount;
var isHardwareAccelerated = IsHardwareAccelerationSupported();
-
+
if (processorCount >= 4 && isHardwareAccelerated)
{
// 降低高质量模式的门槛,4核以上且支持硬件加速就使用高质量
@@ -218,7 +218,7 @@ namespace Ink_Canvas.Helpers
config.UseAsyncProcessing = false;
config.MaxConcurrentTasks = 1;
}
-
+
config.ApplyQualitySettings();
return config;
}
diff --git a/Ink Canvas/Helpers/IsOutsideOfScreenHelper.cs b/Ink Canvas/Helpers/IsOutsideOfScreenHelper.cs
index 618169ba..2621572b 100644
--- a/Ink Canvas/Helpers/IsOutsideOfScreenHelper.cs
+++ b/Ink Canvas/Helpers/IsOutsideOfScreenHelper.cs
@@ -5,11 +5,15 @@ using System.Windows.Forms;
using System.Windows.Interop;
using Point = System.Windows.Point;
-namespace Ink_Canvas.Helpers {
- internal class IsOutsideOfScreenHelper {
- public static bool IsOutsideOfScreen(FrameworkElement target) {
+namespace Ink_Canvas.Helpers
+{
+ internal class IsOutsideOfScreenHelper
+ {
+ public static bool IsOutsideOfScreen(FrameworkElement target)
+ {
var hwndSource = (HwndSource)PresentationSource.FromVisual(target);
- if (hwndSource is null) {
+ if (hwndSource is null)
+ {
return true;
}
@@ -19,7 +23,8 @@ namespace Ink_Canvas.Helpers {
var screens = Screen.AllScreens;
return !screens.Any(x => x.Bounds.IntersectsWith(targetBounds));
- Rectangle GetPixelBoundsToScreen(FrameworkElement visual) {
+ Rectangle GetPixelBoundsToScreen(FrameworkElement visual)
+ {
var pixelBoundsToScreen = Rect.Empty;
pixelBoundsToScreen.Union(visual.PointToScreen(new Point(0, 0)));
pixelBoundsToScreen.Union(visual.PointToScreen(new Point(visual.ActualWidth, 0)));
diff --git a/Ink Canvas/Helpers/LogHelper.cs b/Ink Canvas/Helpers/LogHelper.cs
index 29436f64..ce628ca8 100644
--- a/Ink Canvas/Helpers/LogHelper.cs
+++ b/Ink Canvas/Helpers/LogHelper.cs
@@ -33,12 +33,12 @@ namespace Ink_Canvas.Helpers
{
// 检查日志是否启用
if (MainWindow.Settings != null && MainWindow.Settings.Advanced != null && !MainWindow.Settings.Advanced.IsLogEnabled) return;
-
+
string strLogType = logType.ToString();
try
{
string file;
-
+
// 检查是否启用了日期保存功能
if (MainWindow.Settings != null && MainWindow.Settings.Advanced != null && MainWindow.Settings.Advanced.IsSaveLogByDate)
{
@@ -48,10 +48,10 @@ namespace Ink_Canvas.Helpers
{
Directory.CreateDirectory(logsPath);
}
-
+
// 检查Logs文件夹大小,如果超过5MB则清空
CheckAndCleanLogsFolder(logsPath);
-
+
// 使用软件启动时间作为日志文件名
file = Path.Combine(logsPath, $"Log_{AppStartTime}.txt");
}
@@ -59,12 +59,12 @@ namespace Ink_Canvas.Helpers
{
file = App.RootPath + LogFile;
}
-
+
if (!Directory.Exists(App.RootPath))
{
Directory.CreateDirectory(App.RootPath);
}
-
+
var threadId = Thread.CurrentThread.ManagedThreadId;
var callingMethod = new StackTrace(2, true).GetFrame(0);
string callerInfo = "";
@@ -92,16 +92,16 @@ namespace Ink_Canvas.Helpers
{
long totalSize = 0;
DirectoryInfo dirInfo = new DirectoryInfo(logsPath);
-
+
// 如果目录不存在,直接返回
if (!dirInfo.Exists) return;
-
+
// 计算文件夹大小
foreach (FileInfo file in dirInfo.GetFiles())
{
totalSize += file.Length;
}
-
+
// 如果超过5MB,清空文件夹
if (totalSize > MaxLogsFolderSizeBytes)
{
@@ -113,7 +113,7 @@ namespace Ink_Canvas.Helpers
}
catch { }
}
-
+
// 记录清理操作
string cleanupMessage = $"Logs folder exceeded size limit ({totalSize / 1024.0 / 1024.0:F2} MB > {MaxLogsFolderSizeBytes / 1024.0 / 1024.0:F2} MB). Folder cleaned.";
using (StreamWriter sw = new StreamWriter(Path.Combine(logsPath, $"Log_{AppStartTime}.txt"), true))
diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs
index 549ab5ab..0c548829 100644
--- a/Ink Canvas/Helpers/PPTInkManager.cs
+++ b/Ink Canvas/Helpers/PPTInkManager.cs
@@ -1,11 +1,9 @@
-using System;
-using System.Collections.Generic;
+using Microsoft.Office.Interop.PowerPoint;
+using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Ink;
-using System.Windows.Threading;
-using Microsoft.Office.Interop.PowerPoint;
namespace Ink_Canvas.Helpers
{
@@ -26,7 +24,7 @@ namespace Ink_Canvas.Helpers
private string _currentPresentationId = "";
private readonly object _lockObject = new object();
private bool _disposed = false;
-
+
// 墨迹锁定机制,防止翻页时的墨迹冲突
private DateTime _inkLockUntil = DateTime.MinValue;
private int _lockedSlideIndex = -1;
@@ -59,17 +57,17 @@ namespace Ink_Canvas.Helpers
{
// 生成演示文稿唯一标识符
_currentPresentationId = GeneratePresentationId(presentation);
-
+
// 重新初始化内存流数组
var slideCount = presentation.Slides.Count;
_memoryStreams = new MemoryStream[slideCount + 2];
-
+
// 如果启用自动保存,尝试加载已保存的墨迹
if (IsAutoSaveEnabled && !string.IsNullOrEmpty(AutoSaveLocation))
{
LoadSavedStrokes();
}
-
+
LogHelper.WriteLogToFile($"已初始化演示文稿墨迹管理: {presentation.Name}, 幻灯片数量: {slideCount}", LogHelper.LogType.Trace);
}
catch (Exception ex)
@@ -102,11 +100,11 @@ namespace Ink_Canvas.Helpers
var ms = new MemoryStream();
strokes.Save(ms);
ms.Position = 0;
-
+
// 释放旧的内存流
_memoryStreams[slideIndex]?.Dispose();
_memoryStreams[slideIndex] = ms;
-
+
LogHelper.WriteLogToFile($"已保存第{slideIndex}页墨迹,大小: {ms.Length} bytes", LogHelper.LogType.Trace);
}
}
@@ -214,11 +212,11 @@ namespace Ink_Canvas.Helpers
var srcBuf = new byte[_memoryStreams[i].Length];
_memoryStreams[i].Position = 0;
var byteLength = _memoryStreams[i].Read(srcBuf, 0, srcBuf.Length);
-
+
var filePath = Path.Combine(folderPath, i.ToString("0000") + ".icstk");
File.WriteAllBytes(filePath, srcBuf);
savedCount++;
-
+
LogHelper.WriteLogToFile($"已保存第{i}页墨迹,大小: {byteLength} bytes", LogHelper.LogType.Trace);
}
else
@@ -308,7 +306,7 @@ namespace Ink_Canvas.Helpers
_memoryStreams[i]?.Dispose();
_memoryStreams[i] = null;
}
-
+
CurrentStrokes.Clear();
LogHelper.WriteLogToFile("已清除所有墨迹", LogHelper.LogType.Trace);
}
@@ -360,7 +358,7 @@ namespace Ink_Canvas.Helpers
try
{
if (string.IsNullOrEmpty(filePath)) return "unknown";
-
+
using (var md5 = MD5.Create())
{
byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(filePath));
diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs
index 59a2f553..1a2d5a90 100644
--- a/Ink Canvas/Helpers/PPTManager.cs
+++ b/Ink Canvas/Helpers/PPTManager.cs
@@ -1,18 +1,13 @@
-using System;
+using Microsoft.Office.Interop.PowerPoint;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
-using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
-using System.Security.Cryptography;
using System.Text;
using System.Threading;
-using System.Threading.Tasks;
using System.Timers;
-using System.Windows;
using System.Windows.Threading;
-using Microsoft.Office.Core;
-using Microsoft.Office.Interop.PowerPoint;
using Application = System.Windows.Application;
using Timer = System.Timers.Timer;
@@ -514,7 +509,7 @@ namespace Ink_Canvas.Helpers
{
PresentationClose?.Invoke(pres);
LogHelper.WriteLogToFile($"演示文稿已关闭: {pres?.Name}", LogHelper.LogType.Event);
-
+
// 重新启动连接检查
_connectionCheckTimer?.Start();
}
@@ -986,7 +981,7 @@ namespace Ink_Canvas.Helpers
StopWpsProcessCheckTimer();
return;
}
-
+
// 检查前台WPS窗口是否存在(优化版)
bool isForegroundWpsWindowActive = IsForegroundWpsWindowStillActiveOptimized();
diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs
index 3bd1713d..ca235958 100644
--- a/Ink Canvas/Helpers/PPTUIManager.cs
+++ b/Ink Canvas/Helpers/PPTUIManager.cs
@@ -77,13 +77,13 @@ namespace Ink_Canvas.Helpers
{
_mainWindow.BtnPPTSlideShow.Visibility = Visibility.Collapsed;
_mainWindow.BtnPPTSlideShowEnd.Visibility = Visibility.Visible;
-
+
if (currentSlide > 0 && totalSlides > 0)
{
_mainWindow.PPTBtnPageNow.Text = currentSlide.ToString();
_mainWindow.PPTBtnPageTotal.Text = $"/ {totalSlides}";
}
-
+
UpdateNavigationPanelsVisibility();
UpdateNavigationButtonStyles();
}
@@ -147,25 +147,25 @@ namespace Ink_Canvas.Helpers
if (displayOption.Length >= 4)
{
var options = displayOption.ToCharArray();
-
+
// 左下角面板
if (options[0] == '2')
AnimationsHelper.ShowWithFadeIn(_mainWindow.LeftBottomPanelForPPTNavigation);
else
_mainWindow.LeftBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed;
-
+
// 右下角面板
if (options[1] == '2')
AnimationsHelper.ShowWithFadeIn(_mainWindow.RightBottomPanelForPPTNavigation);
else
_mainWindow.RightBottomPanelForPPTNavigation.Visibility = Visibility.Collapsed;
-
+
// 左侧面板
if (options[2] == '2')
AnimationsHelper.ShowWithFadeIn(_mainWindow.LeftSidePanelForPPTNavigation);
else
_mainWindow.LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
-
+
// 右侧面板
if (options[3] == '2')
AnimationsHelper.ShowWithFadeIn(_mainWindow.RightSidePanelForPPTNavigation);
@@ -230,10 +230,10 @@ namespace Ink_Canvas.Helpers
try
{
var visibility = show ? Visibility.Visible : Visibility.Collapsed;
-
+
if (_mainWindow.BtnExitPptFromSidebarLeft != null)
_mainWindow.BtnExitPptFromSidebarLeft.Visibility = visibility;
-
+
if (_mainWindow.BtnExitPptFromSidebarRight != null)
_mainWindow.BtnExitPptFromSidebarRight.Visibility = visibility;
}
@@ -290,7 +290,7 @@ namespace Ink_Canvas.Helpers
if (sideOption.Length < 3) return;
var options = sideOption.ToCharArray();
-
+
// 页码按钮显示
var pageButtonVisibility = options[0] == '2' ? Visibility.Visible : Visibility.Collapsed;
_mainWindow.PPTLSPageButton.Visibility = pageButtonVisibility;
@@ -319,7 +319,7 @@ namespace Ink_Canvas.Helpers
if (bottomOption.Length < 3) return;
var options = bottomOption.ToCharArray();
-
+
// 页码按钮显示
var pageButtonVisibility = options[0] == '2' ? Visibility.Visible : Visibility.Collapsed;
_mainWindow.PPTLBPageButton.Visibility = pageButtonVisibility;
@@ -345,7 +345,7 @@ namespace Ink_Canvas.Helpers
try
{
Color backgroundColor, borderColor, foregroundColor, feedbackColor;
-
+
if (isDarkTheme)
{
backgroundColor = Color.FromRgb(39, 39, 42);
@@ -364,7 +364,7 @@ namespace Ink_Canvas.Helpers
// 应用背景和边框颜色
var backgroundBrush = new SolidColorBrush(backgroundColor);
var borderBrush = new SolidColorBrush(borderColor);
-
+
leftBorder.Background = backgroundBrush;
leftBorder.BorderBrush = borderBrush;
rightBorder.Background = backgroundBrush;
diff --git a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherButton.cs b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherButton.cs
index 4ccc2abb..54eb84bd 100644
--- a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherButton.cs
+++ b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherButton.cs
@@ -1,9 +1,9 @@
+using iNKORE.UI.WPF.Modern.Controls;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
-using iNKORE.UI.WPF.Modern.Controls;
namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
@@ -16,17 +16,17 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
/// 父插件
///
private readonly SuperLauncherPlugin _plugin;
-
+
///
/// 实际按钮控件
///
private readonly SimpleStackPanel _panel;
-
+
///
/// 获取按钮UI元素
///
public UIElement Element => _panel;
-
+
///
/// 构造函数
///
@@ -37,7 +37,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
_plugin = plugin;
LogHelper.WriteLogToFile("开始创建启动台按钮");
-
+
// 创建SimpleStackPanel
_panel = new SimpleStackPanel
{
@@ -48,13 +48,13 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
Margin = new Thickness(0, -2, 0, 0),
Background = Brushes.Transparent
};
-
+
LogHelper.WriteLogToFile("创建SimpleStackPanel完成");
-
+
// 添加图标
var image = CreateIconImage();
_panel.Children.Add(image);
-
+
// 添加文本
TextBlock textBlock = new TextBlock
{
@@ -65,18 +65,18 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
TextAlignment = TextAlignment.Center
};
_panel.Children.Add(textBlock);
-
+
// 设置鼠标事件
_panel.MouseDown += Panel_MouseDown;
_panel.MouseUp += Panel_MouseUp;
_panel.MouseLeave += Panel_MouseLeave;
-
+
// 右键菜单支持
_panel.ContextMenu = CreateContextMenu();
-
+
// 设置工具提示
_panel.ToolTip = "启动台";
-
+
LogHelper.WriteLogToFile("启动台按钮创建完成");
}
catch (Exception ex)
@@ -85,7 +85,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
LogHelper.NewLog(ex);
}
}
-
+
///
/// 创建右键菜单
///
@@ -95,31 +95,31 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
// 创建菜单
ContextMenu menu = new ContextMenu();
-
+
// 创建位置切换菜单项
MenuItem positionMenuItem = new MenuItem();
- positionMenuItem.Header = _plugin.Config.ButtonPosition == LauncherButtonPosition.Left ?
+ positionMenuItem.Header = _plugin.Config.ButtonPosition == LauncherButtonPosition.Left ?
"移至右侧" : "移至左侧";
- positionMenuItem.Click += (s, e) =>
+ positionMenuItem.Click += (s, e) =>
{
// 切换位置
- _plugin.Config.ButtonPosition = _plugin.Config.ButtonPosition == LauncherButtonPosition.Left ?
+ _plugin.Config.ButtonPosition = _plugin.Config.ButtonPosition == LauncherButtonPosition.Left ?
LauncherButtonPosition.Right : LauncherButtonPosition.Left;
-
+
// 更新按钮位置
_plugin.UpdateButtonPosition();
-
+
// 保存配置
_plugin.SaveConfig();
-
+
LogHelper.WriteLogToFile($"通过右键菜单切换启动台按钮位置为: {_plugin.Config.ButtonPosition}");
};
menu.Items.Add(positionMenuItem);
-
+
// 添加设置菜单项
MenuItem settingsMenuItem = new MenuItem();
settingsMenuItem.Header = "打开设置";
- settingsMenuItem.Click += (s, e) =>
+ settingsMenuItem.Click += (s, e) =>
{
// 打开插件设置窗口
var mainWindow = Application.Current.MainWindow;
@@ -142,7 +142,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
}
};
menu.Items.Add(settingsMenuItem);
-
+
return menu;
}
catch (Exception ex)
@@ -151,7 +151,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
return null;
}
}
-
+
///
/// 获取实际的UI元素
///
@@ -160,7 +160,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
return _panel;
}
-
+
///
/// 创建图标图像
///
@@ -174,40 +174,40 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
Height = 17,
Margin = new Thickness(0, 3, 0, 0)
};
-
+
// 设置位图缩放模式
RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.HighQuality);
-
+
// 创建绘图图像
DrawingImage drawingImage = new DrawingImage();
DrawingGroup drawingGroup = new DrawingGroup();
drawingGroup.ClipGeometry = Geometry.Parse("M0,0 V24 H24 V0 H0 Z");
-
+
// 使用提供的应用网格图标
GeometryDrawing geometryDrawing = new GeometryDrawing
{
Brush = new SolidColorBrush(Color.FromRgb(0x1B, 0x1B, 0x1B)),
Geometry = Geometry.Parse("F0 M24,24z M0,0z M4.41721,4.29873C4.35178,4.29873,4.29873,4.35178,4.29873,4.41721L4.29873,9.15646C4.29873,9.22189,4.35178,9.27494,4.41721,9.27494L9.15646,9.27494C9.22189,9.27494,9.27494,9.22189,9.27494,9.15646L9.27494,4.41721C9.27494,4.35178,9.22189,4.29873,9.15646,4.29873L4.41721,4.29873z M2.64,4.41721C2.64,3.43569,3.43569,2.64,4.41721,2.64L9.15646,2.64C10.138,2.64,10.9337,3.43569,10.9337,4.41721L10.9337,9.15646C10.9337,10.138,10.138,10.9337,9.15646,10.9337L4.41721,10.9337C3.43569,10.9337,2.64,10.138,2.64,9.15646L2.64,4.41721z M14.8435,4.29873C14.7781,4.29873,14.7251,4.35178,14.7251,4.41721L14.7251,9.15646C14.7251,9.22189,14.7781,9.27494,14.8435,9.27494L19.5828,9.27494C19.6482,9.27494,19.7013,9.22189,19.7013,9.15646L19.7013,4.41721C19.7013,4.35178,19.6482,4.29873,19.5828,4.29873L14.8435,4.29873z M13.0663,4.41721C13.0663,3.43569,13.862,2.64,14.8435,2.64L19.5828,2.64C20.5643,2.64,21.36,3.43569,21.36,4.41721L21.36,9.15646C21.36,10.138,20.5643,10.9337,19.5828,10.9337L14.8435,10.9337C13.862,10.9337,13.0663,10.138,13.0663,9.15646L13.0663,4.41721z M14.8435,14.7251C14.7781,14.7251,14.7251,14.7781,14.7251,14.8435L14.7251,19.5828C14.7251,19.6482,14.7781,19.7013,14.8435,19.7013L19.5828,19.7013C19.6482,19.7013,19.7013,19.6482,19.7013,19.5828L19.7013,14.8435C19.7013,14.7781,19.6482,14.7251,19.5828,14.7251L14.8435,14.7251z M13.0663,14.8435C13.0663,13.862,13.862,13.0663,14.8435,13.0663L19.5828,13.0663C20.5643,13.0663,21.36,13.862,21.36,14.8435L21.36,19.5828C21.36,20.5643,20.5643,21.36,19.5828,21.36L14.8435,21.36C13.862,21.36,13.0663,20.5643,13.0663,19.5828L13.0663,14.8435z M4.41721,14.7251C4.35178,14.7251,4.29873,14.7781,4.29873,14.8435L4.29873,19.5828C4.29873,19.6482,4.35178,19.7013,4.41721,19.7013L9.15646,19.7013C9.22189,19.7013,9.27494,19.6482,9.27494,19.5828L9.27494,14.8435C9.27494,14.7781,9.22189,14.7251,9.15646,14.7251L4.41721,14.7251z M2.64,14.8435C2.64,13.862,3.43569,13.0663,4.41721,13.0663L9.15646,13.0663C10.138,13.0663,10.9337,13.862,10.9337,14.8435L10.9337,19.5828C10.9337,20.5643,10.138,21.36,9.15646,21.36L4.41721,21.36C3.43569,21.36,2.64,20.5643,2.64,19.5828L2.64,14.8435z")
};
-
+
drawingGroup.Children.Add(geometryDrawing);
-
+
// 设置图像源
drawingImage.Drawing = drawingGroup;
image.Source = drawingImage;
-
+
return image;
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"创建图标图像时出错: {ex.Message}", LogHelper.LogType.Error);
LogHelper.NewLog(ex);
-
+
// 返回一个空图像
return new Image();
}
}
-
+
///
/// 鼠标按下事件
///
@@ -224,7 +224,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
LogHelper.WriteLogToFile($"启动台按钮鼠标按下事件出错: {ex.Message}", LogHelper.LogType.Error);
}
}
-
+
///
/// 鼠标抬起事件
///
@@ -237,14 +237,14 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
return;
}
-
+
// 恢复背景
_panel.Background = Brushes.Transparent;
LogHelper.WriteLogToFile("启动台按钮鼠标抬起,准备显示启动台窗口");
-
+
// 获取按钮在屏幕上的位置
Point buttonPosition = _panel.PointToScreen(new Point(_panel.ActualWidth / 2, 0));
-
+
// 显示启动台窗口
_plugin.ShowLauncherWindow(buttonPosition);
}
@@ -254,7 +254,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
LogHelper.NewLog(ex);
}
}
-
+
///
/// 鼠标离开事件
///
@@ -271,4 +271,4 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
}
}
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherModels.cs b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherModels.cs
index a3a63d15..9b6ac63b 100644
--- a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherModels.cs
+++ b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherModels.cs
@@ -1,3 +1,5 @@
+using Microsoft.Win32;
+using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -8,8 +10,6 @@ using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
-using Microsoft.Win32;
-using Newtonsoft.Json;
namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
@@ -22,13 +22,13 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
/// 左侧
///
Left,
-
+
///
/// 右侧
///
Right
}
-
+
///
/// 启动台配置
///
@@ -38,13 +38,13 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
/// 启动台按钮位置
///
public LauncherButtonPosition ButtonPosition { get; set; } = LauncherButtonPosition.Right;
-
+
///
/// 启动台应用程序列表
///
public List Items { get; set; } = new List();
}
-
+
///
/// 启动台应用项
///
@@ -54,33 +54,33 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
/// 应用程序名称
///
public string Name { get; set; }
-
+
///
/// 应用程序路径
///
public string Path { get; set; }
-
+
///
/// 是否可见
///
public bool IsVisible { get; set; } = true;
-
+
///
/// 在启动台中的位置(0-39)
///
public int Position { get; set; } = -1;
-
+
///
/// 是否已固定位置
///
public bool IsPositionFixed { get; set; } = false;
-
+
///
/// 图标缓存
///
[JsonIgnore]
private ImageSource _iconCache;
-
+
///
/// 获取应用程序图标
///
@@ -93,7 +93,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
return _iconCache;
}
-
+
try
{
if (File.Exists(Path))
@@ -106,7 +106,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
icon.Handle,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
-
+
icon.Dispose();
return _iconCache;
}
@@ -126,7 +126,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
string[] parts = iconPath.Split(',');
string iconFile = parts[0].Trim('"');
int iconIndex = parts.Length > 1 ? Convert.ToInt32(parts[1]) : 0;
-
+
if (File.Exists(iconFile))
{
Icon icon = IconExtractor.Extract(iconFile, iconIndex, true);
@@ -136,7 +136,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
icon.Handle,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
-
+
icon.Dispose();
return _iconCache;
}
@@ -150,12 +150,12 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
LogHelper.WriteLogToFile($"获取应用图标时出错: {ex.Message}", LogHelper.LogType.Error);
}
-
+
// 返回默认图标
return GetDefaultIcon();
}
}
-
+
///
/// 获取默认图标
///
@@ -179,7 +179,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
icon.Handle,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
-
+
icon.Dispose();
return _iconCache;
}
@@ -190,7 +190,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
LogHelper.WriteLogToFile($"获取资源管理器图标时出错: {ex.Message}", LogHelper.LogType.Warning);
// 如果获取Windows图标失败,回退到默认图标
}
-
+
// 回退到备用图标
string explorerIconPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "Icons-Fluent", "ic_fluent_folder_24_regular.png");
if (File.Exists(explorerIconPath))
@@ -201,7 +201,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
return _iconCache;
}
}
-
+
// 返回一个简单的默认图标
string iconPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "Icons-png", "icc.png");
if (File.Exists(iconPath))
@@ -211,7 +211,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
_iconCache = image;
return _iconCache;
}
-
+
// 如果还是没有找到,尝试使用应用程序图标
string appIconPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "Icons-Fluent", "ic_fluent_apps_24_regular.png");
if (File.Exists(appIconPath))
@@ -222,14 +222,14 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
return _iconCache;
}
}
- catch (Exception ex)
+ catch (Exception ex)
{
LogHelper.WriteLogToFile($"获取默认图标时出错: {ex.Message}", LogHelper.LogType.Error);
}
-
+
return null;
}
-
+
///
/// 启动应用程序
///
@@ -242,7 +242,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
LogHelper.WriteLogToFile("无法启动应用程序:路径为空", LogHelper.LogType.Error);
return;
}
-
+
// 检查文件是否存在
if (!File.Exists(Path) && !Path.Contains(":\\"))
{
@@ -264,7 +264,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
};
Process.Start(psi);
}
-
+
LogHelper.WriteLogToFile($"已启动应用程序: {Path}");
}
catch (Exception ex)
@@ -274,7 +274,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
}
}
}
-
+
///
/// 图标提取工具类
///
@@ -294,7 +294,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
IntPtr large;
IntPtr small;
ExtractIconEx(file, index, out large, out small, 1);
-
+
try
{
return Icon.FromHandle(largeIcon ? large : small);
@@ -307,7 +307,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
if (large != IntPtr.Zero)
DestroyIcon(large);
-
+
if (small != IntPtr.Zero)
DestroyIcon(small);
}
@@ -317,7 +317,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
return null;
}
}
-
+
[DllImport("Shell32.dll", EntryPoint = "ExtractIconEx")]
private static extern int ExtractIconEx(
[MarshalAs(UnmanagedType.LPStr)] string lpszFile,
@@ -325,8 +325,8 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
out IntPtr phiconLarge,
out IntPtr phiconSmall,
int nIcons);
-
+
[DllImport("User32.dll")]
private static extern int DestroyIcon(IntPtr hIcon);
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherSettingsControl.xaml.cs b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherSettingsControl.xaml.cs
index 9d254245..6666f10d 100644
--- a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherSettingsControl.xaml.cs
+++ b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherSettingsControl.xaml.cs
@@ -1,10 +1,10 @@
+using Ink_Canvas.Windows;
+using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.IO;
using System.Windows;
using System.Windows.Controls;
-using Ink_Canvas.Windows;
-using Microsoft.Win32;
namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
@@ -17,7 +17,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
/// 父插件
///
private readonly SuperLauncherPlugin _plugin;
-
+
///
/// 构造函数
///
@@ -25,20 +25,20 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
public LauncherSettingsControl(SuperLauncherPlugin plugin)
{
InitializeComponent();
-
+
_plugin = plugin;
-
+
// 设置按钮位置
RbtnLeft.IsChecked = _plugin.Config.ButtonPosition == LauncherButtonPosition.Left;
RbtnRight.IsChecked = _plugin.Config.ButtonPosition == LauncherButtonPosition.Right;
-
+
// 绑定应用列表
DgApps.ItemsSource = _plugin.LauncherItems;
-
+
// 初始化按钮状态
UpdateButtonStates();
}
-
+
///
/// 更新按钮状态
///
@@ -48,16 +48,16 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
BtnEdit.IsEnabled = hasSelection;
BtnDelete.IsEnabled = hasSelection;
}
-
+
///
/// 位置单选按钮选择事件
///
private void RbtnPosition_Checked(object sender, RoutedEventArgs e)
{
if (!IsLoaded) return;
-
+
LauncherButtonPosition oldPosition = _plugin.Config.ButtonPosition;
-
+
if (sender == RbtnLeft)
{
_plugin.Config.ButtonPosition = LauncherButtonPosition.Left;
@@ -66,7 +66,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
_plugin.Config.ButtonPosition = LauncherButtonPosition.Right;
}
-
+
// 如果位置发生变化,更新按钮位置
if (oldPosition != _plugin.Config.ButtonPosition)
{
@@ -74,10 +74,10 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
// 更新按钮位置
_plugin.UpdateButtonPosition();
-
+
// 保存配置
_plugin.SaveConfig();
-
+
LogHelper.WriteLogToFile($"启动台按钮位置已更改为: {_plugin.Config.ButtonPosition}");
}
catch (Exception ex)
@@ -87,7 +87,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
}
}
}
-
+
///
/// 添加按钮点击事件
///
@@ -103,7 +103,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
IsVisible = true,
Position = -1 // 让插件管理器分配位置
};
-
+
// 直接显示编辑对话框
EditLauncherItem(item, true);
}
@@ -113,7 +113,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
MessageBox.Show($"添加启动项时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
-
+
///
/// 编辑应用按钮点击事件
///
@@ -124,7 +124,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
EditLauncherItem(item, false);
}
}
-
+
///
/// 删除应用按钮点击事件
///
@@ -134,22 +134,22 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
// 确认删除
MessageBoxResult result = MessageBox.Show(
- $"确定要删除 {item.Name} 吗?",
- "删除确认",
- MessageBoxButton.YesNo,
+ $"确定要删除 {item.Name} 吗?",
+ "删除确认",
+ MessageBoxButton.YesNo,
MessageBoxImage.Question);
-
+
if (result == MessageBoxResult.Yes)
{
// 从集合中移除
_plugin.LauncherItems.Remove(item);
-
+
// 保存配置
_plugin.SaveConfig();
}
}
}
-
+
///
/// 保存设置按钮点击事件
///
@@ -159,7 +159,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
// 保存配置
_plugin.SaveConfig();
-
+
// 如果插件已启用,重新加载启动台按钮
if (_plugin.IsEnabled)
{
@@ -170,7 +170,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
// 如果插件未启用,则启用它
_plugin.Enable();
-
+
// 通知PluginSettingsWindow刷新插件列表
var window = Window.GetWindow(this);
if (window is PluginSettingsWindow pluginSettingsWindow)
@@ -179,7 +179,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
pluginSettingsWindow.RefreshPluginList();
}
}
-
+
MessageBox.Show("设置已保存并应用!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
@@ -188,7 +188,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
MessageBox.Show($"保存设置时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
-
+
///
/// 应用项选择变更事件
///
@@ -196,7 +196,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
UpdateButtonStates();
}
-
+
///
/// 编辑启动项
///
@@ -213,63 +213,63 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
WindowStartupLocation = WindowStartupLocation.CenterScreen,
ResizeMode = ResizeMode.NoResize
};
-
+
// 创建编辑表单
Grid grid = new Grid
{
Margin = new Thickness(20)
};
-
+
grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
-
+
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(80) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
-
+
// 名称输入框
- TextBlock nameLabel = new TextBlock
- {
- Text = "名称:",
- VerticalAlignment = VerticalAlignment.Center
+ TextBlock nameLabel = new TextBlock
+ {
+ Text = "名称:",
+ VerticalAlignment = VerticalAlignment.Center
};
- TextBox nameTextBox = new TextBox
- {
- Text = item.Name,
- Margin = new Thickness(0, 5, 0, 5)
+ TextBox nameTextBox = new TextBox
+ {
+ Text = item.Name,
+ Margin = new Thickness(0, 5, 0, 5)
};
-
+
Grid.SetRow(nameLabel, 0);
Grid.SetColumn(nameLabel, 0);
Grid.SetRow(nameTextBox, 0);
Grid.SetColumn(nameTextBox, 1);
-
+
grid.Children.Add(nameLabel);
grid.Children.Add(nameTextBox);
-
+
// 路径输入框
- TextBlock pathLabel = new TextBlock
- {
- Text = "路径:",
- VerticalAlignment = VerticalAlignment.Center
+ TextBlock pathLabel = new TextBlock
+ {
+ Text = "路径:",
+ VerticalAlignment = VerticalAlignment.Center
};
Grid pathGrid = new Grid();
pathGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
pathGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength() });
-
- TextBox pathTextBox = new TextBox
- {
- Text = item.Path,
- Margin = new Thickness(0, 5, 5, 5)
+
+ TextBox pathTextBox = new TextBox
+ {
+ Text = item.Path,
+ Margin = new Thickness(0, 5, 5, 5)
};
- Button browseButton = new Button
- {
- Content = "浏览",
+ Button browseButton = new Button
+ {
+ Content = "浏览",
Padding = new Thickness(5, 0, 5, 0),
Margin = new Thickness(0, 5, 0, 5)
};
-
- browseButton.Click += (s, e) =>
+
+ browseButton.Click += (s, e) =>
{
OpenFileDialog dialog = new OpenFileDialog
{
@@ -278,11 +278,11 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
Multiselect = false,
FileName = pathTextBox.Text
};
-
+
if (dialog.ShowDialog() == true)
{
pathTextBox.Text = dialog.FileName;
-
+
// 如果选择的是.exe文件,自动获取文件名填入名称字段
if (Path.GetExtension(dialog.FileName).ToLower() == ".exe")
{
@@ -295,20 +295,20 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
}
}
};
-
+
Grid.SetColumn(pathTextBox, 0);
Grid.SetColumn(browseButton, 1);
pathGrid.Children.Add(pathTextBox);
pathGrid.Children.Add(browseButton);
-
+
Grid.SetRow(pathLabel, 1);
Grid.SetColumn(pathLabel, 0);
Grid.SetRow(pathGrid, 1);
Grid.SetColumn(pathGrid, 1);
-
+
grid.Children.Add(pathLabel);
grid.Children.Add(pathGrid);
-
+
// 确认和取消按钮
StackPanel buttonPanel = new StackPanel
{
@@ -316,7 +316,7 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
HorizontalAlignment = HorizontalAlignment.Right,
Margin = new Thickness(0, 10, 0, 0)
};
-
+
Button okButton = new Button
{
Content = "确定",
@@ -324,15 +324,15 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
Margin = new Thickness(0, 0, 10, 0),
IsDefault = true
};
-
+
Button cancelButton = new Button
{
Content = "取消",
Padding = new Thickness(15, 5, 15, 5),
IsCancel = true
};
-
- okButton.Click += (s, e) =>
+
+ okButton.Click += (s, e) =>
{
// 验证输入
if (string.IsNullOrWhiteSpace(nameTextBox.Text))
@@ -340,17 +340,17 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
MessageBox.Show("请输入应用名称!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
-
+
if (string.IsNullOrWhiteSpace(pathTextBox.Text))
{
MessageBox.Show("请输入应用路径!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
-
+
// 更新项目
item.Name = nameTextBox.Text;
item.Path = pathTextBox.Text;
-
+
// 如果是新建,添加到集合
if (isNew)
{
@@ -363,34 +363,34 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
{
view.Refresh();
}
-
+
// 保存配置
_plugin.SaveConfig();
}
-
+
editWindow.DialogResult = true;
editWindow.Close();
};
-
- cancelButton.Click += (s, e) =>
+
+ cancelButton.Click += (s, e) =>
{
editWindow.DialogResult = false;
editWindow.Close();
};
-
+
buttonPanel.Children.Add(okButton);
buttonPanel.Children.Add(cancelButton);
-
+
Grid.SetRow(buttonPanel, 2);
Grid.SetColumnSpan(buttonPanel, 2);
-
+
grid.Children.Add(buttonPanel);
-
+
// 设置窗口内容
editWindow.Content = grid;
-
+
// 显示窗口
editWindow.ShowDialog();
}
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherWindow.xaml.cs b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherWindow.xaml.cs
index a1978d29..affaf22f 100644
--- a/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherWindow.xaml.cs
+++ b/Ink Canvas/Helpers/Plugins/BuiltIn/SuperLauncher/LauncherWindow.xaml.cs
@@ -23,39 +23,39 @@ namespace Ink_Canvas.Helpers.Plugins.BuiltIn.SuperLauncher
/// 父插件
///
private readonly SuperLauncherPlugin _plugin;
-
+
///
/// 是否处于固定模式
///
private bool _isFixMode;
-
+
///
/// 应用项按钮列表
///
private readonly Dictionary