Мне нужно, чтобы восстановить («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);
}
}
Можете ли вы разместить свой текущий код, пожалуйста? –
Я мог бы отправить код, если вы действительно чувствуете, что это необходимо, но так как это просто беспорядок попыток с использованием разных вызовов, на которые на самом деле не так много смотреть. Поставит что-нибудь, если я действительно заработаю его. – Niclas