首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么在桌面嵌入窗体

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

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


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

[解决办法]

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_NOSIZE = 0x1;        private const int SWP_NOMOV2 = 0x2;        private const int HWND_BOTTOM = 1;           private struct WindowPos        {            public int hwnd;            public int hwndInsertAfter;            public int x;            public int y;            public int cx;            public int cy;            public uint flags;        };        protected override void WndProc(ref System.Windows.Forms.Message e)        {            if (e.Msg == WM_WINDOWPOSCHANGING)            {                WindowPos windowPos = (WindowPos)Marshal.PtrToStructure(e.LParam, typeof(WindowPos));                windowPos.hwndInsertAfter = 1;                Marshal.StructureToPtr(windowPos, e.LParam, true);                                e.Result = (IntPtr)0;            }                base.WndProc(ref e);          } 

热点排行