zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Effective C++ -----条款29:为“异常安全”而努力是值得的
    Effective C++ -----条款28:避免返回handles指向对象内部成分
    Effective C++ -----条款27:尽量少做转型动作
    Effective C++ -----条款26:尽可能延后变量定义式的出现时间
    Effective C++ -----条款25:考虑写出一个不抛异常的swap函数
    Effective C++ -----条款24:若所有参数皆需类型转换,请为此采用non-member函数
    HGE 第一个程序
    Help him http://acm.hdu.edu.cn/showproblem.php?pid=5059
    C 语言实例
    C 语言实例
  • 原文地址:https://www.cnblogs.com/wgscd/p/10514214.html
Copyright © 2011-2022 走看看