Как предотвратить контроль от кражи фокуса? - PullRequest
4 голосов
/ 14 июля 2009

В наше приложение C # WinForms загружен сторонний элемент управления.

Когда мы вызываем метод для этого стороннего элемента управления ActiveX, он асинхронно захватывает фокус. Например:

// This call causes 3rd party to spawn a thread and steal focus 
// milliseconds later.
foo3rdParty.DoSomething();

Есть ли способ предотвратить кражу фокуса элемента управления?

Ответы [ 4 ]

3 голосов
/ 14 июля 2009

Если у элемента управления есть событие GotFocus () (и оно корректно вызывается элементом управления всякий раз, когда он крадет фокус), вы можете прикрепить к нему обработчик и установить фокус обратно на последний элемент управления, который имел фокус (или Кнопка ОК или что-то еще).

Это может привести к странностям, если кто-то печатает в текстовом поле в середине этого. Мое решение состояло бы в том, чтобы отдать мои деньги тому, кто был готов сделать, возможно, 15 минут работы, чтобы помочь мне.

3 голосов
/ 14 июля 2009

Если этот злой маленький элемент управления не должен быть видимым, вы можете поместить его в невидимую форму и вызвать там DoSomething (). Тогда кого это волнует, захватывает ли он фокус?

2 голосов
/ 14 июля 2009

тьфу. Вы, наверное, уже думали об этом, но можете ли вы отключить окно элемента управления в течение периода (или предположения), когда он пытается сфокусироваться, не затрагивая пользовательский опыт?

2 голосов
/ 14 июля 2009

Вы можете попробовать этот грубый подход:

  1. Найдите, какой элемент управления находится в фокусе, прежде чем совершать вызов, например, используя Form.ActiveControl.
  2. Присоедините обработчик к активному элементу управления, который вызывается, когда он теряет фокус.
  3. Выполните вызов метода стороннего элемента управления.
  4. Если все пойдет как положено, сторонний элемент управления получит фокус, а ранее сфокусированный элемент управления потеряет фокус, и будет вызван обработчик.
  5. В этом обработчике либо установите фокус обратно на предыдущий элемент управления, либо запланируйте некоторый код для запуска в потоке, чтобы сделать это немного позже.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...