0

現在、Hyper-V によってホストされている VM 用のWPF C#で小さな RDP クライアントを作成することに専念しています。このクライアントには管理機能がまったくないはずなので、接続するだけでマシンを使用できます。そのため、VM の停止/開始などのオプションはありません。

コントロールの使用: AxMSTSCLib.AxMsRdpClient7NotSafeForScripting は実行時に初期化され、WindowsFormsHost に配置されます。

問題は次のとおりです。

1) 私はうそをつきました。可能なはずの機能が 1 つあります: Ctrl + Alt + Del の送信です。もちろん、クライアントにこのボタンを作成しました。いくつかの可能性を試しましたが、それぞれで失敗しました。単一の「A」を VM に送信することさえできません。

私が試した可能性:

a) user32.dll からの SendInput ネイティブ コールによるキーボード シミュレーション

  • SendKeystroke 'control, alt and something other' を実行してから VM に移動し、たとえば F を押すと、control + F コマンドがトリガーされました。または、複数のファイルの選択を開始することもできます (シフトなど)。
  • それ以外に、コントロールの詳細設定/セキュア設定でいくつかのプロパティをオンまたはオフに設定しようとしました

したがって、キーがトリガーされていないという何か間違ったことをしていない限り、この方法は失敗します


b) InputManager の使用

PresentationSource source = PresentationSource.FromVisual(this);
KeyEventArgs insertStuff = new KeyEventArgs(Keyboard.PrimaryDevice, source, 0, Key.D0);
insertStuff.RoutedEvent = UIElement.KeyDownEvent;
InputManager.Current.ProcessInput(insertStuff);

これはwindowsformhostが配置されているユーザーコントロールです。これをthis.winformshostに置き換えてみましたが、運もありません


c) 別の方法を試しましたが、失敗して忘れてしまいました。とにかくあまりきれいではありませんでした。


2) 2 つ目の問題はフォーカスです。より正確には、アプリケーションが VM 内で起動されたときのフォーカスです。

詳細に説明します。開発者のマシンでは何も問題はありません。しかし、RDP 内から仮想マシン ( A ) にアプリケーションを起動して、ツールを使用して別の仮想マシン ( B ) に接続すると、大きな問題が発生します。マシンBが初めて表示されるRDP コントロール内を 1 回クリックすると、アプリケーション全体が動かなくなります。スタックを解除する唯一の方法は、たとえばマシンBで Windows のスタート キーをクリックしてからクライアント ツールに戻ることです。

コントロールにフォーカスの問題があることがわかりましたが、次はこれを解決できませんでした (基本クラスとして ax コントロールを持つ新しいクラスを作成しました):

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    //Fix for the missing focus issue on the rdp client component
    if (m.Msg == 0x0021)
    {
        this.Focus();
    }
    base.WndProc(ref m);
}

誰かがこれを手伝うことができれば、私は間違いなく感謝します!

敬具!

4

1 に答える 1

1
 protected override void WndProc(ref Message m)
         {
             switch (m.Msg)
             {
                 case 0x021:
                     {
                         Message mm = new Message();
                         mm.Msg = 0x007;
                         base.WndProc(ref mm);
                     }
                     break;
             }
             base.WndProc(ref m);
         }
于 2013-04-19T05:41:27.060 に答える