Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29

Узнать все дискрипторы объектов которые неходятся в окне

07.02.2013, 13:30. Показов 3577. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток. Нужно узнать все handle елементов которые есть в активном окне так как это показывает SPYXX.
Например "Калькулятор". Я могу узнать headle основного окна
C#
1
2
3
4
5
[DllImport("user32.dll")]
 public static extern int FindWindow( 
     string lpClassName, // class name 
     string lpWindowName // window name 
 );
но как мне найти все внутренние дескрипторы елементов. Вопрос состоит в чём, какую АРІ библиотеку и какую функцию использовать?
Миниатюры
Узнать все дискрипторы объектов которые неходятся в окне  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2013, 13:30
Ответы с готовыми решениями:

Узнать все ключи в реестре, которые создала программа
Возможно ли как - то сделать? Вот есть программа, я её установил, всё работает, хорошо. Слетела винда, поставил новую. Программа...

Webbrowser. Как отследить все события, которые происходят в окне после деятельности полльзователя и некоторые из них записать в файл?
Имеется webbrowser расположенный на форме. Необходимо отслеживать все события, которые происходят в этом окне, затем список этих событий...

Как узнать все таблицы которые используються по внешнему ключу
как узнать все таблицы которые используются по внешнему ключу.. крч есть бд в ней 1000-5000 тааблиц распространенные по схемам... есть...

14
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29
07.02.2013, 13:38  [ТС]
Просьба к модератору, перенести тему в раздел "C# для начинающих".
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.02.2013, 13:41
Constantin_ukr, GetWindow + GW_CHILD вторым параметром http://vsokovikov.narod.ru/New... window.htm
1
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29
07.02.2013, 23:06  [ТС]
если не трудно, подскажите какая функция возвращает имя класса окна, если у меня есть дискриптор окна. GetClassName не возвращает строку
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.02.2013, 23:40
Constantin_ukr, покажи код там не надо никакого класснэйма. Без кода не могу понять в чём там проблема - передал HWND главного окна и находи "детей"
0
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29
08.02.2013, 02:26  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow( string lpClassName, string lpWindowName);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
 
        IntPtr ip = (IntPtr)0;
        IntPtr ip2 = (IntPtr)0;
 
        public const int GW_HWNDFIRST = 0;
        public const int GW_HWNDLAST = 1;
        public const int GW_HWNDNEXT = 2;
        public const int GW_HWNDPREV = 3;
        public const int GW_OWNER = 4;
        public const int GW_CHILD = 5;
 
        [DllImport("User32.dll", CharSet = CharSet.Unicode)]
        public static extern int GetClassName(IntPtr hwnd, StringBuilder className, int maxCount);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr GetNextWindow(IntPtr hWnd, uint wCmd);
 
        private void button1_Click(object sender, EventArgs e)
        {
            int y;  
            ip = FindWindow(null, "Калькулятор Плюс");
            StringBuilder sbwt = new StringBuilder(1024);
            y = GetClassName((IntPtr)ip, sbwt, sbwt.Capacity);
            listBox1.Items.Clear();
            listBox1.Items.Add(y);
           
            if ((int)ip == 0)
            {
                listBox1.Items.Add("Програма не запущена");
                return;
            }
            else 
            {
                listBox1.Items.Add(String.Format("Головне вікно handle: {0}",ip));
                ip2 = GetWindow(ip, GW_CHILD);
                listBox1.Items.Add(String.Format("Дочірне вікно handle: {0}", ip2));
                ip2 = GetWindow(ip2, GW_HWNDNEXT);
                IntPtr ip3 = (IntPtr)0;
                ip3 = GetWindow(ip2, GW_HWNDNEXT);
                listBox1.Items.Add(String.Format("Третє вікно handle: {0}", ip3));
             }
        }
а вот в етом месте
C#
1
listBox1.Items.Add(String.Format("Головне вікно handle: {0} - {1}",ip,ClassName));
хотелось увидить имя обекта класа. Так проще отследить последовательность. А то у меня дескрипторы не совпадают с SPYXX. Начинаючи с ip3.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.02.2013, 03:09
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Constantin_ukr Посмотреть сообщение
хотелось увидить имя обекта класа. Так проще отследить последовательность. А то у меня дескрипторы не совпадают с SPYXX. Начинаючи с ip3.
- Зачем тебе имя класса?Говорю же ищется всё по окнам(кстати ты мог не экзешник смотреть в Spy а дескрипторы студии - окошко проекта ведь тайтл аналогичный имеет(!))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CWndDeskrDlg::OnOK() 
{
    // TODO: Add extra validation here
    CString szFmt;
    HWND hWnd = m_hWnd;
    char szClassName[MAX_PATH] = {0};
    GetClassName(hWnd,szClassName,MAX_PATH);
    m_WndStr.Format("%d 0x%p %s\r\n",0,hWnd, szClassName);
    hWnd = ::GetWindow(hWnd, GW_CHILD);
    for(int iElem = 1; hWnd; iElem++)
    {
        GetClassName(hWnd,szClassName,MAX_PATH);
        szFmt.Format("%d 0x%p %s\r\n",iElem,hWnd,szClassName);
        m_WndStr += szFmt;
        hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
    }
    UpdateData(false);
    //CDialog::OnOK();
}
Миниатюры
Узнать все дискрипторы объектов которые неходятся в окне  
Вложения
Тип файла: rar WndDeskr.exe.rar (4.0 Кб, 10 просмотров)
Тип файла: rar WndDeskr_proj.rar (28.7 Кб, 8 просмотров)
3
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
08.02.2013, 05:11
На днях пришлось перебирать
все дочерние окна на панели задач через EnumChildWindows
Поправил под ваш
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
  public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
 
  [DllImport("user32.dll")]
  [return: MarshalAs(UnmanagedType.Bool)]
  static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowProc lpEnumFunc, IntPtr lParam);
 
 
 [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
 static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
 
    bool EnumChildProc(IntPtr hwnd, IntPtr lParam) 
{
       const int len = 200;
       StringBuilder str = new StringBuilder(len);    
       GetClassName(hwnd, str, len);
       listBox1.Items.Add("   " + hwnd.ToString("X8") + "  " + str);
 
     return true; 
}
    IntPtr hWnd = IntPtr.Zero;
    string windowName = "Калькулятор";
 
    private void button1_Click(object sender, EventArgs e)
    {
        listBox1.Items.Clear();
        listBox1.Items.Add("Child Elements :");
        listBox1.Items.Add("\r\n");
        if ((hWnd = FindWindow(null, windowName)) != IntPtr.Zero)
        {
            var lpEnumFunc = new EnumWindowProc(EnumChildProc);
            EnumChildWindows(hWnd, lpEnumFunc, IntPtr.Zero);
        }
        else            
        listBox1.Items.Add("Window " + windowName + " not found\r\n");
    }
    }
