问题描述
|
如何以编程方式(假设我们已将其作为变量引用)将已经显示的表单放在最前面,并将其集中在C#WinForms应用程序中?
解决方法
您应该使用
BringToFront()
方法
, 您可以使用SetForegroundWindow
。这里是一个很好的例子:C#Force Form Focus。
[DllImport(\"User32\")]
private static extern int SetForegroundWindow(IntPtr hwnd);
用法:
SetForegroundWindow(form.Handle);
, 这里的答案并不太适合我。如果表单未聚焦,使用BringToFront实际上不会将其置于最前面;而如果表单没有聚焦,则使用Form.Activate只会使其闪烁。我写了这个小帮手,它运行得很完美(我不能完全相信,不能在网上找到WPF并将其转换):
public static class FormHelper
{
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_SHOWWINDOW = 0x0040;
[DllImport(\"user32.dll\")]
private static extern IntPtr GetForegroundWindow();
[DllImport(\"user32.dll\")]
public static extern bool SetWindowPos(IntPtr hWnd,IntPtr hWndInsertAfter,int X,int Y,int cx,int cy,uint uFlags);
[DllImport(\"User32\")]
private static extern int SetForegroundWindow(IntPtr hwnd);
[DllImport(\"user32.dll\")]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd,IntPtr ProcessId);
[DllImport(\"user32.dll\")]
private static extern bool AttachThreadInput(uint idAttach,uint idAttachTo,bool fAttach);
public static void BringToFront(Form form)
{
var currentForegroundWindow = GetForegroundWindow();
var thisWindowThreadId = GetWindowThreadProcessId(form.Handle,IntPtr.Zero);
var currentForegroundWindowThreadId = GetWindowThreadProcessId(currentForegroundWindow,IntPtr.Zero);
AttachThreadInput(currentForegroundWindowThreadId,thisWindowThreadId,true);
SetWindowPos(form.Handle,new IntPtr(0),SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
AttachThreadInput(currentForegroundWindowThreadId,false);
form.Show();
form.Activate();
}
}
您所要做的就是调用FormHelper.BringToFront,并传入您想要显示的表单。
, Form.Show();
要么
Form.ShowDialog();
有什么不同?首先显示新表格,但其他所有表格都将处于活动状态。第二种解决方案使得只有这种新形式才是活动的。
, 您尝试过Form.Show()
和/或Form.BringToFront()
吗?