【发布时间】:2021-04-20 07:07:41
【问题描述】:
我想使用 Windows api PostMessageA 发布 WM_MOUSEMOVE 消息。在WM_MOUSEMOVE 上的微软文档中,它说:
如果应用程序处理此消息,它应该返回零。
在PostMessageA 上,它说:
如果函数成功,返回值非零。如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError。 GetLastError 在达到限制时返回 ERROR_NOT_ENOUGH_QUOTA。
它们不是矛盾的吗?在我的程序中,我写了这些代码:
// ...
// mainGameWnd is the handle on the main window
// wParamRawMouse = 0, which indicates no mouse button was pressed
// _mouse_position.x and _mouse_position.y are LONG type
if ((PostMessageA(mainGameWnd, WM_MOUSEMOVE, wParamRawMouse, MAKELPARAM(_mouse_position.x, _mouse_position.y))) == 0);
{
// error logging
LogError("post message in Mouse move failed. Error: %ld", GetLastError());
}
在日志文件中,我找到了这一行:
[Error]: post message in Mouse move failed. Error: 0
返回的“0”到底是什么意思?这是否意味着PostMessageA 失败,我应该检查发送到其中的参数,或者只是消息已成功处理,我不需要执行任何操作?
附录
关于日志错误
// global: FILE* logFile = stdout;
// lastLog is enum
void Log(LogCategory level, LPCSTR format, bool append, va_list args)
{
lastLog = level;
if (!(LogFlag & (1 << level)))
return;
if (logEventFunc)
{
if (!logEventFunc(level, format, append, args))
return;
}
if (!append)
{
time_t rawtime;
char pblgtime[128] = { 0 };
time(&rawtime);
switch (level)
{
case Log_Error: strftime(pblgtime, 128, "%Y-%m-%d %X [Error]: ", localtime(&rawtime)); break;
}
fprintf(logFile, pblgtime);
}
vfprintf(logFile, format, args);
fflush(logFile);
}
void LogError(LPCSTR format, ...)
{
va_list args;
va_start(args, format);
Log(Log_Error, format, false, args);
va_end(args);
}
【问题讨论】:
-
PostMessage返回的值与您的应用程序从其窗口过程返回的值不同。没有矛盾。 -
LogError扩展为什么? -
@molbdnilo 感谢您的评论。那么上面示例的结果是否表明 postmessage failed ?而 LogError 只是将格式化的字符串写入文件。
-
这表示 1) 失败,2) 你的
LogError宏在调用GetLastError之前做了一些事情。 (我没有问LogError是做什么的,我问的是它扩展为什么;它的定义。) -
@molbdnilo 我已经在帖子中添加了。