如何在窗口过程中指出处理消息时出错?

我目前正在创建一个库来处理来自Raw Input API的信息,我正在使用级联函数处理所有内容。 这导致了几个非常小的,非常易读且非常集中的function。

但是,它只是打击了我,我不明白如何正确指示Windows失败。 我有这个function:

/* OnInput: Handle data received from Windows via a `WM_INPUT` message. */ static LRESULT CALLBACK OnInput(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL DispatchRawInput(CONST PRAWINPUT); assert(msg == WM_INPUT); return DefWindowProc(hWnd, msg, wParam, lParam); } 

它会返回零, 因为文档说明它应该 ; 但这取决于成功。

实际文字说明:

“如果应用程序处理此消息,则应返回零。”

但是如果我无法处理它该怎么办? 我最初假设你只是调用DefWindowProc并将其留在那,但这并没有向Windows发出任何事情的信号。

消息WM_CREATE似乎是我能找到的唯一返回零以外的实例:

“如果应用程序处理此消息,则应返回零以继续创建窗口。如果应用程序返回-1,则窗口将被销毁,CreateWindowEx或CreateWindow函数将返回NULL句柄。”

error handling真的只取决于程序员/团队而不是通知操作系统的必要性吗? 那些像WM_CREATE这样的事件失败并且需要阻止创建窗口呢?

您根据每条消息的文档指出错误。 如果消息没有说明错误,那么您可以安全地假设该消息没有错误指示符。 这对于通知消息很常见,操作系统只是告诉您发生了某些事情。 它不需要您的回复。

如果这是一个致命错误,那么你应该像处理其他致命错误一样处理它:以某种方式告知用户错误( MessageBoxstderr等)和exit()abort()

如果这是一个非致命的错误,那么你需要将它传回给你的应用程序,这可以通过多种方式完成:设置标志,调用函数,发布WM_APP消息等,你的应用程序应该处理它。 总而言之,Windows并不在乎,并且您有责任以合理的方式处理错误。

如果您正在编写供其他人使用的库,请确保您的应用程序具有明确定义和记录的错误过程。 如果库中发生内部错误,则允许应用程序指定错误回调,然后调用该回调并让应用程序处理它。