automation - studio - ¿Puede Inno Setup enviar pulsaciones de teclas y mouse, si no es así, cómo se puede hacer con un instalador?
inno setup descargar (2)
La mejor apuesta para esto es usar la API SendInput()
desde una DLL que luego llama desde Inno Setup. Esto permitirá el control total de todo lo que puede hacer manualmente en esa aplicación.
Soy novato de los instaladores de [Microsoft Windows] y de Inno Setup, pero necesito saber si se puede usar Inno Setup (o un equivalente) para automatizar la entrada a un programa de Windows basado en GUI, durante la instalación, por ejemplo, haciendo clic en un menú y seleccionando un subtema, por ejemplo?
Soy consciente de AutoIt y AutoHotkey , así como de NSIS , sin embargo, Inno Setup es altamente recomendado como instalador / creador de software, y también me gusta la idea de aprender un poco de programación de Pascal;)
Cualquier idea o pensamiento es bienvenido :-)
Estoy de acuerdo con @Deanna, la función SendInput
es la mejor para simular la entrada del usuario que puede obtener. En el siguiente script, he mostrado cómo simular clics del mouse en la posición absoluta de la pantalla (en píxeles). Como ejemplo, estoy tratando de mostrar el cuadro de Inno Setup a través del elemento de menú Help / About Inno Setup (si tiene la misma configuración de pantalla que yo y maximiza el Inno Setup IDE, incluso puede llegar a ese elemento del menú. aquí solo está la parte del mouse (y solo se puede obtener una funcionalidad limitada). Tómelo como una prueba, que es posible simular la entrada del usuario desde 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 ''[email protected] stdcall'';
function SendMouseInput(nInputs: UINT; pInputs: TMouseInput;
cbSize: Integer): UINT;
external ''[email protected] 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;