gpt4 book ai didi

windows - 为什么在 MouseMove 事件中调用 WindowFromPoint 时窗体的系统按钮会突出显示?

转载 作者:可可西里 更新时间:2023-11-01 14:13:51 25 4
gpt4 key购买 nike

在 TWinControl 的 MouseMove 事件中调用 WindowFromPoint 会在传递给 WindowFromPoint 的点处引发 MouseOver 事件。这是 VCL 错误吗?有人知道是否有解决方法吗?

enter image description here

这是演示代码:

unit Unit7;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
TForm7 = class(TForm)
Button1: TButton;
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
WindowFromPoint(Point(Mouse.CursorPos.X, Mouse.CursorPos.Y - 40));
end;

end.

数据流管理:

object Form7: TForm7
Left = 0
Top = 0
Caption = 'Form7'
ClientHeight = 40
ClientWidth = 116
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 24
Top = 7
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnMouseMove = Button1MouseMove
end
end

我在 Windows 7 Pro 64 位上使用 Delphi XE2。我也可以使用 Delphi 7 进行重现。

最佳答案

我用一个最简单的 C++ 应用程序对此进行了测试,并观察到相同的行为,这不是 VCL 错误(正如 David 在评论中提到的那样)。它与鼠标移动无关 顺便说一句,只要您调用 WindowFromPoint 并传递标题按钮的坐标,就会出现异常情况。它只发生在属于调用该函数的线程的窗口上。

因此,作为解决方法,您可以从线程调用 WindowFromPoint。下面的简单示例,并不是真正的后台线程,因为代码正在等待它完成:

type
TGetWndThread = class(TThread)
private
FPoint: TPoint;
protected
procedure Execute; override;
constructor Create(AOwner: TComponent; Point: TPoint);
end;

constructor TGetWndThread.Create(AOwner: TComponent; Point: TPoint);
begin
FPoint := Point;
inherited Create;
end;

procedure TGetWndThread.Execute;
begin
ReturnValue := WindowFromPoint(FPoint);
end;

..

var
Wnd: HWND;
Thr: TGetWndThread;
begin
Thr := TGetWndThread.Create(nil, Point(Mouse.CursorPos.X, Mouse.CursorPos.Y - 40));
Wnd := Thr.WaitFor;
Thr.Free;
.. // use Wnd


测试错误显示的条件(操作系统、主题......)并使代码有条件以避免不必要的开销是有意义的。

关于windows - 为什么在 MouseMove 事件中调用 WindowFromPoint 时窗体的系统按钮会突出显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13915160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com