Взаимодействовать с формой, используя дескриптор C # - PullRequest
0 голосов
/ 11 сентября 2011

Я пытаюсь автоматизировать динамически появляющееся диалоговое окно. Мне нужно передать текст в текстовое поле, а затем нажать на кнопку. То, что я пробовал до сих пор.

 [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

IntPtr handle= FindWindowByCaption(System.IntPtr.Zero, "Caption Of File");

Я правильно получаю дескриптор диалогового окна.

List<IntPtr> childWindows=  GetChildWindows(handle);//To get the child controls in this dialogue box

Источник

Но когда я пытаюсь привести его к контролю, я получаю ноль.

foreach (IntPtr i in childWindows) 
{
    Control c = Control.FromHandle(i);
}

Так что любой орган может сказать, что не так. Я предполагаю, что я приведу дескриптор к элементу управления, а затем взаимодействую со свойствами элемента управления (например, текст).

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

enter image description here

В течение многих лет я успешно использовал подобный код для единого входа в приложение, которое запрашивает у пользователя имя пользователя / pwd / domain.Единственное предостережение - вам нужно знать структуру управления диалогового окна, на которое вы нацелены, но это легко достигается с помощью Spy ++ и редко изменяется.Конечно, вам нужно будет изменить этот код для структуры управления вашего окна.

        [DllImport("user32.dll")]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,
            string lpszClass, string lpszWindow);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, string lParam);

        [DllImport("User32.Dll")]
        public static extern IntPtr PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

        private const uint WM_GETTEXTLENGTH = 0x000E;
        private const uint WM_SETTEXT = 0x000C;
        private const uint WM_GETTEXT = 0x000D;
        private const uint BM_CLICK = 0x00F5;
        private const uint WM_CLOSE = 0x0010;

        enum GetWindow_Cmd : uint
        {
            GW_HWNDFIRST = 0,
            GW_HWNDLAST = 1,
            GW_HWNDNEXT = 2,
            GW_HWNDPREV = 3,
            GW_OWNER = 4,
            GW_CHILD = 5,
            GW_ENABLEDPOPUP = 6
        }

var dialog FindWindow("optionalClassNameHere", "Log On"); //Get the handle of the window
 var w3 = GetWindow(dialog , (uint)GetWindow_Cmd.GW_CHILD);  //I use GetWindow to walk the window controls
 var wUid = FindWindowEx(w3, IntPtr.Zero, "Edit", "");
 var w4 = GetWindow(wUid, (uint)GetWindow_Cmd.GW_HWNDNEXT);
 var wPwd = FindWindowEx(w4 , IntPtr.Zero, "Edit", "");
 var wOK = FindWindowEx(w3, IntPtr.Zero, "Button", "OK");
 SendMessage(wUid, WM_SETTEXT, 0, _WinDomain + "\\" + Username); //Send username to username edit control
 SendMessage(wPwd, WM_SETTEXT, 0, Password); //Send password to password edit control
 PostMessage(wOK, BM_CLICK, 0, 0); //Send left click(0x00f5) to OK button
0 голосов
/ 11 сентября 2011

Control.FromHandle может работать только для элементов управления в вашем процессе, которые реализованы потомками Control. Я предполагаю, что это окно находится за пределами вашего процесса.

Вам нужно использовать методы Win32 API для его изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...