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.其他方法
---
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 中怎么设置一个窗体总在最前显示,非模式对话框怎么只显示一个。的主要内容,如果未能解决你的问题,请参考以下文章