版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.****.net/BYH371256/article/details/83347163
WPF 窗口句柄设置和获取
1、句柄类
WHwnd.cs
public class WHwnd
{
/// <summary>
/// 主窗体句柄
/// </summary>
public static System.Windows.Interop.HwndSource Hwnd;
/// <summary>
/// 获取窗体句柄
/// </summary>
/// <param name="window">窗体</param>
public static IntPtr GetWindowHwndSource(DependencyObject window, bool isHwnd = true)
{
var formDependency = System.Windows.Interop.HwndSource.FromDependencyObject(window);
System.Windows.Interop.HwndSource winformWindow = (formDependency as System.Windows.Interop.HwndSource);
if (isHwnd)
Hwnd = winformWindow;
return winformWindow.Handle;
}
}
2、窗口大小
WndSize.cs
public class WndSize
{
/// <summary>
/// 获取主窗体大小和状态
/// </summary>
/// <returns></returns>
public static WindowSize GetWindowSize(IntPtr hwnd)
{
//是否最小化
bool min = IsIconic(hwnd);
//是否最大化
bool max = IsZoomed(hwnd);
RECT size = new RECT();
GetWindowRect(hwnd, ref size);
WindowSize wind = new WindowSize();
wind.Left = size.Left;
wind.Top = size.Top;
wind.Width = size.Right - size.Left;
wind.Height = size.Bottom - size.Top;
//if (max == true)
// wind.Windowstatue = WindowState.Maximized;
//else if (min == true)
// wind.Windowstatue = WindowState.Minimized;
//else
// wind.Windowstatue = WindowState.Normal;
return wind;
}
public static void CloseSoftware(IntPtr hwnd)
{
SendMessage(hwnd, SC_CLOSE, 0, 0);
}
public static int SC_CLOSE = 0X10;
[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsIconic(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern bool IsZoomed(IntPtr hWnd);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;//最左坐标
public int Top;//最上坐标
public int Right;//最右坐标
public int Bottom;//最下坐标
}
}
public struct WindowSize
{
public int Left;
public int Top;
public int Width;
public int Height;
//public WindowState Windowstatue;
}
3、设置句柄和获取
在主函数Loaded事件中设置初始句柄:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WHwnd.GetWindowHwndSource(this);
}
//自定义对话框弹出测试
ExMessageBox.ShowDialog(0, false, 3, tipStr, "", "", WHwnd.Hwnd.Handle);