2010-09-02 7 views
1

J'ai remarqué que le message WM_NCHitTest n'est pas envoyé à un formulaire lorsque le curseur se trouve dans la barre de légende (pas sur la bordure).Ne pas recevoir WM_NCHitTest sur la barre de titre

J'ai essayé de l'intercepter en utilisant soit

procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; 

ou

procedure WndProc(var Message: TMessage); override; 

Selon MSDN, je comptais le recevoir pour tout point, sans angles morts.

Est-ce que j'ai manqué quelque chose ou est-ce le comportement voulu? J'utilise Delphi 2010 sous Windows 7, avec Aero sur

+0

Oui, c'est supposé travail. Post réel code de repro. –

Répondre

4

Oui - c'est prévu. Sauf si vous désactivez le DWM, vous n'obtiendrez pas les messages WM_NCHITTEST lorsque le curseur se trouve dans la barre de titre. Fondamentalement, lorsque le DWM est activé, la barre de titre "appartient" au DWM, pas votre application.

Si vous avez vraiment besoin de ces messages, vous pouvez désactiver le DWM - mais gardez à l'esprit que lorsque/si vous faites cela, il ne le désactive pas pour votre application. Si vous le désactivez, il est désactivé pour tout le système (jusqu'à ce qu'il soit à nouveau réactivé, bien sûr).

0

Vous pouvez toujours utiliser le WM_NCMOUSEMOVE un message et test pour son HitTest propriété:

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; 
Questions connexes