Automation Inno Setup是否可以发送按键和鼠标按键,如果不能,如何使用安装程序完成?

Automation Inno Setup是否可以发送按键和鼠标按键,如果不能,如何使用安装程序完成?,automation,inno-setup,autohotkey,nsis,Automation,Inno Setup,Autohotkey,Nsis,我是[Microsoft Windows]安装程序的新手,但我需要知道,在安装过程中,是否可以使用Inno安装程序(或等效程序)来自动输入基于GUI的Windows程序,例如,单击菜单并选择子项 我知道和,但是强烈推荐Inno安装程序作为软件打包/安装程序,我也喜欢学习一点Pascal编程的想法 任何想法都是最受欢迎的:-)最好的选择是使用DLL中的SendInput()API,然后从Inno安装程序调用该API。 这将允许完全控制您可以在该应用程序中手动执行的所有操作。最好的方法是从DLL使用

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

我知道和,但是强烈推荐Inno安装程序作为软件打包/安装程序,我也喜欢学习一点Pascal编程的想法


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

最好的选择是使用DLL中的
SendInput()
API,然后从Inno安装程序调用该API。
这将允许完全控制您可以在该应用程序中手动执行的所有操作。

最好的方法是从DLL使用
SendInput()
API,然后从Inno安装程序调用该DLL。 这将允许您完全控制在该应用程序中手动执行的所有操作。

我同意@Deanna的观点,该功能是模拟用户输入的最佳功能。在下面的脚本中,我演示了如何模拟鼠标在绝对屏幕位置上的点击(以像素为单位)。举个例子,我试图通过Help/about Inno Setup菜单项来显示Inno Setup的about框(如果您的屏幕设置与我相同,并且使Inno Setup IDE最大化,它甚至可能会点击该菜单项。因此,这里只是鼠标部分(并且您只能获得有限的功能)。将其作为证据,证明可以从Inno设置模拟用户输入:

[设置]
AppName=我的程序
AppVersion=1.5
DefaultDirName={pf}\My程序
OutputDir=userdocs:Inno设置示例输出
[守则]
常数
SM_CXSCREEN=0;
SM_CYSCREEN=1;
输入\鼠标=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_绝对值=8000美元;
类型
TMouseInput=记录
类型:DWORD;
dx:Longint;
dy:Longint;
穆塞达塔:德沃德;
德沃德;
时间:德沃德,;
dwextranfo:DWORD;
终止
函数GetSystemMetrics(nIndex:Integer):整数;
外部的GetSystemMetrics@user32.dllstdcall';
函数SendMouseInput(nInputs:UINT;pInputs:TMouseInput;
cbSize:Integer):UINT;
外部的SendInput@user32.dllstdcall';
函数SendMouseClick(按钮:TMouseButton;X,Y:整数):布尔;
变量
旗帜:德沃德,;
输入:TMouseInput;
屏幕宽度:整数;
屏幕高度:整数;
开始
结果:=假;
标志:=MOUSEEVENTF_绝对或MOUSEEVENTF_虚拟任务或MOUSEEVENTF_移动;
屏幕宽度:=GetSystemMetrics(SM_CXSCREEN);
屏幕高度:=GetSystemMetrics(SM_CYSCREEN);
Input.Itype:=输入\鼠标;
Input.dx:=圆形((X*65536)/屏幕宽度);
Input.dy:=圆形((Y*65536)/屏幕高度);
箱子按钮
mbLeft:Input.dwFlags:=Flags或MOUSEEVENTF_LEFTDOWN;
mbRight:Input.dwFlags:=Flags或MOUSEEVENTF_RIGHTDOWN;
mbMiddle:Input.dwFlags:=Flags或MOUSEEVENTF_MIDDLEDOWN;
终止
结果:=SendMouseInput(1,输入,SizeOf(输入))=1;
如果结果是这样的话
开始
Input.Itype:=输入\鼠标;
Input.dx:=圆形((X*65536)/屏幕宽度);
Input.dy:=圆形((Y*65536)/屏幕高度);
箱子按钮
mbLeft:Input.dwFlags:=Flags或MOUSEEVENTF_LEFTUP;
mbRight:Input.dwFlags:=Flags或MOUSEEVENTF_RIGHTUP;
mbMiddle:Input.dwFlags:=Flags或MOUSEEVENTF\u MIDDLEUP;
终止
结果:=SendMouseInput(1,输入,SizeOf(输入))=1;
终止
终止
程序初始化;
开始
如果MsgBox('您确定要让安装程序单击'+
“你屏幕上的某个地方?特拉玛警告过你:-)”,mb确认,
那就是田园诗了
开始
如果未发送鼠标单击(mbLeft,242,31),则
MsgBox(syserromessage(DLLGetLastError),mbError,mb_Ok);
如果不发送鼠标单击(mbLeft,382263),则
MsgBox(syserromessage(DLLGetLastError),mbError,mb_Ok);
终止
终止
我同意@Deanna的观点,该功能是模拟用户输入的最佳功能。在下面的脚本中,我演示了如何模拟鼠标在绝对屏幕位置上的点击(以像素为单位)。举个例子,我试图通过Help/about Inno Setup菜单项来显示Inno Setup的about框(如果您的屏幕设置与我相同,并且使Inno Setup IDE最大化,它甚至可能会点击该菜单项。因此,这里只是鼠标部分(并且您只能获得有限的功能)。将其作为证据,证明可以从Inno设置模拟用户输入:

[设置]
AppName=我的程序
AppVersion=1.5
DefaultDirName={pf}\My程序
OutputDir=userdocs:Inno设置示例输出
[守则]
常数
SM_CXSCREEN=0;
SM_CYSCREEN=1;
输入\鼠标=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_绝对值=8000美元;
类型
TMouseInput=记录
类型:DWORD;
dx:Longint;
dy:Longint;
穆塞达塔:德沃德;
德沃德;
时间:德沃德,;
dwextranfo:DWORD;
终止
函数GetSystemMetrics(nIndex:Integer):整数;
外部的GetSystemMetrics@user32.dllstdcall';
函数SendMouseInput(nInputs:UINT;pInputs:TMouseInput;
cbSize:Integer):UINT;
外部的SendInput@user32.dllstdcall';
函数SendMouseClick(按钮:TMouseButton;X,Y:整数):布尔;
变量
旗帜:德沃德,;
输入:TMouseInput;
屏幕宽度:整数;
屏幕高度:整数;
开始
结果:=假;
标志:=MOUSEEVENTF_绝对或MOUSEEVENTF_虚拟任务或MOUSEEVENTF_移动;
屏幕宽度:=GetSystemMetrics(SM_CXSCREEN);
屏幕高度:=GetSystemMetrics(SM_CYSCREEN);
输入