diff --git a/InkCanvasForClass/MainWindow.xaml b/InkCanvasForClass/MainWindow.xaml
index 71615ee..03005ed 100644
--- a/InkCanvasForClass/MainWindow.xaml
+++ b/InkCanvasForClass/MainWindow.xaml
@@ -7811,8 +7811,8 @@
-
@@ -8068,7 +8068,7 @@
+ FontWeight="Bold" Toggled="ToggleSwitchScreenshotUsingMagnificationAPI_OnToggled"/>
@@ -8116,8 +8116,8 @@
-
diff --git a/InkCanvasForClass/MainWindow_cs/MW_Screenshot.cs b/InkCanvasForClass/MainWindow_cs/MW_Screenshot.cs
index d828103..ba2f960 100644
--- a/InkCanvasForClass/MainWindow_cs/MW_Screenshot.cs
+++ b/InkCanvasForClass/MainWindow_cs/MW_Screenshot.cs
@@ -8,13 +8,17 @@ using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
+using System.Threading.Tasks;
using System.Windows;
+using System.Windows.Forms;
using System.Windows.Interop;
using System.Windows.Media;
+using System.Windows.Shell;
using Acornima.Ast;
using OSVersionExtension;
using Vanara.PInvoke;
using static Vanara.PInvoke.Gdi32;
+using Color = System.Drawing.Color;
using OperatingSystem = OSVersionExtension.OperatingSystem;
using PixelFormat = System.Drawing.Imaging.PixelFormat;
@@ -68,19 +72,25 @@ namespace Ink_Canvas {
if (!Magnification.MagInitialize()) return;
// 創建宿主窗體
- var mainWinMag = new Window();
- mainWinMag.WindowState = WindowState.Maximized;
- mainWinMag.WindowStyle = WindowStyle.None;
- mainWinMag.ResizeMode = ResizeMode.NoResize;
- mainWinMag.Background = new SolidColorBrush(Colors.Transparent);
- mainWinMag.AllowsTransparency = true;
+ var mainWinMag = new Form();
mainWinMag.Show();
- var handle = new HWND(new WindowInteropHelper(mainWinMag).Handle);
+ var handle = new HWND(mainWinMag.Handle);
User32.SetWindowPos(handle, HWND.HWND_NOTOPMOST, 0, 0, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height, User32.SetWindowPosFlags.SWP_HIDEWINDOW); // SWP_HIDEWINDOW
- SetWindowLongPtr(handle.DangerousGetHandle(), -20, new IntPtr((int)GetWindowLongPtr(handle.DangerousGetHandle(), -20) | 0x00080000));
+ Trace.WriteLine(handle);
+ User32.SetWindowLong(handle, User32.WindowLongFlags.GWL_STYLE,
+ new IntPtr((int)User32.WindowStyles.WS_SIZEBOX | (int)User32.WindowStyles.WS_SYSMENU | (int)User32.WindowStyles.WS_CLIPCHILDREN | (int)User32.WindowStyles.WS_CAPTION | (int)User32.WindowStyles.WS_MAXIMIZEBOX));
+ Trace.WriteLine(handle);
+ var exptr = User32.GetWindowLong(handle, User32.WindowLongFlags.GWL_EXSTYLE);
+ Trace.WriteLine(exptr);
+ User32.SetWindowLong(handle, User32.WindowLongFlags.GWL_EXSTYLE,
+ new IntPtr(exptr |
+ (int)User32.WindowStylesEx.WS_EX_LAYERED | (int)User32.WindowStylesEx.WS_EX_TOPMOST));
+ Trace.WriteLine(handle);
User32.SetLayeredWindowAttributes(handle,0, 255, User32.LayeredWindowAttributes.LWA_ALPHA);
+ Trace.WriteLine(handle);
+
// 創建放大鏡窗體(使用Win32方法)
var hwndMag = User32.CreateWindow(Magnification.WC_MAGNIFIER, "ICCMagnifierWindow",
User32.WindowStyles.WS_CHILD | User32.WindowStyles.WS_VISIBLE, 0, 0,
@@ -115,8 +125,8 @@ namespace Ink_Canvas {
bmp.Save(savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png", ImageFormat.Png);
// 關閉宿主窗體
- Magnification.MagUninitialize();
- mainWinMag.Close();
+ //Magnification.MagUninitialize();
+ //mainWinMag.Close();
}
public unsafe void SaveScreenshotToDesktopByMagnificationAPI(bool isExcludeMode, HWND[] hwndsList,
@@ -248,7 +258,7 @@ namespace Ink_Canvas {
return icn;
}
- public struct WindowInformation {
+ public class WindowInformation {
public string Title { get; set; }
public Bitmap WindowBitmap { get; set; }
public Icon AppIcon { get; set; }
@@ -330,12 +340,20 @@ namespace Ink_Canvas {
Placement = placement,
});
memoryGraphics.ReleaseHdc(hdc);
+ System.GC.Collect();
+ System.GC.WaitForPendingFinalizers();
return true;
}),
IntPtr.Zero)) return new WindowInformation[] { };
return windows.ToArray();
}
+ public async Task GetAllWindowsAsync(HWND[] excludedHwnds)
+ {
+ var windows = await Task.Run(() => GetAllWindows(excludedHwnds));
+ return windows;
+ }
+
#endregion
private void SaveScreenShotToDesktop() {
diff --git a/InkCanvasForClass/MainWindow_cs/MW_Settings.cs b/InkCanvasForClass/MainWindow_cs/MW_Settings.cs
index db24fc8..dc3be13 100644
--- a/InkCanvasForClass/MainWindow_cs/MW_Settings.cs
+++ b/InkCanvasForClass/MainWindow_cs/MW_Settings.cs
@@ -2047,7 +2047,9 @@ namespace Ink_Canvas {
#region Screenshot
private void ToggleSwitchScreenshotUsingMagnificationAPI_OnToggled(object sender, RoutedEventArgs e) {
-
+ if (!isLoaded) return;
+ Settings.Snapshot.ScreenshotUsingMagnificationAPI = ToggleSwitchScreenshotUsingMagnificationAPI.IsOn;
+ SaveSettingsToFile();
}
#endregion
diff --git a/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs b/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs
index 638c787..5ec6f42 100644
--- a/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs
+++ b/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs
@@ -4,6 +4,7 @@ using System.Diagnostics;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
@@ -189,7 +190,7 @@ namespace Ink_Canvas.Popups
private WindowScreenshotGridWindow _screenshotGridWindow = null;
- private void IconMouseUp(object sender, MouseButtonEventArgs e) {
+ private async void IconMouseUp(object sender, MouseButtonEventArgs e) {
if (lastDownIcon == null) return;
IconMouseLeave(sender, null);
var index = Array.IndexOf(iconList, (Border)sender);
@@ -197,13 +198,20 @@ namespace Ink_Canvas.Popups
UpdateModeIconSelection();
if (selectedMode == 1) {
- _screenshotGridWindow = new WindowScreenshotGridWindow(mainWindow.GetAllWindows(new HWND[] {
- new HWND(new WindowInteropHelper(this).Handle), new HWND(new WindowInteropHelper(mainWindow).Handle)
- }), mainWindow);
- _screenshotGridWindow.Show();
- } else if (_screenshotGridWindow != null) {
- _screenshotGridWindow.Close();
- _screenshotGridWindow = null;
+ try {
+ MainWindow.WindowInformation[] windows = await mainWindow.GetAllWindowsAsync(new HWND[] {
+ new HWND(new WindowInteropHelper(this).Handle), new HWND(new WindowInteropHelper(mainWindow).Handle)
+ });
+ _screenshotGridWindow = new WindowScreenshotGridWindow(windows, mainWindow);
+ _screenshotGridWindow.Show();
+ }
+ catch (TaskCanceledException) {}
+ catch (Exception ex) {}
+ } else {
+ try {
+ _screenshotGridWindow.Close();
+ } catch (Exception ex) { }
+
}
}
diff --git a/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml b/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml
index bad49b5..f2f4350 100644
--- a/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml
+++ b/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml
@@ -17,9 +17,12 @@
-
-
-
+
+
+
+
+
+
diff --git a/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml.cs b/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml.cs
index 4dfd56d..df77fe7 100644
--- a/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml.cs
+++ b/InkCanvasForClass/Popups/WindowScreenshotGridWindow.xaml.cs
@@ -13,6 +13,7 @@ using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
+using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
@@ -43,9 +44,20 @@ namespace Ink_Canvas.Popups
}
}
+ private static ImageSource IconToImageSource(Icon icon)
+ {
+ ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon(
+ icon.Handle,
+ Int32Rect.Empty,
+ BitmapSizeOptions.FromEmptyOptions());
+
+ return imageSource;
+ }
+
private class Win {
public string Title { get; set; }
public BitmapImage Bitmap { get; set; }
+ public ImageSource Icon { get; set; }
public HWND Handle { get; set; }
public Bitmap OriginBitmap { get; set; }
}
@@ -56,7 +68,6 @@ namespace Ink_Canvas.Popups
public WindowScreenshotGridWindow(MainWindow.WindowInformation[] wins, MainWindow mainWindow) {
InitializeComponent();
- _windows.Clear();
WindowsItemControl.ItemsSource = _windows;
foreach (var windowInformation in wins) {
_windows.Add(new Win() {
@@ -64,6 +75,7 @@ namespace Ink_Canvas.Popups
Bitmap = BitmapToImageSource(windowInformation.WindowBitmap),
Handle = windowInformation.hwnd,
OriginBitmap = windowInformation.WindowBitmap,
+ Icon = IconToImageSource(windowInformation.AppIcon)
});
Trace.WriteLine(windowInformation.Title);
}
@@ -71,6 +83,11 @@ namespace Ink_Canvas.Popups
this.mainWindow = mainWindow;
}
+ protected override void OnClosed(EventArgs e) {
+ base.OnClosed(e);
+ _windows.Clear();
+ }
+
private void WindowItem_MouseUp(object sender, MouseButtonEventArgs e) {
var item = ((SimpleStackPanel)sender).Tag as Win;
string savePath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
diff --git a/InkCanvasForClass/Resources/Settings.cs b/InkCanvasForClass/Resources/Settings.cs
index b5b2e5f..936fde6 100644
--- a/InkCanvasForClass/Resources/Settings.cs
+++ b/InkCanvasForClass/Resources/Settings.cs
@@ -23,6 +23,13 @@ namespace Ink_Canvas
public Startup Startup { get; set; } = new Startup();
[JsonProperty("randSettings")]
public RandSettings RandSettings { get; set; } = new RandSettings();
+ [JsonProperty("snapshot")]
+ public Snapshot Snapshot { get; set; } = new Snapshot();
+ }
+
+ public class Snapshot {
+ [JsonProperty("usingMagnificationAPI")]
+ public bool ScreenshotUsingMagnificationAPI { get; set; } = false;
}
public class Canvas