DevCon bits: WinSendMsg

User avatar
Eugene Gorbunoff
Site Admin
Posts: 685
Joined: Sat Apr 09, 2005 11:18
Location: St.Petersburg, Russia

DevCon bits: WinSendMsg

Postby Eugene Gorbunoff » Fri Mar 19, 2010 10:58

From: Glassman
Date: 2010/03/19


WinSendMsg, WinPostMsg, непонятки, нити, WC_LISTBOX

Область

WinSendMsg из одной нити в другую.

Проблема

Есть окно со списком (WC_LISTBOX), созданное в основной нити программы. Есть специальная фоновая нить, которая общается с другой программой и отправляет ее перехваченный вывод в окно списка. Используется функция WinSendMsg и сообщения LM_INSERTITEM, LM_DELETEITEM, LM_SELECTITEM, LM_SETTOPINDEX и LM_QUERYITEMCOUNT. При появлении любого системного модального окна с сообщением об ошибке (AUTOFAIL=YES в config.sys отсутствует), WinSendMsg начинает возвращать признак ошибки, WunGetLastError при при этом возвращает 0x1009 (PMERR_CALL_FROM_WRONG_THREAD).
Если переделать программу так, чтобы в основную нить отправлялось некое WM_USER сообщение с помощью WinPostMsg после перехвата которого работа со списком производилась уже в основной нити, то все работает без каких либо проблем.

Цитата из документации о системных модальных окнах:

All other main windows behave as though they are disabled and no interaction is possible with them. The disabled windows are not actually disabled, but made noninteractive. No messages are sent to these windows when the system-modal state is entered or left, and their WS_DISABLE style bits are not changed.

Несколько туманно, но похоже, что блокируется посылка всех сообщений, а не только сообщений мыши и клавиатуры...

Возможное решение

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

Return to “Developers / Разработчики”

Who is online

Users browsing this forum: No registered users and 2 guests

cron