diff --git a/README-cn.md b/README-cn.md index 200f12ab..3ae6a0d6 100644 --- a/README-cn.md +++ b/README-cn.md @@ -75,6 +75,7 @@ LostAsk sanshiliuxiao QJJMSK +dspcjy ## Special thanks to diff --git a/README.md b/README.md index 1e950e5b..02abb37e 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ LostAsk sanshiliuxiao QJJMSK +dspcjy ## Special thanks to diff --git a/src/Shared/HandyControl_Shared/Controls/Input/PasswordBox.cs b/src/Shared/HandyControl_Shared/Controls/Input/PasswordBox.cs index 2d8ec15b..507053da 100644 --- a/src/Shared/HandyControl_Shared/Controls/Input/PasswordBox.cs +++ b/src/Shared/HandyControl_Shared/Controls/Input/PasswordBox.cs @@ -359,6 +359,15 @@ namespace HandyControl.Controls } } - private void TextBox_TextChanged(object sender, TextChangedEventArgs e) => VerifyData(); + private void TextBox_TextChanged(object sender, TextChangedEventArgs e) + { + VerifyData(); + + if (!IsSafeEnabled && ShowPassword) + { + Password = _textBox.Text; + SetCurrentValue(UnsafePasswordProperty, Password); + } + } } } \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Interactivity/Commands/PushMainWindow2TopCommand.cs b/src/Shared/HandyControl_Shared/Interactivity/Commands/PushMainWindow2TopCommand.cs index 07a2427c..386d6a78 100644 --- a/src/Shared/HandyControl_Shared/Interactivity/Commands/PushMainWindow2TopCommand.cs +++ b/src/Shared/HandyControl_Shared/Interactivity/Commands/PushMainWindow2TopCommand.cs @@ -1,8 +1,7 @@ using System; using System.Windows; using System.Windows.Input; -using System.Windows.Interop; -using HandyControl.Tools.Interop; +using HandyControl.Tools; namespace HandyControl.Interactivity { @@ -15,11 +14,7 @@ namespace HandyControl.Interactivity if (Application.Current.MainWindow != null && Application.Current.MainWindow.Visibility != Visibility.Visible) { Application.Current.MainWindow.Show(); - var hwndSource = (HwndSource)PresentationSource.FromDependencyObject(Application.Current.MainWindow); - if (hwndSource != null) - { - InteropMethods.SetForegroundWindow(hwndSource.Handle); - } + WindowHelper.SetWindowToForeground(Application.Current.MainWindow); } } diff --git a/src/Shared/HandyControl_Shared/Tools/Helper/WindowHelper.cs b/src/Shared/HandyControl_Shared/Tools/Helper/WindowHelper.cs index b951640a..fcbb36b6 100644 --- a/src/Shared/HandyControl_Shared/Tools/Helper/WindowHelper.cs +++ b/src/Shared/HandyControl_Shared/Tools/Helper/WindowHelper.cs @@ -152,5 +152,42 @@ namespace HandyControl.Tools public static IntPtr GetHandle(this Window window) => new WindowInteropHelper(window).EnsureHandle(); public static HwndSource GetHwndSource(this Window window) => HwndSource.FromHwnd(window.GetHandle()); + + /// + /// 让窗口激活作为前台最上层窗口 + /// + /// + public static void SetWindowToForeground(Window window) + { + // [WPF 让窗口激活作为前台最上层窗口的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/12749671.html) + var interopHelper = new WindowInteropHelper(window); + var thisWindowThreadId = InteropMethods.GetWindowThreadProcessId(interopHelper.Handle, out _); + var currentForegroundWindow = InteropMethods.GetForegroundWindow(); + var currentForegroundWindowThreadId = InteropMethods.GetWindowThreadProcessId(currentForegroundWindow, out _); + + // [c# - Bring a window to the front in WPF - Stack Overflow](https://stackoverflow.com/questions/257587/bring-a-window-to-the-front-in-wpf ) + // [SetForegroundWindow的正确用法 - 子坞 - 博客园](https://www.cnblogs.com/ziwuge/archive/2012/01/06/2315342.html ) + /* +   1.得到窗口句柄FindWindow +     2.切换键盘输入焦点AttachThreadInput +     3.显示窗口ShowWindow(有些窗口被最小化/隐藏了) +     4.更改窗口的Z Order,SetWindowPos使之最上,为了不影响后续窗口的Z Order,改完之后,再还原 +     5.最后SetForegroundWindow + */ + + InteropMethods.AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, true); + + window.Show(); + window.Activate(); + // 去掉和其他线程的输入链接 + InteropMethods.AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false); + + // 用于踢掉其他的在上层的窗口 + if (window.Topmost != true) + { + window.Topmost = true; + window.Topmost = false; + } + } } } diff --git a/src/Shared/HandyControl_Shared/Tools/Interop/InteropMethods.cs b/src/Shared/HandyControl_Shared/Tools/Interop/InteropMethods.cs index 72a22351..ea9cbd44 100644 --- a/src/Shared/HandyControl_Shared/Tools/Interop/InteropMethods.cs +++ b/src/Shared/HandyControl_Shared/Tools/Interop/InteropMethods.cs @@ -43,6 +43,13 @@ namespace HandyControl.Tools.Interop [DllImport(InteropValues.ExternDll.User32, SetLastError = true, CharSet = CharSet.Auto)] internal static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + [DllImport(InteropValues.ExternDll.User32, SetLastError = true, CharSet = CharSet.Auto)] + internal static extern bool AttachThreadInput(in uint currentForegroundWindowThreadId, + in uint thisWindowThreadId, bool isAttach); + + [DllImport(InteropValues.ExternDll.User32, SetLastError = true, CharSet = CharSet.Auto)] + internal static extern IntPtr GetForegroundWindow(); + [DllImport(InteropValues.ExternDll.Kernel32, SetLastError = true, CharSet = CharSet.Auto)] internal static extern IntPtr OpenProcess(InteropValues.ProcessAccess dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwProcessId);