2013-04-10 2 views
7

Мне нужно, чтобы восстановить («un-minim») окно WPF, которое уже создано, но окно, которое сейчас находится сверху (необязательно WPF) не может потерять фокус или активацию. Я пробовал использовать все функции WIN32, которые я могу найти, но безрезультатно. На самом деле, разочаровавшись в этом, вы действительно оцените любые указатели и подсказки.Как восстановить окно без фокусировки с помощью WPF (или interop)

Очевидно, что просто изменение на WindowState.Normal в WPF не сокращает его, поскольку это заставляет окно получать фокус и активацию как-хорошо. Я также пробовал всевозможные комбинации с настройкой Hidden и IsEnabled при восстановлении.

Я пробовал WIN32 SetWindowPos с HWND_TOP, HWND_TOPMOST и т. Д., Но эта функция не предназначена для восстановления окон и изменит только положение уже «отображаемых» окон.

Tried WIN32 ShowWindow и SetWindowPlacement, но не повезло и там. Пробовал отчаянную попытку добавления HwndHook попробовать и слушать WM_SETFOCUS и восстановление фокуса к исходному окну, но я только получить ноль для последней сфокусированной оконной ручки ..

Edit - решение с расширением окна после наводки Joel Lucsy :

public static class RestoreWindowNoActivateExtension 
{   
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool ShowWindow(IntPtr hWnd, UInt32 nCmdShow); 

    private const int SW_SHOWNOACTIVATE = 4; 

    public static void RestoreNoActivate(this Window win) 
    { 
     WindowInteropHelper winHelper = new WindowInteropHelper(win); 
     ShowWindow(winHelper.Handle, SW_SHOWNOACTIVATE); 
    } 
} 
+0

Можете ли вы разместить свой текущий код, пожалуйста? –

+0

Я мог бы отправить код, если вы действительно чувствуете, что это необходимо, но так как это просто беспорядок попыток с использованием разных вызовов, на которые на самом деле не так много смотреть. Поставит что-нибудь, если я действительно заработаю его. – Niclas

ответ

6

Вызов ShowWindow передавая SW_SHOWNOACTIVATE флаг.

+0

Я действительно попытался выполнить эту передачу всех комбинаций параметров, о которых я мог думать. К настоящему моменту я уверен, что SetWindowPos не может быть использован для восстановления окна, но я бы хотел, чтобы его доказали неправильно :) – Niclas

+1

Как насчет ShowWindow с SW_SHOWNOACTIVATE? –

+0

+1 Я отредактировал ваш ответ, чтобы включить правильный ответ. Нет смысла оставлять там оригинальный ответ, который не работает. –

Смежные вопросы