Проблема эмуляции щелчка мышью при сворачивании приложения - PullRequest
1 голос
/ 06 марта 2020

У меня есть приложение с компонентом TWebBrowser на главной форме.

Мне нужно эмулировать щелчки в окне TWebBrowser, и я использую для этого Windows сообщения.

Я отправляю WM_MOUSEMOVE, WM_SETCURSOR, WM_LBUTTONDOWN, WM_MOUSEACTIVATE, WM_LBUTTONUP и это нормально работает, когда приложение находится в нормальном состоянии, браузер работает так же, как при реальном щелчке мыши.

Также это прекрасно работает, когда приложение находится в свернутом состоянии

Но в в момент минимизации или восстановления приложения браузер не реагирует на нажатия, и я пропустил клики (это важно для моего приложения)

Что не так с сообщениями в момент минимизации / восстановления приложения?

Или

Возможно ли обнаружить, что приложение находится в состоянии минимизации / восстановления сейчас?

1 Ответ

0 голосов
/ 10 марта 2020

У меня есть приложение, которое я написал, которое имитирует нажатие Windows. Приведенный ниже код не является полной программой, но должен помочь вам симулировать щелчок. На самом деле я использовал IdThreadComponent для создания моего вместо Timer, но у меня был слишком длинный код для демонстрации этого кода.

Проблема с вашим методом связана с windows системой обмена сообщениями. Приведенный ниже код создаст «реальные щелчки мышью» вместо смоделированных. Чем выше ваш приоритетный класс вашего приложения, тем более надежным будет нажатие.

Возможно, вам потребуется запустить программу «Запуск от имени администратора», но не уверен. Если это не работает, попробуйте посмотреть, помогает ли запуск в Администраторе?

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

Вот часть кода, который я извлек из Программа, которую я написал для симуляции кликов:

uses
  Winapi.Windows

var
  P: TPoint; // Global variable

procedure TForm1.SetPriorityLevel(P: byte);
begin
  case p of
  1: Setpriorityclass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
  2: Setpriorityclass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
  3: Setpriorityclass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
  4: Setpriorityclass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  eu: array [0..1] of TInput;
begin
    SetCursorPos(P.X,P.Y);

    ZeroMemory(@eu,sizeof(eu));

    eu[0].Itype := INPUT_MOUSE;
    eu[0].mi.dwFlags := MOUSEEVENTF_LEFTDOWN;

    eu[1].Itype := INPUT_MOUSE;
    eu[1].mi.dwFlags :=MOUSEEVENTF_LEFTUP;

    if SendInput(2,eu[0],sizeof(TInput)) > 0 then
    begin
        inc(ClickCount);
    end
    else
    begin
      Label1.Caption := 'SendInput Failed..Sleeping';
      sleep(50);
    end;
end;

Пожалуйста, дайте мне знать, если у вас есть другие вопросы.

Более подробную информацию о SendInput можно найти здесь: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput и здесь: https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-mouseinput

...