我注意到当光标位于标题栏内(而不是边框上)时,消息WM_NCHitTest不会发送到表单。
我试图用
拦截它procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
或
procedure WndProc(var Message: TMessage); override;
根据MSDN,我希望能在任何时候收到它,没有盲点。
我是否遗漏了某些内容或这是预期的行为?
我在Windows 7上使用Delphi 2010,Aero on。
答案 0 :(得分:4)
是的 - 这是预期的。除非您禁用DWM,否则当光标位于标题栏中时,您将不会收到WM_NCHITTEST消息。基本上,当DWM打开时,标题栏“属于”DWM,而不是您的应用程序。
如果您真的需要这些消息,可以禁用DWM - 但请记住,当/如果您这样做,它不只是为您的应用程序禁用它。如果你禁用它,它将被禁用整个系统(当然,它会再次重新启用)。
答案 1 :(得分:0)
您可以收听另一条消息...请参阅http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/9a8a63c8-79b5-43a8-82eb-f659be947add
答案 2 :(得分:0)
您始终可以使用 WM_NCMOUSEMOVE
消息并测试其 HitTest
属性:
procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE;
[...]
procedure TForm11.WMNCMouseMove(var Message: TWMNCMouseMove);
begin
with Message do
if HitTest = HTCAPTION then
Caption := Format('%d:%d',[XCursor,YCursor]);
end;