2010-02-20 5 views
3

Почему Windows SendMessage() всегда возвращает ZERO, даже доставка сообщения является успешной? Есть ли способ проверить ошибку доставки сообщений с помощью SendMessage()?SendMessage Всегда возвращает ZERO?

EDIT

Забыл упомянуть, что я использую SendMessage() внутри с DLL ++

LRESULT result = ::SendMessage(hwndOtherWindow,WM_COPYDATA, NULL/*(WPARAM)this->GetSafeHwnd()*/,(LPARAM)&structCDS); 

"результат" всегда равен нулю :(, но сообщение доставляет другому окну успешно

EDIT

BOOL CDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{ 
    return /*CDialog::OnCopyData(pWnd, pCopyDataStruct)*/ true; //true is the trick 
} 
+3

Результат возврата SendMessage зависит от отправляемого сообщения. Можете ли вы показать соответствующий код? – 2010-02-20 06:57:06

+0

Это логическое значение FALSE. – cpx

ответ

2

Нулевой возврат из SendMessage для WM_COPYDATA означает, что целевое приложение не обработало сообщение (FALSE = 0).

Сообщение может быть успешно отправлено, но если целевое приложение не обрабатывает сообщение должным образом (то есть, неверное возвращаемое значение или передает его в оконную процедуру по умолчанию), то ваш запрос SendMessage будет возвращаться с неправильным результат.

Возможно, стоит потратить время, чтобы посмотреть, как обрабатывается целевое приложение сообщения WM_COPYDATA.

+0

В окне приема я просто реализую метод OnCopyData и просто вернусь. Если я прав, окно получения может обрабатывать или просто IGNORE и возвращаться. Но у меня есть ключ к этому результату возврата, так как у моей библиотеки DLL нет окна, я просто передаю NULL в wParam. Однако SendMessage является блокирующим вызовом, но он должен возвращать правильный результат. Я прав ? – nimo

+0

Да, SendMessage блокирует и возвращает значение, возвращаемое из функции оконной процедуры при обработке сообщения. Если вы используете OnCopyData (MFC?), Вам нужно вернуть TRUE, а не ноль. Если вы можете отредактировать исходное сообщение, чтобы показать свою реализацию WM_COPYDATA на стороне приложения, это очень помогло бы. –

+0

Спасибо, Mattew, Как вы думаете, «return true» - это трюк, который я только что называл «CDialog :: OnCopyData». Кстати, я хотел бы знать, что не так с предыдущей реализацией. – nimo

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