У меня есть приложение, которое я написал, которое имитирует нажатие 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