parent winform 位置_c# winform窗口置顶显示(桌面最上方或最底层)的方法

一、置顶在桌面最上方

复制代码 代码示例:

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值