2

Примечания: Я пытаюсь РЕШИТЬ ПРОБЛЕМУ МЫШИ, НЕ КЛАВИАТУРА проблема, которая уже решенаElementHost событие блоков мыши

Так я создаю визуальное расширение студии 2015, работая на страницах Options.

Я использую WPF, поэтому я использую ElementHost для размещения UserControl. Сначала он не получал события клавиатуры, поэтому я реализовал решение на:

WPF TextBox not accepting Input when in ElementHost in Window Forms

быстренько решения:

А) на нагруженной событии UserControl, я делать:

var s = HwndSource.FromVisual(this) as HwndSource; 
s?.AddHook(ChildHwndSourceHook); 

B) В ChildHwndSourceHook(), я что-то вроде:

static IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    if (msg == WM_GETDLGCODE) 
    { 
     handled = true; 
     return new IntPtr(DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL | DLGC_WANTTAB); 
    } 
    return IntPtr.Zero; 
} 

ОДНАКО, теперь мышь над событиями, кажется, игнорируется, поскольку курсор не изменяется при перемещении по текстовым полям или разделителям разделов, даже в новых Windows, которые я создаю. Очень часто, однако, события мыши действительно работают и продолжают работать, пока я не перейду на другую страницу или не закрою диалог. Это самая странная часть.

Я пробовал все и ежедневно просматривал Google, но я не понимаю, почему клики работают нормально, но мышь над событиями, похоже, не регистрируется.

Я попытался удалить обработчик сообщения, а затем открыть окно, но, похоже, после добавления обработчика его удаление ничего не исправит.

Кто-нибудь знает, как я могу навести курсор мыши на события, чтобы работать с моими элементами управления? Спасибо!

+2

Кусок кода, который не делает то, что он должен использовать. – JeffRSon

ответ

1

Я нашел успех, используя метод, который использовал создатель Viasfora. Вы можете увидеть код на GitHub repo here. В частности, посмотрите на TextObfuscationDialog и то, как он размещается. Я считаю, что может быть что-то не так с документацией по расширению VS, потому что я столкнулся с той же проблемой, что и вы.

EDIT:

Я создал образец проекта, чтобы показать этот метод действительно работает (я использую его в 2 моих собственных расширений прямо сейчас). Надеемся, что этот рабочий код может облегчить вам реализацию его в вашем собственном проекте.

Вы можете загрузить исходный код с моего OneDrive here.

WPF Options Page

The UIElementDialogPageon MSDN говорит:

Обеспечивает бесшовное хостинг Windows Presentation Foundation (WPF) содержимого внутри родного диалога под управлением цикл обработки сообщений IsDialogMessage стиле . Этот класс позволяет вставлять и извлекать из окна WPF дочерний дескриптор окна (HWND) и включает навигацию по клавиатуре в дочернем HWND пользователя WPF .

Так в то время как ElementHost не будет функционировать должным образом в цикле сообщений нормальной/WinForms DialogPage, в UIElementDialogPage воли. Существует ряд классов, которые имеют UIElement* или аналогичный префикс - они должны помочь перенести устаревший код VS из Windows Forms в WPF.

+0

Извините, ваш ответ на самом деле не работает вообще. Я посмотрел ближе к этому коду, и вы делаете немного больше, чем перенос исходного ответа, который я реализовал, в производный класс ElementHost. Это не помогает с изменением проблемы мыши. :( –

+0

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

+0

@ChrisBordeman Я отредактировал свой ответ с рабочим проектом. Вы должны иметь возможность брать файлы непосредственно в свой проект и рефакторинг они должны соответствовать вашему пространству имен.Я также добавил скриншот, чтобы показать правильное поведение мыши в результате этой обертки. –

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