🎉 增加是否置于顶层开关
This commit is contained in:
141
Util/WindowUtil.cs
Normal file
141
Util/WindowUtil.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Interop;
|
||||
|
||||
namespace GeekDesk.Util
|
||||
{
|
||||
public class WindowUtil
|
||||
{
|
||||
|
||||
public enum GetWindowCmd : uint
|
||||
{
|
||||
GW_HWNDFIRST = 0,
|
||||
GW_HWNDLAST = 1,
|
||||
GW_HWNDNEXT = 2,
|
||||
GW_HWNDPREV = 3,
|
||||
GW_OWNER = 4,
|
||||
GW_CHILD = 5,
|
||||
GW_ENABLEDPOPUP = 6
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum SetWindowPosFlags
|
||||
{
|
||||
SWP_NOSIZE = 0x0001,
|
||||
SWP_NOMOVE = 0x0002,
|
||||
SWP_NOZORDER = 0x0004,
|
||||
SWP_NOREDRAW = 0x0008,
|
||||
SWP_NOACTIVATE = 0x0010,
|
||||
SWP_FRAMECHANGED = 0x0020,
|
||||
SWP_SHOWWINDOW = 0x0040,
|
||||
SWP_HIDEWINDOW = 0x0080,
|
||||
SWP_NOCOPYBITS = 0x0100,
|
||||
SWP_NOOWNERZORDER = 0x0200,
|
||||
SWP_NOSENDCHANGING = 0x0400
|
||||
}
|
||||
|
||||
//取得前台窗口句柄函数
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr GetForegroundWindow();
|
||||
//取得桌面窗口句柄函数
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr GetDesktopWindow();
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||
private static extern IntPtr FindWindow(string className, string windowName);
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
|
||||
private static extern IntPtr GetWindow(HandleRef hWnd, int nCmd);
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr SetParent(IntPtr child, IntPtr parent);
|
||||
[DllImport("user32.dll", EntryPoint = "GetDCEx", CharSet = CharSet.Auto, ExactSpelling = true)]
|
||||
private static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hrgnClip, int flags);
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
|
||||
private static extern bool SetWindowPos(HandleRef hWnd, HandleRef hWndInsertAfter, int x, int y, int cx, int cy, int flags);
|
||||
[DllImport("user32.dll")]
|
||||
private static extern int ReleaseDC(IntPtr window, IntPtr handle);
|
||||
|
||||
|
||||
|
||||
public static void SetOwner(Window source, IntPtr parentHandle)
|
||||
{
|
||||
WindowInteropHelper helper = new WindowInteropHelper(source);
|
||||
helper.Owner = parentHandle;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="window"></param>
|
||||
/// <returns></returns>
|
||||
public static bool WindowIsTop(Window window)
|
||||
{
|
||||
IntPtr handle = new WindowInteropHelper(window).Handle;
|
||||
IntPtr deskHandle = GetDesktopHandle(window, DesktopLayer.Progman);
|
||||
IntPtr deskHandle2 = GetDesktopHandle(window, DesktopLayer.FolderView);
|
||||
IntPtr deskHandle3 = GetDesktopHandle(window, DesktopLayer.SHELLDLL);
|
||||
IntPtr topHandle = GetForegroundWindow();
|
||||
return (topHandle.Equals(handle) || topHandle.Equals(deskHandle));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public const int GW_CHILD = 5;
|
||||
|
||||
public static IntPtr GetDesktopHandle(Window window, DesktopLayer layer)
|
||||
{
|
||||
HandleRef hWnd;
|
||||
IntPtr hDesktop = new IntPtr();
|
||||
switch (layer)
|
||||
{
|
||||
case DesktopLayer.Progman:
|
||||
hDesktop = FindWindow("Progman", null);//第一层桌面
|
||||
break;
|
||||
case DesktopLayer.SHELLDLL:
|
||||
hDesktop = FindWindow("Progman", null);//第一层桌面
|
||||
hWnd = new HandleRef(window, hDesktop);
|
||||
hDesktop = GetWindow(hWnd, GW_CHILD);//第2层桌面
|
||||
break;
|
||||
case DesktopLayer.FolderView:
|
||||
hDesktop = FindWindow("Progman", null);//第一层桌面
|
||||
hWnd = new HandleRef(window, hDesktop);
|
||||
hDesktop = GetWindow(hWnd, GW_CHILD);//第2层桌面
|
||||
hWnd = new HandleRef(window, hDesktop);
|
||||
hDesktop = GetWindow(hWnd, GW_CHILD);//第3层桌面
|
||||
break;
|
||||
}
|
||||
return hDesktop;
|
||||
}
|
||||
|
||||
public void EmbedDesktop(Object embeddedWindow, IntPtr childWindow, IntPtr parentWindow)
|
||||
{
|
||||
Form window = (Form)embeddedWindow;
|
||||
HandleRef HWND_BOTTOM = new HandleRef(embeddedWindow, new IntPtr(1));
|
||||
const int SWP_FRAMECHANGED = 0x0020;//发送窗口大小改变消息
|
||||
SetParent(childWindow, parentWindow);
|
||||
SetWindowPos(new HandleRef(window, childWindow), HWND_BOTTOM, 300, 300, window.Width, window.Height, SWP_FRAMECHANGED);
|
||||
}
|
||||
}
|
||||
|
||||
public enum DesktopLayer
|
||||
{
|
||||
Progman = 0,
|
||||
SHELLDLL = 1,
|
||||
FolderView = 2
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user