c# 设置桌面背景窗口 SetParent

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace SetDeskFrm
{
    public partial class Form1 : Form
    {
        
  
        IntPtr hDesktop;
        public const int GW_CHILD = 5;
        public Form1() {
            InitializeComponent();
            this.hDesktop = GetDesktopHandle(DesktopLayer.Progman);
            EmbedDesktop(this, this.Handle, this.hDesktop);
      
        }
        public IntPtr GetDesktopHandle(DesktopLayer layer)
        {
            //hWnd = new HandleRef();    
            HandleRef hWnd;
            IntPtr hDesktop =new IntPtr();
            switch (layer)
            {
                case DesktopLayer.Progman:
                    hDesktop = Win32Support.FindWindow("Progman" , null);//第一层桌面  
                    break;
                case DesktopLayer.SHELLDLL:
                    hDesktop = Win32Support.FindWindow( "Progman" , null);//第一层桌面    
                    hWnd =new HandleRef(this, hDesktop);
                    hDesktop = Win32Support.GetWindow(hWnd, GW_CHILD);//第2层桌面     
                    break;
                case DesktopLayer.FolderView:
                    hDesktop = Win32Support.FindWindow( "Progman" , null);//第一层桌面    
                    hWnd =new HandleRef(this, hDesktop);
                    hDesktop = Win32Support.GetWindow(hWnd, GW_CHILD);//第2层桌面      
                    hWnd =new HandleRef(this, hDesktop);
                    hDesktop = Win32Support.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;//发送窗口大小改变消息
            Win32Support.SetParent(childWindow, parentWindow);
            Win32Support.SetWindowPos(new HandleRef(window, childWindow), HWND_BOTTOM, 300, 300, window.Width, window.Height, SWP_FRAMECHANGED);
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
    }
   class Win32Support     {

    [DllImport("user32.dll" , CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string className, string windowName);
        [DllImport("user32.dll" , CharSet = CharSet.Auto, ExactSpelling =true)]
        public static extern IntPtr GetWindow(HandleRef hWnd, int nCmd);
        [DllImport( "user32.dll" )]
        public static extern IntPtr SetParent(IntPtr child, IntPtr parent);
        [DllImport( "user32.dll" , EntryPoint= "GetDCEx", CharSet = CharSet.Auto, ExactSpelling =true)]
        public static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hrgnClip, int flags);
        [DllImport( "user32.dll" , CharSet = CharSet.Auto, ExactSpelling =true)]
        public static extern bool SetWindowPos(HandleRef hWnd, HandleRef hWndInsertAfter, int x, int y, int cx, int cy, int flags);
        [DllImport("user32.dll" )]
        public static extern int ReleaseDC(IntPtr window, IntPtr handle);
    }

    public enum DesktopLayer
    {
        Progman =0,
        SHELLDLL =1,
        FolderView =2
    } 


}

  

方法2(在某些系统版本不成功,WIN7 、XP):

 [DllImport("user32.dll", SetLastError = true)]
        static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpWindowClass, string lpWindowName);
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
        const int GWL_HWNDPARENT = -8;
        [DllImport("user32.dll")]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        private void Button_Click(object sender, RoutedEventArgs e)
        {
           

           var handle = new WindowInteropHelper(Application.Current.MainWindow).Handle;
         IntPtr hprog = FindWindowEx(
                FindWindowEx(
                    FindWindow("Progman", "Program Manager"),
                    IntPtr.Zero, "SHELLDLL_DefView", ""
                ),
                IntPtr.Zero, "SysListView32", "FolderView"
            );

          SetWindowLong(handle, GWL_HWNDPARENT, hprog);
          
            IntPtr hWnd = new WindowInteropHelper(Application.Current.MainWindow).Handle;
            IntPtr hWndProgMan = FindWindow("Progman", "Program Manager");

            SetParent(hWnd, hWndProgMan);


        }

  

方式3(大同小异):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SetDeskFrm
{
    internal class User32
    {
        public const int SE_SHUTDOWN_PRIVILEGE = 0x13;
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll")]
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
        [DllImport("user32.dll")]
        public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X,
int
Y,
int
cx,
int
cy,
uint
uFlags);
    }

    public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
            try
            {
                if (Environment.OSVersion.Version.Major == 6)
                {
                    base.SendToBack();
                    IntPtr hWndNewParent = User32.FindWindow("Progman", null);
                    User32.SetParent(base.Handle, hWndNewParent);
                }
                else
                {
                    User32.SetWindowPos(
                      base.Handle, 1, 0, 0, 0, 0, User32.SE_SHUTDOWN_PRIVILEGE);
                }
            }

            catch (ApplicationException ex)
            {
                MessageBox.Show(this, ex.Message, "Pin to Desktop");
            }
        }

        private void MainForm_Activated(object sender, EventArgs e)
        {
            if (Environment.OSVersion.Version.Major == 6)
            {
             User32.SetWindowPos(   base.Handle, 1  , 0 , 0  ,  0 ,  0 , User32.SE_SHUTDOWN_PRIVILEGE);
               
            }
        }

        private void MainForm_Paint(object sender, PaintEventArgs e)
        {
            if
             (Environment.OSVersion.Version.Major == 6 )
            {
                User32.SetWindowPos( base.Handle, 1 , 0 , 0 , 0, 0, User32.SE_SHUTDOWN_PRIVILEGE);
            }
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
    }
}

  

参考:https://stackoverflow.com/questions/365094/window-on-desktop

原文地址:https://www.cnblogs.com/wgscd/p/10514214.html