Нет способа достоверно определить, был ли вызов на SendMessage
успешным или неудачным. В конце концов, он имеет только одно возвращаемое значение, и используется весь диапазон значений. Нет обозначенного значения ошибки.
Воспроизведение трюков с последним кодом ошибки вызывающего потока также не будет работать. Схема, предложенная в этом ответе (очистка последнего кода ошибки до вызова и оценка его после вызова), является хрупкой. Легко видеть, что это может привести к сбою при отправке сообщения в окно, принадлежащее вызывающему потоку (поскольку оконная процедура этого окна может изменять последнюю ошибку любым способом, который сочтет нужным).
Не так хорошо известно, что это также может произойти сбой при отправке сообщения в окно, принадлежащее другому потоку. Код предполагает, что в вызывающем потоке не может произойти промежуточный вызов API. Однако в этом сценарии SendMessage
также будет отправлять входящие сообщения между потоками (см. Когда поток может получать оконные сообщения? ), позволяя изменить последний код ошибки потока.
Единственный вариант - использовать SendMessageTimeoutW
, поскольку этот API сообщает как о результате вызова, так и об ошибке / индикаторе успеха. Передача флага SMTO_NOTIMEOUTIFNOTHUNG
гарантирует, что произвольно выбранный тайм-аут не повлияет отрицательно на результат.