Как сделать так, чтобы прозрачное окно 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. Смотрите ответ на этот вопрос для примера.

Другие вопросы по тегам