我有一个带有HWND句柄的数据模块,可以接收PostMessage调用。
句柄在DataModuleCreate中分配如此(TTNONVISUAL 不定义):
{$IFNDEF TTNONVISUAL}
FHWND := AllocateHWND(WindProc);
{$ELSE}
FHWND := 0;
{$ENDIF}
数据模块也用于非可视化程序,其中定义了TTNONVISUAL
。数据模块中的WindProc包含在{$ IFNDEF TTNONVISUAL}中,因此在非可视程序中没有WindProc和FHWND = 0
在该程序中,对这个0句柄进行PostMessage调用是否安全?
注意:PostMessage不会发送任何其他数据:
PostMessage的(FHWND,WM_SYNC_PROGRESS,0,0)
和WM_SYNC_PROGRESS是WM_USER + 111,没有其他WM_SYNC_PROGRESS处理程序。
答案 0 :(得分:6)
[为句柄传递NULL时,它不引用变量Null,但实际上是值0
]:
该函数的行为就像调用PostThreadMessage一样 dwThreadId参数设置为当前线程的标识符。
因此,将消息发布到0
具有明显的含义,如果您确实想要将消息置于遗忘状态,则不应该只允许这样做。如果是这种情况,您宁愿检查句柄是否为0
而不是发布消息。
但请注意,即使在非可视化应用程序中,创建窗口也是完全合法的。这样的句柄用于发送消息。它们不一定指向可见窗口。实际上,这正是AllocateHWND的用途。它用于非视觉控制(如TTimer),毕竟需要能够接收消息。