手机
当前位置:查字典教程网 >编程开发 >C#教程 >c# winform窗口一直置顶显示在桌面最上方或最底层的方法
c# winform窗口一直置顶显示在桌面最上方或最底层的方法
摘要:一、在最前面:usingSystem.Runtime.InteropServices;在定义部分引入下面两个函数:[DllImport("u...

一、

在最前面:

using System.Runtime.InteropServices;

在定义部分引入下面两个函数:

[DllImport( "user32 ")]

private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);

[DllImport( "user32 ")]

private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

在窗体On_Load事件中添加(Santos的代码):

IntPtr hDeskTop=FindWindow( "Progman ", "Program Manager ");

SetParent(this.Handle,hDeskTop);

另一个方法可以修改桌面壁纸实现

经测试,win2000--win2003 、xp下嵌入桌面,不支持vista和win7以上系统

二、

复制代码 代码如下:

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

{

publicpartialclass Form1 : Form

{

IntPtr hDesktop;

publicconstint 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;

}

publicvoid EmbedDesktop(Object embeddedWindow, IntPtr childWindow, IntPtr parentWindow)

{

Form window = (Form)embeddedWindow;

HandleRef HWND_BOTTOM =new HandleRef(embeddedWindow, new IntPtr(1));

constint 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)]

publicstaticextern IntPtr FindWindow(string className, string windowName);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling =true)]

publicstaticextern IntPtr GetWindow(HandleRef hWnd, int nCmd);

[DllImport("user32.dll")]

publicstaticextern IntPtr SetParent(IntPtr child, IntPtr parent);

[DllImport("user32.dll", EntryPoint ="GetDCEx", CharSet = CharSet.Auto, ExactSpelling =true)]

publicstaticextern IntPtr GetDCEx(IntPtr hWnd, IntPtr hrgnClip, int flags);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling =true)]

publicstaticexternbool SetWindowPos(HandleRef hWnd, HandleRef hWndInsertAfter, int x, int y, int cx, int cy, int flags);

[DllImport("user32.dll")]

publicstaticexternint ReleaseDC(IntPtr window, IntPtr handle);

}

}

复制代码 代码如下:

namespace ShowInDesk

{

publicenum DesktopLayer

{

Progman =0,

SHELLDLL =1,

FolderView =2

}

}

三、

入桌面窗口最底层,并提供详细的实现代码供参考。

此类将窗体永远置于窗口最底层。

首先, 调用一些User32.dll的WinAPI函数。

复制代码 代码如下:

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 externbool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx,

int cy, uint uFlags);

}

然后, 在WinForm里面:

复制代码 代码如下:

public MainForm()

{

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 exx)

{

MessageBox.Show(this, exx.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);

}

}

以上介绍的就是C#如何让WinForm嵌入桌面窗口最底层,希望对你有所帮助。

【c# winform窗口一直置顶显示在桌面最上方或最底层的方法】相关文章:

C# SkinEngine控件 给窗体添加皮肤的方法

C# Winform 让整个窗口都可以拖动

C#设置子窗体在主窗体中居中显示解决方案

C#删除文件目录或文件的解决方法

深入C# winform清除由GDI绘制出来的所有线条或图形的解决方法

C#中使用IrisSkin2.dll美化WinForm程序界面的方法

c#中判断字符串是不是数字或字母的方法

Winform跨线程操作的简单方法

使用checked语句防止数据溢出的解决方法

C# 禁用鼠标中间键的方法

精品推荐
分类导航