【问题标题】:MessageBox() not responsing in WM_ACTIVATEAPP on touchscreenMessageBox() 在触摸屏上的 WM_ACTIVATEAPP 中没有响应
【发布时间】:2016-04-21 08:57:33
【问题描述】:

我注意到,通过触摸屏激活应用程序时,MessageBox 例程(或任何模式对话框)在 WM_ACTIVATEAPP 消息处理中没有响应(挂起),而通过鼠标激活应用程序工作正常。

case WM_ACTIVATEAPP:
    MessageBox(hWnd, TEXT("Not responsing with touchscreen"), TEXT("Help!"), MB_OK);
break;

消息框显示没有响应鼠标单击或手指触摸,整个应用程序冻结 - 我必须使用任务管理器杀死应用程序。

是否是 Win32 API 的已知错误?有没有办法解决这个问题?

【问题讨论】:

  • 你能提供更多细节吗?您如何确定挂起是在 WM_ACTIVATEAPP 消息处理中?
  • 您运行的是什么版本的 Windows? Windows 7 的触摸输入支持非常糟糕。它已从 Windows 8 开始重新设计。
  • 一段代码可能会有所帮助
  • @AdrianMcCarthy:挂起是指对话框不响应鼠标点击,我的整个应用程序完全冻结 - 我必须使用任务管理器将其杀死。
  • @IInspectable : 我在我的 Windows 10 下重现它。但有些用户在 Windows 8 下重现它

标签: c++ c winapi touchscreen win32gui


【解决方案1】:

WM_ACTIVATEAPP 是一条“困难”消息,您的应用程序处于尴尬状态,您的窗口正在激活并获得焦点,但在您收到消息时它还没有到达那里。您永远不想做任何事情来阻止消息处理程序并编写需要知道活动窗口或更改活动窗口的代码。就像 MessageBox() 一样。死锁并不罕见,尤其是在 Wow64 模拟器中运行的 32 位应用程序中。

不要阻塞,只是延迟消息框的显示:

case WM_ACTIVATEAPP:
    PostMessage(hWnd, WM_USER, NULL, NULL);
    DefWindowProc(hWnd, msg, wparam, lparam);
    break;
case WM_USER:
    MessageBox(hWnd, TEXT("Responsing with touchscreen"), TEXT("Okay!"), MB_OK); 
    break;

是否需要调用 DefWindowProc() 是一个猜测,您没有发布足够的代码。

【讨论】:

  • 非常感谢@Hans Passant 的这个非常中肯的回答!你的解决方案不仅解决了挂起的问题,还让我的代码更加优雅!
猜你喜欢
  • 2016-11-13
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多