我正在做一个通过 Real VNC 客户端自动登录的项目。我有一个局域网,并且在许多电脑上用这个客户端做这样的程序很无聊。所以我决定自动化这个过程。我用我的程序(使用 CreateProcess)打开 VNC 客户端,并将用于连接的 IP 作为参数传递。我现在的意图是发送该机器的密码并模拟 [enter],我被困在这一步。我将用下面的代码更好地解释:
procedure TForm1.VncAuth;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
FillChar(StartInfo,SizeOf(TStartupInfo),#0);
FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
StartInfo.cb := SizeOf(TStartupInfo);
CmdLine:= 'vnc.exe 192.168.1.14';
UniqueString(CmdLine);
CreateProcess(NIL ,PChar(CmdLine), NIL, NIL, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
, NIL, NIL, StartInfo, ProcInfo);
WaitForInputIdle(ProcInfo.hProcess, INFINITE);
Timer:= TTimer.Create(Nil);
Timer.Interval:= 5000;
Timer.OnTimer:= DoVNCAuth;
Timer.Enabled:= true;
end;
好的,上面的程序打开vnc.exe并传递IP进行连接。所以我等了 5 秒,是时候连接到 IP 和 vnc 询问密码,5 秒后我进入程序 DoVNCAuth。就像这样:
procedure TForm1.DoVNCAuth(Sender: TObject);
var
pass: string;
begin
pass:= 'password';
VNCChild:= FindWindowEx(0, 0, Nil, 'VNC Viewer - Authentication');
if VNCChild > 0 then
begin
VNCHandle:= FindWindowEx(VNCChild, 0, 'Edit', 0);
SendMessage(VNCHandle, WM_SETTEXT, 0, Integer(PChar(pass)));
end;
end;
此过程中,搜索要求 vnc auth 的窗口。所以我在窗口内搜索编辑并发送我的密码。问题是:这个窗口有 2 个编辑,一个用于用户(禁用)和一个用于通行证(这是我的焦点),但我只能将我的通行证写入用户的编辑。如何获得正确编辑的句柄?它们在同一个窗口中,并且来自同一个“编辑”类......下面是所发生情况的屏幕截图: