2016-12-11 3 views
0

Я работаю с приложением MFC. В некоторых наших формах у нас есть поля для пароля - обычные CEdit элементы управления с набором ES_PASSWORD. Когда фокус перемещается в поле пароля, Windows отображает подсказку-предупреждение, если пользователь имеет Caps Lock. (См. screendump here) Что хорошо: пароль чувствителен к регистру, поэтому хорошо, что пользователь получает информацию, что он должен отключить Caps Lock.«Caps Lock is on» -tooltip не уходит (Citrix? Codejock?)

Но иногда предупреждение не исчезает. Даже после того, как элемент управления CEdit (и все окно просмотра) был удален/уничтожен. «Всплывающая подсказка» остается на экране, поверх всего остального. (Скрывает новые элементы управления.) Единственный способ избавиться от него - закрыть приложение и перезапустить его.

Проблема возникает не так часто, но очень неприятна для пользователя, когда она это делает. Насколько нам известно, это произошло только с пользователями, которые запускают наше приложение под Citrix, а не на отдельном ПК. Наше приложение использует XTP Codejock, но всплывающая подсказка локализована, поэтому, похоже, она создается Windows.

(1) Кто-нибудь знает, что может быть причиной этого? Мы ничего не смогли найти в Интернете! Может ли это быть проблемой Citrix? Или мы ошибаемся в отношении этой вещи Windows - может ли это быть ошибкой Codejock?

(2) Есть ли способ исправить это? (CEdit::HideBalloonTip/EM_HIDEBALLOONTIP не поможет.)

(3) Если это не решение проблемы, мы можем отключить «Caps Lock на» -tooltip полностью для контроля CEdit? Лучше вообще не показывать всплывающую подсказку, чем иметь эту проблему.

+0

Если вы можете воссоздать эту проблему, вы можете попробовать использовать Spy ++, чтобы получить характеристики окна режущей кромки инструмента. Это может помочь вам определить, будет ли окно отображаться (изнутри вашего кода) и предоставить возможность его отклонить. – rrirower

+0

В родительском окне 'CEdit', переопределите' OnLButtonDown' и вызовите 'CEdit :: HideBalloonTip' или' SetFocus() ', посмотрите, закрывается ли подсказка при нажатии пользователем в родительском окне. –

ответ

0

Для подавления всплывающей подсказки можно фильтровать EM_SHOWBALLOONTIP сообщений, как описано here:

WNDPROC g_wpEdit; 

LRESULT CALLBACK NoBalloonWndProc(HWND hwnd, UINT uMsg, 
            WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) { 
    case EM_SHOWBALLOONTIP: return FALSE; 
    } 
    return CallWindowProc(g_wpEdit, hwnd, uMsg, wParam, lParam); 
} 

BOOL 
OnCreate(HWND hwnd, LPCREATESTRUCT lpcs) 
{ 
    g_hwndChild = CreateWindow(TEXT("edit"), NULL, 
      ES_PASSWORD | WS_CHILD | WS_VISIBLE, 0, 0, 
      0, 0, hwnd, NULL, g_hinst, 0); 
    if (!g_hwndChild) return FALSE; 

    g_wpEdit = SubclassWindow(g_hwndChild, NoBalloonWndProc); 

    return TRUE; 
}