Как сделать так, чтобы прозрачное окно WPF оставалось поверх всех других окон, но не влияло на пользовательский ввод?
Я пытаюсь разработать приложение для Windows, которое позволяет людям "рисовать на экране".
Я разрабатываю с:
.NET 3.5 C# / WPF
У меня есть окно WPF с InkCanvas, оба имеют прозрачный фон.
Свойства окна XAML:
ShowInTaskbar="True" ResizeMode="NoResize" Background="Transparent"
WindowStyle="None" AllowsTransparency="True" Topmost="True"
Свойства InkCanvas:
Background="#11FFFFFF"
Мне нужен обработчик событий для следующего: - щелкните правой кнопкой мыши в любом месте окна - нажмите escape
желаемый результат: - окно WPF остается поверх всех других окон, но больше не активно и больше не принимает ввод - окно WPF больше не может быть сфокусировано. Все входные данные от пользователей должны идти к их текущему сфокусированному окну и игнорировать окно wpf с тушью, которая находится поверх всего
Пример базового использования: пользователь приложения играет в игру. Они останавливаются и рисуют стрелки в окне wpf / inkcanvas. Они заканчивают, нажимая клавишу escape. Окно wpf остается сверху, с формами, которые пользователь нарисовал открытыми, и пользовательский ввод возвращается к любому окну, которое он открыл / сфокусировал.
Пока я пробовал это:
MouseRightButtonUp ::
mywindow.isenabled = false
и я попробовал:
mywindow.IsInputMethodEnabled = false
Пока не работает, окно wpf все еще начинает захватывать пользовательский ввод. Мне как-то нужно, чтобы это окно показывалось, но без его активации... даже после того, как оно "использовалось" в течение некоторого периода времени.
Заранее благодарю за любой совет!
1 ответ
Вы можете перехватить WndProc (используя AddHook HwndSource, как показано здесь), перехватить WM_NCHITTEST и вернуть HTTRANSPARENT. Это только позволит ему пройти к другим окнам в этом потоке. Другим вариантом может быть установка бита расширенного стиля WS_EX_TRANSPARENT. Смотрите ответ на этот вопрос для примера.