Почему «FindWindowEx» не может найти компонент RichTextBox - PullRequest
0 голосов
/ 01 июня 2018

Я делаю автоматическую программу (C #, а не C ++), и мне нужно получить RichTextBox в форме.Я использовал Spy++, чтобы получить заголовок и имя класса, но FindWindowEx всегда не находит RichTextBox, а GetLastError получает слово 0.И тогда это простой пример.

IntPtr parent = FindWindow(null, "Form1");
if (parent!=IntPtr.Zero) {
    //find test1 textbox
    IntPtr child = FindWindowEx(parent, 0,null,  "test1");
    if (child!=IntPtr.Zero) {
        SendMessage(child, 0x000c, 0, lParam:  "test");
    } else {
        Console.WriteLine("textbox can't be found");
    }
    //find test2 richtextbox
    IntPtr childRich = FindWindowEx(parent, 0, null, "test2");
    if (childRich != IntPtr.Zero) {
        SendMessage(child, 0x000c, 0, lParam: "test");
    } else {
        Console.WriteLine("richtextbox can't be found");
    }
} else {
    Console.WriteLine("Form1 can't be found");
}

https://i.stack.imgur.com/7eWil.png

Но результат равен richtextbox can't find.Помоги мне.

1 Ответ

0 голосов
/ 01 июня 2018

Я не думаю, что это лучший подход, но это что-то.

В этом конкретном случае вы можете найти все обработчики в форме и затем изменить тот, который вам нужен.

var iHandle = Win32.FindWindow(null, "Form1");
var allItems = Win32.GetAllChildrenWindowHandles((IntPtr)iHandle, int.MaxValue);
Win32.SendMessage(allItems[1], 0x000c, 0, lParam: "Now you can change the text!");

Я тестировал, и allItems [1] всегда будет одним и тем же элементом, я думаю, что это порядок, в котором элементы упорядочены в winForm сверху вниз.

Я использую второйкласс для методов Win:

public class Win32
{
    public const int WM_SETTEXT = 0X000C;

    public static List<IntPtr> GetAllChildrenWindowHandles(IntPtr hParent, int maxCount)
    {
        var result = new List<IntPtr>();
        int ct = 0;
        IntPtr prevChild = IntPtr.Zero;
        IntPtr currChild = IntPtr.Zero;
        while (true && ct < maxCount)
        {
            currChild = FindWindowEx(hParent, prevChild, null, null);
            if (currChild == IntPtr.Zero) break;
            result.Add(currChild);
            prevChild = currChild;
            ++ct;
        }
        return result;
    }

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

    [DllImport("User32.dll")]
    public static extern int FindWindow(string strClassName, string strWindowName);
}

Редактировать: Метод получения дескрипторов всех дочерних окон, взятых из: https://jamesmccaffrey.wordpress.com/2013/02/03/getting-all-child-window-handles-using-c-pinvoke-findwindowex/

...