Как вывести уже показанную форму на первый план и сфокусировать ее? - PullRequest
3 голосов
/ 12 июня 2011

Как программно (при условии, что у нас есть ссылка на нее как на переменную) вывести уже показанную форму на самый передний план и сосредоточить ее в приложении C # WinForms?

Ответы [ 5 ]

7 голосов
/ 12 июня 2011

Вы можете использовать SetForegroundWindow. Хороший пример здесь: C # Force Form Focus .

[DllImport("User32")]
private static extern int SetForegroundWindow(IntPtr hwnd);

Использование:

SetForegroundWindow(form.Handle);
3 голосов
/ 12 июня 2011

Вы должны использовать BringToFront() метод

2 голосов
/ 30 марта 2014

Ответы здесь не совсем для меня. Использование 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), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
            AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false);
            form.Show();
            form.Activate();
        }
    }

Все, что вам нужно сделать, это вызвать FormHelper.BringToFront, передавая форму, которую вы хотите показать.

0 голосов
/ 12 июня 2011
Form.Show();

или

Form.ShowDialog();

Что отличается?Сначала покажите новую форму, но все остальные будут активны.Второе решение заключается в том, что только эта новая форма будет активна.

0 голосов
/ 12 июня 2011

Вы пробовали Form.Show() и / или Form.BringToFront()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...