【问题标题】:Mouse click emulation problem when minimizing the application最小化应用程序时鼠标单击仿真问题
【发布时间】:2020-03-06 14:37:05
【问题描述】:

我在主窗体上有带有 TWebBrowser 组件的应用程序。

我需要模拟 TWebBrowser 窗口中的点击,为此我使用 Windows 消息。

我发送 WM_MOUSEMOVE、WM_SETCURSOR、WM_LBUTTONDOWN、WM_MOUSEACTIVATE、WM_LBUTTONUP,当应用程序处于正常状态时,它工作正常,浏览器就像真正的鼠标点击一样。

当应用程序处于最小化状态时,这也可以正常工作

但在应用程序最小化或恢复时,浏览器不会对点击做出反应,我错过了点击(这对我的应用至关重要)

在应用程序最小化/恢复时消息有什么问题?

或者

这是否可以检测到应用程序现在处于最小化/恢复状态?

【问题讨论】:

    标签: delphi mouse windows-messages


    【解决方案1】:

    我编写了一个模拟在 Windows 中单击的应用程序。下面的代码不是一个完整的程序,但应该可以帮助您模拟点击。我实际上使用 IdThreadComponent 来创建我的而不是 Timer,但是我的代码太长了,无法演示此代码。

    您的方法的问题取决于 Windows 消息传递系统。下面的代码将创建“实际鼠标点击”而不是模拟。您的应用程序的优先级越高,点击就越可靠。

    您可能需要运行程序“以管理员身份运行”,但不确定。如果还是不行,试试用Administrator运行有没有帮助?

    您可能还想将您的应用程序设置为更高的优先级。

    这是我从我为模拟点击而编写的程序中提取的一些代码:

    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

    【讨论】:

    • 感谢您的回答,但程序应该在最小化状态下运行,并且不会干扰用户。所以我需要在不改变实际光标位置的情况下进行精确仿真......
    • 您是使用 FindWindow 来获取应用程序的句柄还是??
    • 这里的答案不在 Delphi 中,但应该对您有所帮助:stackoverflow.com/questions/10279812/…
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2019-10-20
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多