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