wpf 中怎么设置一个窗体总在最前显示,非模式对话框怎么只显示一个。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf 中怎么设置一个窗体总在最前显示,非模式对话框怎么只显示一个。相关的知识,希望对你有一定的参考价值。

参考技术A this.TopMost=true 就可以了。
把窗体对象定义为全局变量,给他赋空值,判断他是否为空,为空就初始化,不为空就直接 show().当窗体关闭的时候,在让这个对象等于空。如果只想显示一个,在初始化时,判断其他窗体是否为空就可以了。为空就初始化,不为空就跳过。

private MusicWindow WinObj;
private void btn_SetMusicePage_Click(object sender, RoutedEventArgs e)

if (WinObj == null)

WinObj = new MusicWindow();
WinObj.Closed += new EventHandler(WinObj_Closed);
WinObj.Show();


void WinObj_Closed(object sender, EventArgs e)

WinObj = null;
本回答被提问者采纳

如何让窗口半透明,总在最前,但不接收输入?

两个问题
1\ 窗口半透明
2\ 总在最前, 但是不接受鼠标接盘输入, 就是把所有消息都"漏"下去 像不存在一样....
谢谢!
有vb vc的实现方法皆可
试了一下 disable window 之后 点击鼠标会当当当的响 而且把消息都拦截了(下面的窗口没有接收到点击)
是不是可以用sendinput之类的函数把消息传下去呢 或者干脆不接受~~~ 谢谢了~~

刚想到一个, 就是qq音乐的桌面歌词, 锁定之后, 就只显示, 点击在上面就和窗口不存在一样, 点到了下面的窗口或是桌面 所以我想应该有一个比较简洁的方法实现这个功能

基本上不可能有常规的方法。1.半透明窗口只有在完全透明的时候才不接受输入(普通窗口永远接受输入);2.只有依赖窗口才能获得重画的消息;3.系统重画画半透明窗口的时候不会给程序任何通知。

可能的解决... 1. 拦截所有窗口变化消息,自己判断重画... 麻烦不说,杀毒软件这关不好过...;2. 半透明窗口接到鼠标事件以后,向下发送... 理论上应该比上一个还麻烦,而且窗口闪...;3.其他方法

---

SendInput以后接受消息的还是原来的窗口,只会造成死循环而已。这个不写驱动应该是没有什么效果可以接受的实现方法的。

---

这次我也学到了... 刚注意到WS_EX_TRANSPARENT对于layered windows有特殊含义。如果一个窗口同时有WS_EX_TRANSPARENT和WS_LAYERED它就不会接受鼠标事件(注意WS_EX_TRANSPARENT对于普通窗口完全是另外一个意思。) 也谢谢你了,如果你不问我可能再过几年也不会注意到这个TvT

例子

void main()

WNDCLASS wc = 0;

HINSTANCE inst = GetModuleHandleW(0);

wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
wc.hCursor = LoadCursor(inst, IDC_ARROW);
wc.hInstance = inst;
wc.lpfnWndProc = DefWindowProcW;
wc.lpszClassName = L"1234";
wc.style = CS_HREDRAW | CS_VREDRAW;

RegisterClassW(&wc);

HWND h = CreateWindowExW(WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST, L"1234", 0, WS_POPUP, 0, 0, 400, 400, 0, 0, 0, 0);

SetLayeredWindowAttributes(h, 0, 128, LWA_ALPHA);

ShowWindow(h, SW_NORMAL);

MSG msg;

for (; GetMessageW(&msg, 0, 0, 0);)

DispatchMessageW(&msg);

参考技术A

看看这个可不可以,是VC SDI下改造了现成的about帮助对话框。

BOOL CAboutDlg::OnInitDialog()

 CDialog::OnInitDialog();

 // TODO:  在此添加额外的初始化

 ModifyStyleEx(0, WS_EX_LAYERED);//自己加的

 SetLayeredWindowAttributes(0, 150, LWA_ALPHA);//自己加的

 SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//自己加的

 EnableWindow(FALSE);//自己加的

 return TRUE;  // return TRUE unless you set the focus to a control

 // 异常: OCX 属性页应返回 FALSE

 

=======================================

恩,BlueWanderer说的是,没有常规方法。

输入事件分两种:一种是硬件输入事件,一种是虚拟输入事件,我们一般处理的是虚拟输入事件,很少涉及硬件输入事件。而这两种事件都会影响我们的窗口行为。

你是不是想实现迅雷窗口的效果?这个是需要自己加工的,不是调用3、5个函数能解决的。我给的是个模型而已。

另外,你提到说下面的窗口可以响应鼠标单击事件,这个想法有点不靠谱了。

参考技术B 你说的第一个好办
BOOL CMainFrame::SetWndTransparence(int nTrans)

m_nTrans = nTrans;
int nt = m_nTrans*255/100;
if(nt <= 0) nt = 1;
if(nt >255) nt = 255;
DWORD Style = GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^ 0x80000;
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, Style);
SetLayeredWindowAttributes(0,nt, 2);
return false;


//上面的这个事一个SDI程序CMainFrame类里的一个设置窗口透明度的函数,参数nTrans即为透明度,值的范围是0——100

至于第二个,本应该上面窗口接受的消息,非要下面的窗口接收,那你只能试试自己发送了,你可以试试这个方法:透明窗口接收到消息之后,用ClientToScreen(hWnd, lpPoint);将鼠标点击的坐标从窗口坐标转换成屏幕坐标,然后用::EnumWindowsProc列举出所有显示的窗口,并判断是否鼠标的点击在该窗口之内,是,则向该窗口发送鼠标消息。你可以看看这个例子,里面有设置窗口透明度和列举窗口的方法:
http://hi.baidu.com/hanjiangying/blog/item/b6d27aa684566d9dd0435801.html
不过对于窗口重叠的情况,很容易出问题
说实话,你这第二个要求太难实现了
参考技术C 窗口半透明,要在XP及以上才方便点,那几个API函数记不得了,但是倒处都可以查到,实在查不到就HI我吧

要达到第二个要求,那就让窗口的属性为Disable和TopWnd吧

以上是关于wpf 中怎么设置一个窗体总在最前显示,非模式对话框怎么只显示一个。的主要内容,如果未能解决你的问题,请参考以下文章

WPF 精修篇 窗体唯一(Single) 显示在最前

如何设置窗口在最前面?

如何让窗口半透明,总在最前,但不接收输入?

如何将window.open弹出的窗口总在最前显示

WPF提示窗口总在主窗体前是怎么实现的

google浏览器总在最前面,怎么取消总是置顶