首页 文章

Inno Setup可以发送按键和鼠标按键,如果没有,如何使用安装程序完成?

提问于
浏览
3

我是[Microsoft Windows]安装程序和Inno Setup的新手,但我需要知道在安装过程中是否可以使用Inno Setup(或等效设备)自动输入基于GUI的Windows程序,例如例如,通过单击菜单并选择子项?

我知道AutoItAutoHotkey,以及NSIS,但是Inno Setup强烈推荐作为软件打包器/安装程序,我也喜欢学习一点Pascal编程的想法,讨价还价;)

任何想法或想法都是最受欢迎的:-)

2 回答

  • 1

    我同意@Deanna,SendInput函数是模拟用户输入的最佳选择 . 在下面的脚本中,我试图通过“帮助/关于Inno设置”菜单项显示Inno Setup的关于框(如果你有与我相同的屏幕设置并且Inno Setup IDE最大化,它甚至可以点击该菜单项 . 所以这里's just the mouse part (and only limited functionality you can get). Take it rather as a proof, that it'可以模拟Inno Setup的用户输入:

    [Setup]
    AppName=My Program
    AppVersion=1.5
    DefaultDirName={pf}\My Program
    OutputDir=userdocs:Inno Setup Examples Output
    
    [code]
    const
      SM_CXSCREEN = 0;
      SM_CYSCREEN = 1;
      INPUT_MOUSE = 0;
      MOUSEEVENTF_MOVE = $0001;
      MOUSEEVENTF_LEFTDOWN = $0002;
      MOUSEEVENTF_LEFTUP = $0004;
      MOUSEEVENTF_RIGHTDOWN = $0008;
      MOUSEEVENTF_RIGHTUP = $0010;
      MOUSEEVENTF_MIDDLEDOWN = $0020;
      MOUSEEVENTF_MIDDLEUP = $0040;
      MOUSEEVENTF_VIRTUALDESK = $4000;
      MOUSEEVENTF_ABSOLUTE = $8000;
    type
      TMouseInput = record
        Itype: DWORD;    
        dx: Longint;
        dy: Longint;
        mouseData: DWORD;
        dwFlags: DWORD;
        time: DWORD;
        dwExtraInfo: DWORD;
      end;
    
    function GetSystemMetrics(nIndex: Integer): Integer;
      external 'GetSystemMetrics@user32.dll stdcall';
    function SendMouseInput(nInputs: UINT; pInputs: TMouseInput;
      cbSize: Integer): UINT; 
      external 'SendInput@user32.dll stdcall';
    
    function SendMouseClick(Button: TMouseButton; X, Y: Integer): Boolean;
    var
      Flags: DWORD;
      Input: TMouseInput;
      ScreenWidth: Integer;
      ScreenHeight: Integer;
    begin
      Result := False;
      Flags := MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_VIRTUALDESK or MOUSEEVENTF_MOVE;
      ScreenWidth := GetSystemMetrics(SM_CXSCREEN);
      ScreenHeight := GetSystemMetrics(SM_CYSCREEN);
    
      Input.Itype := INPUT_MOUSE;
      Input.dx := Round((X * 65536) / ScreenWidth);
      Input.dy := Round((Y * 65536) / ScreenHeight);
      case Button of
        mbLeft: Input.dwFlags := Flags or MOUSEEVENTF_LEFTDOWN;
        mbRight: Input.dwFlags := Flags or MOUSEEVENTF_RIGHTDOWN;
        mbMiddle: Input.dwFlags := Flags or MOUSEEVENTF_MIDDLEDOWN;
      end;  
      Result := SendMouseInput(1, Input, SizeOf(Input)) = 1;
    
      if Result then
      begin
        Input.Itype := INPUT_MOUSE;
        Input.dx := Round((X * 65536) / ScreenWidth);
        Input.dy := Round((Y * 65536) / ScreenHeight);
        case Button of
          mbLeft: Input.dwFlags := Flags or MOUSEEVENTF_LEFTUP;
          mbRight: Input.dwFlags := Flags or MOUSEEVENTF_RIGHTUP;
          mbMiddle: Input.dwFlags := Flags or MOUSEEVENTF_MIDDLEUP;
        end;    
        Result := SendMouseInput(1, Input, SizeOf(Input)) = 1;
      end;
    end;
    
    procedure InitializeWizard;
    begin
      if MsgBox('Are you sure you want to let the installer click ' +
        'somewhere on your screen ? TLama warned you :-)', mbConfirmation, 
        MB_YESNO) = IDYES then
      begin
        if not SendMouseClick(mbLeft, 242, 31) then 
          MsgBox(SysErrorMessage(DLLGetLastError), mbError, mb_Ok);
        if not SendMouseClick(mbLeft, 382, 263) then 
          MsgBox(SysErrorMessage(DLLGetLastError), mbError, mb_Ok);
      end;
    end;
    
  • 3

    最好的办法是使用您从Inno Setup调用的DLL中的 SendInput() API . 这将允许完全控制您在该应用程序中手动执行的所有操作 .

相关问题