mirror of
https://gitee.com/handyorg/HandyControl.git
synced 2024-12-02 03:47:48 +08:00
加上设置窗口到最前的辅助方法
This commit is contained in:
parent
35eb871040
commit
7151fec7b8
@ -152,5 +152,44 @@ 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());
|
||||
|
||||
/// <summary>
|
||||
/// 让窗口激活作为前台最上层窗口
|
||||
/// </summary>
|
||||
/// <param name="window"></param>
|
||||
public static void SetWindowToForegroundWithAttachThreadInput(Window window)
|
||||
{
|
||||
// [WPF 让窗口激活作为前台最上层窗口的方法 - lindexi - 博客园](https://www.cnblogs.com/lindexi/p/12749671.html)
|
||||
var interopHelper = new WindowInteropHelper(window);
|
||||
// 以下 Win32 方法可以在 https://github.com/kkwpsv/lsjutil/tree/master/Src/Lsj.Util.Win32 找到
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user