日期:2014-05-18  浏览次数:20878 次

如何在桌面嵌入窗体
如何使程序嵌入到桌面中。 
或程序总在所有窗口的后面,但在显示桌面时程序仍在桌面上显示  


最好可以嵌入到桌面中的简单例子,好的想法也可以啊!

------解决方案--------------------
C# code

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

namespace ShowInDesk
{
    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);
            isMouseDown = false;
        }
        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);


        }

    }
}

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ShowInDesk
{
    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);
    }
}



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

------解决方案--------------------
6楼的太麻烦,而且不稳定,试试下面的代码
C# code
         private const int WM_WINDOWPOSCHANGING = 0x46;
        private const int SWP_NOSI