我当前的一个客户运行一系列互联网点,客户通过PC访问网络:设置为"信息亭"(定制应用程序"锁定"计算机直到用户登录,并且正在运行的帐户是通过Windows组策略严格限制).目前,每台计算机都运行Windows XP并使用Active Desktop在后台显示广告.但是,由于我的客户端每天都遇到Active Desktop崩溃的问题(除了通常会减慢计算机速度),我还是被要求开发一个替换它的应用程序.
我正在尝试调查是否可以构建一个始终保留在后台的Windows窗体应用程序(使用C#).应用程序应位于桌面上方(以便它覆盖任何图标,文件等),但始终位于所有其他正在运行的应用程序之后.我想我真的在寻找BottomMost
这个Form
类的属性(当然不存在).
任何有关如何实现这一目标的提示或指示都将受到高度赞赏.
Ric*_*ett 18
这不是.NET Form类直接支持的,因此您有两个选择:
1)使用Win32 API SetWindowPos
函数.
pinvoke.net显示了如何在C#中声明它:
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_NOACTIVATE = 0x0010;
Run Code Online (Sandbox Code Playgroud)
所以在你的代码中,调用:
SetWindowPos(Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
Run Code Online (Sandbox Code Playgroud)
正如您所评论的那样,这会将表单移动到z顺序的底部,但不会将其保留在那里.我能看到的唯一解决方法是SetWindowPos
从Form_Load
和Form_Activate
事件中调用.如果您的应用程序最大化并且用户无法移动或最小化表单,那么您可能会使用这种方法,但它仍然是一种黑客攻击.如果在进行SetWindowPos
调用之前将表单放到z顺序的前面,用户也可能会看到轻微的"闪烁" .
2)子类化表单,覆盖WndProc
函数并拦截WM_WINDOWPOSCHANGING Windows消息,设置SWP_NOZORDER标志(取自本页).
归档时间: |
|
查看次数: |
17518 次 |
最近记录: |