我正在调试一个应用程序,该应用程序在其消息循环中调用IsDialogMessage()。有时, IsDialogMessage() 永远不会返回(其中 never 是大于 1 小时的间隔)。根据 Microsoft 符号服务器提供的 user32.dll 符号,它似乎卡在GetNextDlgGroupItem()(或相同的内部变体)中,在某些窗口集上迭代。
该应用程序是多线程的,并且经常接收外部事件的通知,这些通知作为 DCOM 调用到达。我怀疑这样的调用处理不当会破坏某些窗口状态。如果我可以了解哪种状态损坏可能会导致 IsDialogMessage() 中的无限循环,我想我将能够更轻松地识别损坏的来源。
我知道这是旧的,但为后代回答,因为这里没有人提到它。
很可能发生的事情是 Windows 管理器确定将消息转发到何处的问题。如果您有一个窗口层次结构,就像您可能所做的那样,那么您需要确保包含控件本身的非顶级窗口必须具有 WS_EX_CONTROLPARENT 样式集。如果是对话框,则使用 DS_CONTROL 样式。这些标志的存在修改了 IsDialogMessage 的行为;他们将窗口标识为具有自己的控件,可以接收焦点并处理 Tab 键顺序等,而不仅仅是控件本身。
例如,如果你有一个主框架窗口,它有一个带有 WS_EX_CONTROLPARENT 的子窗口,它有一个没有WS_EX_CONTROLPARENT的子窗口,它有一个有焦点的子窗口,你点击 TAB,你很可能会在你提到的同一个地方。
将第二个孩子的扩展样式设置为包含 WS_EX_CONTROLPARENT 将解决该问题。
| 归档时间: |
|
| 查看次数: |
1459 次 |
| 最近记录: |