Почему симулированный щелчок мыши (с помощью mouse_event) работает только на выбранных компонентах? - PullRequest
0 голосов
/ 14 июля 2010

У меня есть несколько курсоров (которые на самом деле являются формами), которыми можно управлять с помощью соответствующей мыши. (1 курсор для 1 пользователя).

Я использую SetCursorPos, чтобы поместить курсор по умолчанию (исходный системный курсор) в положение, которое не будет отвлекать фокус от моего приложения, и использовать ShowCursor(false), чтобы скрыть его.

У меня есть класс, который получает указатель мыши и координаты .

Когда пользователь нажимает, я использую SetCursorPos и mouse_event для имитации щелчков в этой конкретной позиции.

Мои смоделированные щелчки мыши работают только с событием OnClick определенных компонентов (это должны были быть только кнопки и метки, но я экспериментировал с вещами в своем проекте, просто чтобы знать, что будет или не будет работать):

Работает на:

  • Кнопки (TButton, TBitBtn, TAdvSmoothButton)
  • TAdvGrid
  • TMenuItem (но прямой потомок только для TMainMenu)
  • TRadioButton

Не работает на:

  • TLabel
  • Панели (TPanel, TAdvSmoothPanel)
  • TCoolBar
  • TMenuItem (не прямой потомок TMainMenu)

Это мой код:

 SetCursorPos(currentX , currentY);
 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

Почему он не работает на некоторых компонентах? Есть ли обходной путь (потому что я хотел бы иметь возможность нажимать на ярлыки, используя mouse_event).

EDIT: Я попытался проверить, действительно ли была вызвана функция щелчка, поэтому я поставил ShowMessage('clicked'); перед SetCursorPos и ​​mouse_event ... но странным образом все (незначительное редактирование: все, кроме MenuItems) теперь работает нормально (за исключением того факта, что у меня появляется сообщение каждый раз, когда я пытаюсь что-то щелкнуть). У кого-нибудь есть идея, почему так себя ведет?

Ответы [ 3 ]

3 голосов
/ 14 июля 2010

mouse_event фактически устарела, вместо этого вы должны использовать SendInput , посмотрите, исправляет ли это что-нибудь (я бы также предложил сделать так, чтобы мышь переместила входное сообщение, используя SetCursorPos), также, если вы делаете это конкретное приложение, PostMessage может быть намного лучшей и простой альтернативой

2 голосов
/ 14 июля 2010

Кажется, здесь работает;

procedure TForm1.Panel1Click(Sender: TObject);
begin
  ShowMessage('Click');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Pt: TPoint;
begin
  Pt := Panel1.ClientToScreen(Point(0, 0));
  SetCursorPos(Pt.x, Pt.y);
//  SetCursorPos(Panel1.ClientOrigin.x, Panel1.ClientOrigin.y);
  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;

или без SetCursorPos;

procedure TForm1.Button1Click(Sender: TObject);
var
  Pt: TPoint;
begin
  Pt := Panel1.ClientToScreen(Point(0, 0));
  Pt.x := Round(((Pt.x + 1) * 65535) / Screen.Width);
  Pt.y := Round(((Pt.y + 1) * 65535) / Screen.Height);
  mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTDOWN,
      Pt.x, Pt.y, 0, 0);
  mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTUP,
      Pt.x, Pt.y, 0, 0);
end;
1 голос
/ 14 июля 2010

Сейчас он работает случайно, эти компоненты, вероятно, захватили мышь. Вам необходимо передать координаты указателя мыши во 2-й и 3-й аргументы. Таким образом:

 //SetCursorPos(currentX , currentY);
 mouse_event(MOUSEEVENTF_LEFTDOWN, currentX, currentY, 0, 0);
 mouse_event(MOUSEEVENTF_LEFTUP, currentX, currentY, 0, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...