C # PInvoke Поиск дескриптора окна дочернего окна из известного окна - PullRequest
2 голосов
/ 16 июня 2011

В настоящее время я пытаюсь получить текст из дочернего окна, используя SendMessage через C # pinvoke. Тем не менее, мои предыдущие попытки хардкорного дескриптора окна потерпели неудачу, так как значение меняется при запуске приложения. Есть ли способ надежно получить дескриптор окна этого дочернего окна? Шпион Winspector показывает, что имя класса этого окна - RichEdit20W. Мой текущий код выглядит следующим образом:

IntPtr hWnd= (IntPtr) 0xA0E88; // Hardcode window handle


        int txtlen = SendMessage(hWnd, WM_GETTEXTLENGTH, 20, null);
        StringBuilder text = new StringBuilder(txtlen);
        int RetVal = SendMessage(hWnd, WM_GETTEXT, text.Capacity, text);

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

В итоге я использовал API управляемой Windows для перечисления всех окон-потомков окна.

            var descendantwindows = childWindows[0].AllDescendantWindows; // Get all descendant windows of CMainWindow

        for (int i = 0; i<descendantwindows.Length; i++)
        {
            if (descendantwindows[i].ClassName == "RichEdit20W")
                childHandle = descendantwindows[i].HWnd;
        }
1 голос
/ 16 июня 2011

Если вы можете получить окно верхнего уровня (окно с заголовком), вы можете использовать FindWindowEx для рекурсии через детей. Это позволяет вам указать текст окна (используйте ноль, поскольку вы его не знаете) и / или класс (который вы знаете).

http://www.pinvoke.net/default.aspx/user32.findwindowex

0 голосов
/ 16 июня 2011

Вы можете вызвать API [FindWindow][1], чтобы иметь окно верхнего уровня, или, может быть, лучше, если вы знаете имя процесса, используя:

Process[] processes = Process.GetProcessesByName("yourprocessname");

foreach (Process p in processes)

{

    IntPtr pFoundWindow = p.MainWindowHandle;

    // Do something with the handle...

    //

}

Обратите внимание, что есть больше записей, потому что естьпотенциально может быть одновременно запущено больше экземпляра процесса.Затем вам нужна стратегия для поиска дочерних элементов верхнего уровня, чтобы точно указать окно, которое вы ищете.

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