如何实现像系统软键盘那样的顶层窗体?让窗体能始终盖住已经设置为topmost的窗体,包括失去焦点时?

APM60- 2012-06-28 09:01:50
我的主程序用的是一个全屏的topmost窗体。
现在需要做一个类似软键盘的东西。

软键盘窗体,我首先设置为浮动工具条窗体,不抢占焦点。

#region 浮动工具条窗体

private const int WS_EX_TOOLWINDOW = 0x00000080;
private const int WS_EX_NOACTIVATE = 0x08000000;
// 浮动工具条窗体
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
cp.Parent = IntPtr.Zero; // Keep this line only if you used UserControl
return cp;
//return base.CreateParams;
}
}

#endregion

然后设置了topmost,由主程序打开。
但是软键盘窗体在失去焦点时又会被主窗体盖住。
同时topmost,应该是谁获得焦点谁在最前边。

如何才能像系统软键盘那样始终显示在最顶层呢?
不管有没有得到焦点,始终能盖住已设置了topmost的窗体。
...全文
253 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之影子 2012-06-30
  • 打赏
  • 举报
回复
如何才能像系统软键盘那样始终显示在最顶层呢?
不管有没有得到焦点,始终能盖住已设置了topmost的窗体。


主窗体拉个panel实现软键盘平时隐藏,用的时候让其显示。
APM60- 2012-06-29
  • 打赏
  • 举报
回复
又试了下系统的软键盘(tablet pc输入面板)。
在先打开系统软键盘的情况下,再打开一个topmost窗体,有时候就会盖住系统软键盘。
但是在拖动这个窗体的时候,就会被系统软键盘盖住。
有时候这个topmost窗体获得焦点瞬间会在系统软键盘之前,闪一下,然后被盖住。
貌似tablet pc输入面板一直在监测其他窗体的显示相关的事件,并让自己总在最前。

找到一个方法可以把窗体置前。
[DllImport("User32.dll")]
public static extern bool SetForegroundWindow(IntPtr hwnd);
我把它放到失去焦点的事件里,但是又没有效果。
猜测可能是顺序上的原因。
比如说,该窗体先失去焦点,手动置前;另一个窗体再获得焦点,被置前。

最后用了一个没有办法的办法。就是计时器。
实时检查最前端窗体是否是当前窗体,
this.Handle != GetForegroundWindow()
不是的话,然后
SetForegroundWindow(this.Handle);
窗体就可以一直在最前端了。

虽然用计时器这个方法不是很好,至少目前达到我想要的效果了。
APM60- 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
c#中设置form属性topmost
[/Quote]

不行啊。主窗体也是topmost的。
主窗体获得焦点时会盖住软键盘窗体。

我把软键盘窗体的style和ExStyle设置成和tablet pc输入面板窗体一样的了。
还用spy++确认了下,为毛还是失去焦点又被主窗体挡住了。
bdmh 2012-06-28
  • 打赏
  • 举报
回复

c#中设置form属性topmost
APM60- 2012-06-28
  • 打赏
  • 举报
回复
已解决。散分~

原来VS里面还有spy++这么好用的工具。
拖动准星到目标窗体就可以该窗体的属性了。
原来是用了popup。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