improve:快抽窗口

This commit is contained in:
CJK_mkp
2025-11-08 20:07:00 +08:00
parent 11bf8cffb2
commit 7f0d29ebd2
+40 -8
View File
@@ -25,6 +25,14 @@ namespace Ink_Canvas
// 设置无焦点状态
this.Focusable = false;
this.ShowInTaskbar = false;
// 窗口句柄创建后应用无焦点模式
this.SourceInitialized += QuickDrawFloatingButton_SourceInitialized;
}
private void QuickDrawFloatingButton_SourceInitialized(object sender, EventArgs e)
{
ApplyNoFocusMode();
}
@@ -33,12 +41,13 @@ namespace Ink_Canvas
// 设置位置到屏幕右下角稍微靠近中部
SetPositionToBottomRight();
// 应用无焦点模式
ApplyNoFocusMode();
// 应用置顶
ApplyFloatingButtonTopmost();
// 如果主窗口在无焦点模式下,启动置顶维护
if (MainWindow.Settings?.Advanced?.IsNoFocusMode == true &&
MainWindow.Settings?.Advanced?.EnableUIAccessTopMost != true)
if (MainWindow.Settings?.Advanced?.EnableUIAccessTopMost != true)
{
StartTopmostMaintenance();
}
@@ -174,6 +183,7 @@ namespace Ink_Canvas
private static extern uint GetCurrentProcessId();
private const int GWL_EXSTYLE = -20;
private const int WS_EX_NOACTIVATE = 0x08000000;
private const int WS_EX_TOPMOST = 0x00000008;
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
@@ -187,6 +197,26 @@ namespace Ink_Canvas
private DispatcherTimer topmostMaintenanceTimer;
private bool isTopmostMaintenanceEnabled;
/// <summary>
/// 应用无焦点模式
/// </summary>
private void ApplyNoFocusMode()
{
try
{
var hwnd = new WindowInteropHelper(this).Handle;
if (hwnd == IntPtr.Zero) return;
int exStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
// 悬浮快抽窗口始终启用无焦点模式
SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_NOACTIVATE);
}
catch (Exception)
{
}
}
/// <summary>
/// 应用悬浮按钮置顶
/// </summary>
@@ -263,11 +293,7 @@ namespace Ink_Canvas
return;
}
if (MainWindow.Settings?.Advanced?.IsNoFocusMode != true)
{
StopTopmostMaintenance();
return;
}
// 悬浮快抽窗口始终启用无焦点模式,不需要检查主窗口设置
var hwnd = new WindowInteropHelper(this).Handle;
if (hwnd == IntPtr.Zero) return;
@@ -302,6 +328,12 @@ namespace Ink_Canvas
{
SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_TOPMOST);
}
// 确保无焦点模式样式正确
if ((exStyle & WS_EX_NOACTIVATE) == 0)
{
SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_NOACTIVATE);
}
}
}
catch (Exception ex)