如何在桌面嵌入窗体
如何使程序嵌入到桌面中。
或程序总在所有窗口的后面,但在显示桌面时程序仍在桌面上显示
最好可以嵌入到桌面中的简单例子,好的想法也可以啊!
[解决办法]
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楼的太麻烦,而且不稳定,试试下面的代码
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); }