Member 13586846 Ответов: 0

Обработка диалогового окна MSTSCLIB с помощью C#


Привет ребята,

Я написал простое приложение, протокол RDP с помощью C#, я через MSTSCLIB. Это прекрасно работает для меня.

//hide form border
    this.FormBorderStyle = FormBorderStyle.None;

    //server and username
    rdp.Server = "*********";
    rdp.UserName = "*********";

    //password
    IMsTscNonScriptable secured = (IMsTscNonScriptable)rdp.GetOcx();
    secured.ClearTextPassword = "***********";

    //resolution
    rdp.DesktopHeight = 1080;
    rdp.DesktopWidth = 1920;

    //rdp  options
    rdp.AdvancedSettings8.AuthenticationLevel = 2;

    //connect
    rdp.Connect();


Иногда пользователь уже вошел в систему на удаленной рабочей станции, и я получаю диалоговое окно Windows "указанная учетная запись Windows уже вошла в систему. ...".

Мне нужна помощь с решением, чтобы автоматически подтвердить этот диалог Windows.

Что я уже пробовал:

Поэтому первая идея состояла в том, чтобы установить приложение на переднем плане:

//Set window as foreground window
                Process processes = Process.GetCurrentProcess();

                //MessageBox.Show(processes.ProcessName);
                
                IntPtr windowhandle = processes.MainWindowHandle;
                SetForegroundWindow(windowhandle);


И второй шаг-получить идентификатор дескриптора windows с помощью spy++ и использовать FindWindow() для использования SendMessage (), чтобы закрыть дескриптор MessageBox.

//Get the MessageBox handle
            IntPtr handle = FindWindow("?????????", null);
            MessageBox.Show("Hanlde1: " + handle.ToString() + "\n");

            //Get the Text window handle
            IntPtr txtHandle = FindWindowEx(handle, IntPtr.Zero, "Static",  null);
            MessageBox.Show("\ttext handle: " + txtHandle.ToString() + "\n");
            int len = GetWindowTextLength(txtHandle);
            StringBuilder sb = new StringBuilder();

            //Get the text
            GetWindowText(txtHandle, sb, len + 1);
            MessageBox.Show("\ttext: " + sb.ToString() + "\n\n");

            //close the messagebox
            SendMessage(new HandleRef(null, handle), WM_CLOSE, IntPtr.Zero, IntPtr.Zero);


Итак, моя проблема заключается в том, что я не могу получить идентификатор дескриптора от spy++ для диалогового окна в соединении RDP. Он показывает мне только идентификатор из родительского окна, а не из диалогового окна Windows.

Итак, мой первый вопрос: это правильный способ обработки этого диалогового окна? И второй вопрос: Как я могу получить правильный идентификатор дескриптора диалогового окна в сеансе RDP.

большое спасибо.

Хаген

0 Ответов