Нахождение видимой кнопки - PullRequest
0 голосов
/ 13 января 2012

Я "украл" код из http://improve.dk/archive/2007/04/07/finding-specific-windows.aspx

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

я изменил эту часть =>

    private static bool foundWindow(int handle)    
    {
        bool buttonCheck = false;
        IntPtr hButton = FindWindowEx((IntPtr)handle, IntPtr.Zero, "AfxWnd90u21", null);
        if (hButton != IntPtr.Zero)
        {
            buttonCheck = true;
        }

        if (buttonCheck)
        {
            ShowWindowAsync(handle, (int)3); // maximize the window
        }

        return true;
    }
the button class is `AfxWnd90u` and the instance is `21`. I wrote this in autoit before and AfxWnd90u21 is 100 % correct. 

the problem is that i cant find the button with AfxWnd90u21. if i only use 

    IntPtr hButton = FindWindowEx((IntPtr)handle, IntPtr.Zero, "AfxWnd90u", null);

all windows get maximized.

It has to be something with the instance.

i hope you can help me,

thanks

Самое новое редактирование Я просто попытался найти имя классас "GetClassName".Я нахожу 190 ~ классов на ручку, но нужного мне класса там нет.я действительно в отчаянии, я надеюсь, что кто-то может мне помочь, спасибо

       private static bool foundWindow(int handle)
            {
                int i = 0;
                IntPtr hWnd = (IntPtr)handle;

               // System.Windows.Forms.Control control = System.Windows.Forms.Control.FromHandle(hWnd);
                StringBuilder sbClass = new StringBuilder(256);

                while (hWnd != IntPtr.Zero)
                {
                    ++i;


                    ///////////////////////////////////////////////////
                    ////////////// Compare if the classname exists/////
                    GetClassName((int)hWnd, sbClass, sbClass.Capacity);
                    if (sbClass.ToString().Equals("AfxWnd90u21"))
                    {
                        MessageBox.Show(sbClass.ToString());
                    }
                    ///////////////////////////////////////////////////


                    ////// trying to find the correct class with findwindowEX//////////
                    IntPtr hButton = FindWindowEx(hWnd, IntPtr.Zero, "AfxWnd90u21", null);



                    if (hButton != IntPtr.Zero)
                    {
                        MessageBox.Show("true");
                        ShowWindowAsync(handle, (int)2); // maximize the window
                    }
                    hWnd = FindWindowEx(IntPtr.Zero, hWnd, null, null);
                }
                MessageBox.Show(""+i);
                return true;
            }

1 Ответ

1 голос
/ 13 января 2012

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx

lpszWindow [in, optional]

    Type: LPCTSTR

The window name (the window's title). If this parameter is NULL,
all window names match.

Похоже, с этим API, чтобы соответствовать экземпляру, вам нужно дать вашим экземплярам уникальные имена окон. Или вы можете выполнить поиск всех дочерних элементов, приведенных вручную к элементу управления, а затем проверить экземпляры самостоятельно.

Но если вы зайдете так далеко, проще привести родителя к элементу управления и перебрать его член .Controls. Вы можете использовать отражение, чтобы проверить тип элемента управления и т. Д.

Чтобы преобразовать дескриптор в элемент управления: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.fromhandle.aspx

Итерация по Control.Controls, используя любой стиль цикла, который вы предпочитаете.

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