Как перенести мое приложение WPF на рабочий стол? Пока что я пробовал:
SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);
SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);
Ни один из которых не выполняет работу ( Marshal.GetLastWin32Error()
говорит, что эти операции успешно завершены, и атрибуты P / Invoke для каждого определения имеют SetLastError=true
).
Если я создаю новое пустое приложение WPF и вызываю SwitchToThisWindow
с помощью таймера, он работает точно так, как ожидалось, поэтому я не уверен, почему он не работает в моем исходном случае.
Изменить : я делаю это в сочетании с глобальной горячей клавишей.
Ответы:
Попытки вывести окно на передний план и активировать его.
Это должно сработать, если я не правильно понял, и вы хотите, чтобы поведение всегда на вершине. В этом случае вы хотите:
источник
Topmost
свойство, является плохой практикой, поскольку она может скрывать другие всплывающие диалоги и вести себя неожиданно.if (myWindow.WindowState == WindowState.Minimized) myWindow.WindowState = WindowState.Normal;
ни странно, он также сохранит все развернутые окна и не вернет их в нормальное состояние.Я нашел решение, которое выводит окно наверх, но оно ведет себя как обычное окно:
источник
Window.Focus()
. Это отвлечет внимание от того, что пользователь в настоящее время печатает в текстовом поле, что безумно расстраивает конечных пользователей. Приведенный выше код прекрасно работает без него.Если вам нужно, чтобы окно было впереди при первой загрузке, используйте следующее:
источник
Чтобы сделать это быстро копировать-вставить -
используйте этот
DoOnProcess
метод класса « метод для перемещения процесса» на передний план (но не для того, чтобы украсть фокус из других окон)НТН
источник
process.MainWindowHandle
?hWnd
. FWIWHwndSource
объект работал хорошо.Я знаю, что этот вопрос довольно старый, но я только столкнулся с этим точным сценарием и хотел поделиться решением, которое я реализовал.
Как упоминалось в комментариях на этой странице, некоторые из предложенных решений не работают на XP, которую я должен поддерживать в моем сценарии. Хотя я согласен с мнением @Matthew Xavier о том, что, как правило, это плохая практика UX, бывают случаи, когда это полностью правдоподобный UX.
Решение поднять окно WPF наверх было фактически предоставлено мне тем же кодом, который я использую для предоставления глобальной горячей клавиши. Статья в блоге Джозефа Куни содержит ссылку на примеры кода. которая содержит оригинальный код.
Я немного очистил и изменил код и реализовал его как метод расширения для System.Windows.Window. Я проверил это на XP 32-битной и Win7 64-битной, оба из которых работают правильно.
Я надеюсь, что этот код поможет другим, кто столкнулся с этой проблемой.
источник
this.Activate()
кажется, работают несколько раз.Если пользователь взаимодействует с другим приложением, может оказаться невозможным вывести ваше приложение вперед. Как правило, процесс может ожидать установки окна переднего плана, только если этот процесс уже является процессом переднего плана. (Microsoft документирует ограничения в записи SetDNoregroundWindow () MSDN.) Это потому, что:
источник
Я знаю, что это поздний ответ, может быть полезным для исследователей
источник
Почему некоторые ответы на этой странице неверны!
Любой ответ, который использует
window.Focus()
неверно.window.Focus()
будет отвлекать внимание от всего, что пользователь печатает в данный момент. Это безумно расстраивает конечных пользователей, особенно если всплывающие окна появляются довольно часто.Любой ответ, который использует
window.Activate()
неверно.window.ShowActivated = false
является неправильным.Visibility.Visible
чтобы скрыть / показать окно, является неправильным.window.Show()
иwindow.Hide()
.По существу:
MVVM Solution
Этот код на 100% совместим с Citrix (нет пустых областей экрана). Он протестирован как с обычным WPF, так и с DevExpress.
Этот ответ предназначен для любого случая использования, когда нам нужно небольшое окно уведомлений, которое всегда находится перед другими окнами (если пользователь выбирает это в настройках).
Если этот ответ кажется более сложным, чем другие, это потому, что это надежный код уровня предприятия. Некоторые другие ответы на этой странице просты, но на самом деле не работают.
XAML - Присоединенное свойство
Добавьте это прикрепленное свойство к любому в
UserControl
пределах окна. Прикрепленное имущество будет:Loaded
событие не будет запущено (в противном случае оно не может найти визуальное дерево, чтобы найти родительское окно).В любой момент вы можете установить окно, чтобы быть впереди или нет, переключая значение присоединенного свойства.
C # - вспомогательный метод
использование
Чтобы использовать это, вам нужно создать окно в вашей ViewModel:
Дополнительные ссылки
Советы о том, как обеспечить, чтобы окно уведомлений всегда возвращалось на видимый экран, см. В моем ответе. Как в WPF переместить окно на экран, если оно не на экране? ,
источник
catch (Exception) { }
. Да, верно ... И он использует код, который даже не показан в ответе, как_dialogService
илиShiftWindowOntoScreenHelper
. Плюс просьба создать окно на стороне модели представления (которое в основном нарушает весь шаблон MVVM) ...Func<>
, связанный с ViewModel.У меня была похожая проблема с приложением WPF, которое вызывается из приложения Access через объект Shell.
Мое решение ниже - работает в XP и Win7 x64 с приложением, скомпилированным для цели x86.
Я бы предпочел сделать это, чем симулировать alt-tab.
источник
Ну, так как это такая горячая тема ... вот что работает для меня. Я получил ошибки, если я не сделал это таким образом, потому что Activate () выдаст ошибку, если вы не видите окно.
Xaml:
CodeBehind:
Для меня это был единственный способ заставить окно показывать сверху. Затем активируйте его, чтобы вы могли ввести текст в поле без необходимости фокусировки мышью. control.Focus () не будет работать, если окно не Active ();
источник
Ну, я разобрался. Я звоню с помощью клавиатуры, используемой для реализации горячей клавиши. Вызов работает, как и ожидалось, если я поместил его в BackgroundWorker с паузой. Это клудж, но я понятия не имею, почему он изначально не работал.
источник
Чтобы показать ЛЮБОЕ открытое окно, импортируйте эти DLL:
и в программе Мы ищем приложение с указанным названием (напишите название без первой буквы (индекс> 0))
источник
IndexOf
правильно, вместо этого?Проблема может заключаться в том, что поток, вызывающий ваш код из ловушки, не был инициализирован во время выполнения, поэтому вызов методов во время выполнения не работает.
Возможно, вы могли бы попытаться выполнить Invoke, чтобы направить ваш код в поток пользовательского интерфейса, чтобы вызвать ваш код, который выводит окно на передний план.
источник
Эти коды будут работать нормально все время.
Сначала установите активированный обработчик событий в XAML:
Добавьте строку ниже в свой блок конструктора главного окна:
А внутри активированного обработчика событий скопируйте эти коды:
Эти шаги будут хорошо работать и перенесут все остальные окна в окно их родителей.
источник
Если вы пытаетесь скрыть окно, например, вы минимизируете окно, я обнаружил, что с помощью
будет скрывать это правильно, а затем просто используя
затем снова покажет окно как самый верхний элемент.
источник
Просто хотел добавить другое решение этого вопроса. Эта реализация работает для моего сценария, где CaliBurn отвечает за отображение главного окна.
источник
Не забудьте не помещать код, который показывает это окно, в обработчик PreviewMouseDoubleClick, так как активное окно переключится обратно на окно, обработавшее событие. Просто поместите его в обработчик событий MouseDoubleClick или прекратите пузыриться, установив для e.Handled значение True.
В моем случае я обрабатывал PreviewMouseDoubleClick для Listview и не устанавливал e.Handled = true, тогда он вызывал событие MouseDoubleClick, которое снова фокусировалось на исходном окне.
источник
Я создал метод расширения, чтобы облегчить повторное использование.
Позвоните в форму конструктора
источник