WPF 窗口句柄获取和设置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.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);

猜你喜欢

转载自blog.csdn.net/BYH371256/article/details/83347163
今日推荐