我有一个C#winforms应用程序在另一个程序中运行宏.另一个程序将不断弹出窗口,并且通常会让事情看起来,因为缺乏一个更好的词,是疯狂的.我想实现一个取消按钮来阻止进程运行,但我似乎无法让窗口保持在最顶层.我如何在C#中执行此操作?
编辑:我试过TopMost = true; ,但另一个程序不断在顶部弹出自己的窗口.有没有办法每隔n毫秒将窗口发送到顶部?
编辑:我解决这个问题的方法是添加一个系统托盘图标,通过双击取消该过程.系统托盘图标不会被遮盖.谢谢所有回复的人.我读了一篇关于为什么没有"超级顶级"窗口的文章......它在逻辑上不起作用.
Ros*_*ant 152
Form.TopMost 除非其他程序正在创建最顶层的窗口,否则它将起作用
无法创建另一个进程的新最顶层窗口未覆盖的窗口.Raymond Chen 解释了原因.
cla*_*mum 40
我正在寻找使我的WinForms应用程序"永远在顶部",但设置"TopMost"对我没有任何作用.我知道这是可能的,因为WinAmp会这样做(以及许多其他应用程序).
我做的是打电话给"user32.dll".我对此没有任何疑虑,而且效果很好.无论如何,这是一个选择.
首先,导入以下命名空间:
using System.Runtime.InteropServices;
Run Code Online (Sandbox Code Playgroud)
在类声明中添加一些变量:
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
Run Code Online (Sandbox Code Playgroud)
为user32.dll函数添加原型:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中(我在Form_Load()中添加了调用),添加调用:
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.参考
Vic*_*ard 23
如果通过"疯狂"意味着每个窗口都不断地从另一个窗口窃取焦点,TopMost将无法解决问题.
相反,尝试:
CalledForm.Owner = CallerForm;
CalledForm.Show();
Run Code Online (Sandbox Code Playgroud)
这将显示"儿童"形式,而不会窃取焦点.即使父母被激活或专注,子表单也将保留在其父表单之上.如果您已在所有者表单中创建子表单的实例,则此代码仅适用.否则,您可能必须使用API设置所有者.
我有一个短暂的5分钟失误,我忘了像这样完整地指定表格:
myformName.ActiveForm.TopMost = true;
Run Code Online (Sandbox Code Playgroud)
但我真正想要的就是这个!
this.TopMost = true;
Run Code Online (Sandbox Code Playgroud)
以下代码使窗口始终位于顶部,并使其无框架。
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace StayOnTop
{
public partial class Form1 : Form
{
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
public Form1()
{
InitializeComponent();
FormBorderStyle = FormBorderStyle.None;
TopMost = true;
}
private void Form1_Load(object sender, EventArgs e)
{
SetWindowPos(this.Handle, HWND_TOPMOST, 100, 100, 300, 300, TOPMOST_FLAGS);
}
protected override void WndProc(ref Message m)
{
const int RESIZE_HANDLE_SIZE = 10;
switch (m.Msg)
{
case 0x0084/*NCHITTEST*/ :
base.WndProc(ref m);
if ((int)m.Result == 0x01/*HTCLIENT*/)
{
Point screenPoint = new Point(m.LParam.ToInt32());
Point clientPoint = this.PointToClient(screenPoint);
if (clientPoint.Y <= RESIZE_HANDLE_SIZE)
{
if (clientPoint.X <= RESIZE_HANDLE_SIZE)
m.Result = (IntPtr)13/*HTTOPLEFT*/ ;
else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
m.Result = (IntPtr)12/*HTTOP*/ ;
else
m.Result = (IntPtr)14/*HTTOPRIGHT*/ ;
}
else if (clientPoint.Y <= (Size.Height - RESIZE_HANDLE_SIZE))
{
if (clientPoint.X <= RESIZE_HANDLE_SIZE)
m.Result = (IntPtr)10/*HTLEFT*/ ;
else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
m.Result = (IntPtr)2/*HTCAPTION*/ ;
else
m.Result = (IntPtr)11/*HTRIGHT*/ ;
}
else
{
if (clientPoint.X <= RESIZE_HANDLE_SIZE)
m.Result = (IntPtr)16/*HTBOTTOMLEFT*/ ;
else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
m.Result = (IntPtr)15/*HTBOTTOM*/ ;
else
m.Result = (IntPtr)17/*HTBOTTOMRIGHT*/ ;
}
}
return;
}
base.WndProc(ref m);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style |= 0x20000; // <--- use 0x20000
return cp;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
172036 次 |
| 最近记录: |