Delphi 对于';s 0?
我有一个带有HWND句柄的数据模块,用于接收PostMessage调用 句柄在DataModuleCreate中的分配如下(未定义TTNONVISUAL): 数据模块也用于定义TTNONVISUAL的非可视程序中 datamodule中的WindProc包含在{$IFNDEF TTNONVISUAL}中,因此在非可视程序中没有WindProc且FHWND=0 在该程序中,对该0句柄进行PostMessage调用是否安全 注意:PostMessage不发送任何附加数据:Delphi 对于';s 0?,delphi,postmessage,Delphi,Postmessage,我有一个带有HWND句柄的数据模块,用于接收PostMessage调用 句柄在DataModuleCreate中的分配如下(未定义TTNONVISUAL): 数据模块也用于定义TTNONVISUAL的非可视程序中 datamodule中的WindProc包含在{$IFNDEF TTNONVISUAL}中,因此在非可视程序中没有WindProc且FHWND=0 在该程序中,对该0句柄进行PostMessage调用是否安全 注意:PostMessage不发送任何附加数据: 后消息(FHWND,WM\
后消息(FHWND,WM\u SYNC\u PROGRESS,0,0)
WM_SYNC_PROGRESS是WM_USER+111,没有其他WM_SYNC_PROGRESS处理程序。 [当为句柄传递NULL时,它不是指变量NULL,而是指值
0
]:
该函数的行为类似于使用
dwThreadId参数设置为当前线程的标识符
因此,将消息发布到0
,有着独特的意义,如果您真的想让消息被遗忘,您不应该只允许这样做。如果是这种情况,您最好检查句柄是否为0
,而不要发布消息
但请注意,即使在非可视化应用程序中,创建窗口也是完全合法的。这样的句柄用于向发送消息。它们不一定指向可见的窗口。事实上,这正是我们的目的。它用于非可视控件(如TTimer),毕竟这些控件需要能够接收消息。
[当为句柄传递NULL时,它不是指变量NULL,而是指值0
]:
该函数的行为类似于使用
dwThreadId参数设置为当前线程的标识符
因此,将消息发布到0
,有着独特的意义,如果您真的想让消息被遗忘,您不应该只允许这样做。如果是这种情况,您最好检查句柄是否为0
,而不要发布消息
但请注意,即使在非可视化应用程序中,创建窗口也是完全合法的。这样的句柄用于向发送消息。它们不一定指向可见的窗口。事实上,这正是我们的目的。它用于非可视控件(如TTimer),毕竟这些控件需要能够接收消息。您可能需要创建自己的包装函数来实现这一点,而不是在代码中的多个位置放置大量ifs。您可能需要创建自己的包装函数来实现这一点,而不是在代码中的多个位置放置大量ifs。
{$IFNDEF TTNONVISUAL}
FHWND := AllocateHWND(WindProc);
{$ELSE}
FHWND := 0;
{$ENDIF}