1
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29
09.02.2013, 19:20  [ТС]
не бейте сильно. Но как узнать текущее положение окна( х, у) которое запущено когда знаю его дискриптор. Можна не большой пример или название функции, please. Может ктото имеет также пример использывания функции GetCursorPos
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.02.2013, 21:23
Цитата Сообщение от Constantin_ukr Посмотреть сообщение
Но как узнать текущее положение окна( х, у) которое запущено когда знаю его дискриптор.
- GetWindowRect вернёт его размеры, GetClientRect вернёт размер клиентской области.

Добавлено через 2 минуты
GetWindowRect http://vsokovikov.narod.ru/New... owrect.htm
GetClientRect http://vsokovikov.narod.ru/New... ntrect.htm
0
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29
09.02.2013, 22:51  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
       [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }
        //-----------------
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
        
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetClientRect(IntPtr hwnd, out RECT lpRect);
        
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        
        IntPtr hWnd = IntPtr.Zero;
        string windowName = "Калькулятор Плюс";
 
         private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
 
            hWnd = FindWindow(null,windowName);
            
            RECT rect = new RECT();
            GetWindowRect(hWnd, out rect);
 
            if (!GetWindowRect(hWnd, out rect))
                listBox1.Items.Add("Не удалось получить границы окна");
            iWidth = rect.Right - rect.Left;
            iHeight = rect.Bottom - rect.Top;
            listBox1.Items.Add(String.Format("Width: {0}", rect.Right - rect.Left));
            listBox1.Items.Add(String.Format("Height: {0}", rect.Bottom - rect.Top));
 
            RECT stcGCR = new RECT();
            GetWindowRect(hWnd, out stcGCR);
            if (!GetClientRect(hWnd, out stcGCR))
                listBox1.Items.Add("Не удалось получить границы окна");
            iWidth = stcGCR.Right - stcGCR.Left;
            iHeight = stcGCR.Bottom - stcGCR.Top;
            listBox1.Items.Add(String.Format("Width stcGCR: {0} ", stcGCR.Right - stcGCR.Left));
            listBox1.Items.Add(String.Format("Height stcGCR: {0}", stcGCR.Bottom - stcGCR.Top));
            }
мне нужно координаты окна в области рабочего стола. И было б неплохо читать координати мыши на робочом столе.
Миниатюры
Узнать все дискрипторы объектов которые неходятся в окне  
0
10.02.2013, 00:22

Не по теме:

Цитата Сообщение от Constantin_ukr Посмотреть сообщение
мне нужно координаты окна в области рабочего стола.
-
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
GetWindowRect вернёт его размеры
, в области рабочего стола

0
0 / 0 / 1
Регистрация: 10.01.2011
Сообщений: 14
20.02.2013, 23:30
Товарищи, а подскажите пожалуйста: почему таким образом в список контролов не попадает MessageBox, хотя у него в свойствах стоит родительским окном то, дескриптор которого я задаю в EnumChildWindows?
0
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29
24.02.2013, 19:58  [ТС]
проблема в том что оно создается во время появления. смотри, может поможет http://netcode.ru/cpp/?click=r-4719.php.htm

Добавлено через 1 минуту
можеш использывать утулиту API Monitor (rohitab.com) очень помогает с апи

Добавлено через 1 минуту
Как определить вызвала ли форма какие либо messagebox?
0
24.02.2013, 20:26

Не по теме:

Constantin_ukr, вот код которые в 3 строчки не то что найдёт меседжбокс, а вытащит из него текст
Получить текст из MessageBox
Там фишка была только в класснэйм "#32770" и никаких особых премудростей

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.02.2013, 20:26
Помогаю со студенческими работами здесь

Все четные числа вывести в одном окне, в строчку; все нечетные числа - во втором окне
Ввести массив из 10 чисел. Все четные числа вывести в одном окне, в строчку; все нечетные числа - во втором окне, в столбик. Второе окно...

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

Создание объектов в окне
Я хочу узнать как создавать компоненты на будущем окне программы.Но именно в C++,а не в Visual C++! То есть например: как создать...

Движение объектов в окне
Здравствуйте форумчане. Помогите пожалуйста! Надо написать приложение. Суть задачи. Движение объектов в окне. В приложении должно быть...

Движение объектов в окне
Движение объектов в окне. В приложении должно быть создано не менее двух «пассивных» движущихся объектов. Каждый объект должен управляться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru