0

RealVNCクライアントを介した自動ログインのプロジェクトを行っています。私はLANを持っていて、多くのPCでこのクライアントを使ってそのような手順を実行するのは退屈です。そこで、プロセスを自動化することにしました。プログラムでVNCクライアントを開き(CreateProcessを使用)、接続用の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;

この手順では、vncauthを要求するウィンドウを検索します。そこで、ウィンドウ内で[編集]を検索して、パスワードを送信します。問題は、このウィンドウには2つの編集があります。1つはユーザー用(無効)、もう1つはパス用(これが私の焦点です)ですが、パスはユーザーの編集にしか書き込むことができません。正しい編集のハンドルを取得するにはどうすればよいですか?それらは同じウィンドウにあり、同じクラスの「編集」からのものです...何が起こるかのスクリーンショットの下に: ここに画像の説明を入力してください

4

2 に答える 2

2

あなたはそれを必要以上に難しくしています。RealVNCには、対話を必要とせずに接続できる機能がすでに備わっています。必要なオプションを含むテキストファイルを作成し、起動時にRealVNCビューアプログラムに渡すだけです。

テキストファイルは次のようになります。

[繋がり]
Host = myhost.com :: 666
暗号化=AlwaysOn
ユーザー名=ドメイン\ユーザー
パスワード=**********
【オプション】
...。

接続を開き、RealVNCメニューを表示して(つまり、F8を使用して)、[接続の保存]を選択すると、RealVNCにファイルを作成させることができます。これにより、その接続のすべての設定を含む.vncファイルが保存されます。起動時にその.vncファイルをビューアプログラムに渡すだけで、すべて問題ありません。

したがって、あなたがする必要があるのは:

  1. .vnc接続ファイルを作成します。
  2. コマンドラインをに変更し'vnc.exe connection.vnc'ます。
  3. を呼び出した後、すべてのコードを削除しますCreateProcess
  4. CloseHandleによって返される2つのハンドルを呼び出しCreateProcessます。

あなたのニーズのために、私は電話ShellExecuteがおそらくより簡単であることを提案しますCreateProcess

于 2012-11-19T19:45:29.440 に答える
1

サーバーとクライアントの両方にUltraVncdll(元のc ++ソースから)を作成しました。多分これはあなたを助けることができますか? http://code.google.com/p/asmprofiler/source/browse/trunk/-Other-/UltraVnc+As+Dll/?r=294

于 2012-11-20T06:56:15.743 に答える