Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибки VCL: Неожиданное выделение системных кнопок в Delphi при событии MouseMove

Delphi , ОС и Железо , Windows

Вопрос, который возник у пользователя, связан с неожиданным поведением системных кнопок в среде разработки Delphi. При вызове функции WindowFromPoint в событии MouseMove компонента TWinControl происходит выделение системных кнопок, что является нежелательным поведением, особенно если разработчик реализует собственную логику перетаскивания вкладок, как в случае с TChromeTabs.

Описание проблемы

При использовании функции WindowFromPoint в обработчике события MouseMove компонента Button1, который является потомком TWinControl, наблюдается некорректное выделение системных кнопок окна. Это выделение происходит независимо от движения мыши и зависит от положения курсора относительно системных кнопок. Проявляется данная проблема в средах разработки Delphi XE2 и Delphi 7 на операционной системе Windows 7 Professional 64-bit.

Пример кода

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
  public
  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.

Возможное решение

Исследования показали, что проблема не связана с VCL, так как аналогичное поведение наблюдается и в простом C++ приложении. Ошибка заключается в том, что вызов 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;
  // использование Wnd
end

Альтернативные пути решения

Также было предложено протестировать условия, при которых проявляется данная ошибка (например, операционная система, темы оформления) и сделать код условным, чтобы избежать ненужного нагрузочного вызова где это возможно.

Дополнительные вопросы

Пользователь также интересуется, возможно ли полностью отключить эффект выделения системных кнопок. Это может быть полезно в ситуациях, когда реализуется собственная логика перетаскивания вкладок. Возможно, стоит задать отдельный вопрос по этой проблеме.


В данной статье рассмотрены причины неожиданного выделения системных кнопок в среде разработки Delphi и предложены возможные пути решения этой проблемы. Приведенный пример кода на Object Pascal демонстрирует, как можно обработать эту проблему, используя отдельный поток для выполнения функции WindowFromPoint.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой, когда при разработке приложения в Delphi в событии `MouseMove` происходит нежелательное выделение системных кнопок окна, что мешает реализации собственной логики перетаскивания элементов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:59:16/0.0035929679870605/0