Скрытый диалог на мгновение фокусируется - PullRequest
2 голосов
/ 15 марта 2012

У меня есть небольшая проблема здесь.

У меня есть сторонний элемент управления ActiveX, который преобразует файлы из одного типа в другой.Я хочу конвертировать много файлов, поэтому мне нужно запустить его в пакетном режиме.Однако этот элемент управления часто дает сбой (я не говорю о хороших исключениях в C ++, он делает такие приятные вещи, как доступ к уже освобожденной памяти, нарушение доступа, вы называете его).

Поэтому моя проблема заключается в следующем:

1) Мне нужно обернуть этот элемент ActiveX в отдельный процесс, чтобы он не повредил память моего основного процесса.

2) Мне нужно вызывать этот процесс, возможно, сотни раз,и с небольшими файлами на быстром компьютере он вызывается 5-6 раз в секунду

3) Мне нужно сделать этот процесс полностью бесшумным, пользователь не должен знать, что процесс выполняется много раз

4) Однако, поскольку это элемент управления ActiveX, мне также необходимо создать скрытый диалог в процессе, в котором размещается элемент управления ActiveX

Но когда я создаю скрытый диалог, кажется, что он отвлекает внимание отактивное окно на мгновение, а затем возвращает его обратно.Поскольку этот процесс может вызываться 5-6 раз в секунду, он прерывает ввод с клавиатуры для пользователя, а также быстро мигает текущее активное окно, переключаясь из активного в неактивное состояние.

Я используюПроизводный от CDialog класс для размещения элемента управления ActiveX.Флаг Visible отключен в редакторе ресурсов, чтобы он не отображался.Я создаю диалог, вызывая CDialog :: Create, а не DoModal.

Как я могу запретить диалогу убирать фокус?

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Оказывается, проблема была полностью с CDialog. Он крал фокус даже без ActiveX или каких-либо модификаций. Таким образом, решение состояло в том, чтобы создать мой собственный класс окна, который использует DefWindowProc, и использовать его в качестве родителя ActiveX (он требовал родителя, он не удался, когда я указал NULL для pParent).

1 голос
/ 16 марта 2012

Трудно сказать, не видя никакого исходного кода, но .... Если вы перезаписываете OnInitDialog в своем производном классе CDialog, попробуйте вернуть FALSE вместо TRUE в конце метода.

Просто угадай ...

Удачи.

0 голосов
/ 16 марта 2012

Это может быть не диалоговое окно, крадущее фокус, это может быть элемент управления ActiveX. Попробуйте это в диалоге без AX и посмотрите, показывает ли он то же поведение. CDialog :: Create создает диалоговое окно, но не отображает его, пока вы не вызовете ShowWindow / UpdateWindow.

Кроме того, я помню возможность создания элементов управления ActiveX без необходимости использования хоста. VS может создавать классы-оболочки для него, которые вы можете использовать для динамического создания. Действительно ли ActiveX требует диалоговое окно (например, элементы управления вводом для отображения)?

...