如何将已经显示的表单放在最前面并对其进行聚焦?

问题描述

| 如何以编程方式(假设我们已将其作为变量引用)将已经显示的表单放在最前面,并将其集中在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()
吗?