0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18

Свернуть дочерние окна сторонней программы

14.03.2020, 11:59. Показов 5461. Ответов 35

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста как свернуть в трей все дочернии окна основной программы, сторонней.
Основную программу скрываю путем:

C#
1
2
3
4
IntPtr wdwIntPtr = FindWindow(null, "jambo");      
Windowplacement placement = new Windowplacement();
GetWindowPlacement(wdwIntPtr, ref placement);
ShowWindow(wdwIntPtr, ShowWindowEnum.Hide);

Скрывается нормально, но через время программа открывает вторую свою форму, но воспроизведение этого кода на вторую форму не реагирует, хотя в диспетчере задач имя у второго окна одинаковое с основным.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.03.2020, 11:59
Ответы с готовыми решениями:

Свернуть все окна, кроме окна программы
здравствуйте. как программно свернуть все окна кроме окна самой программы

Активность окна сторонней программы
Здравствуйте. Такой вопрос к знатокам) Как определить активно ли окно у сторонней программы? ничего внятного не нашел на просторах...

Программное нажатие на кнопку окна сторонней программы
У себя в коде запускаю 3dsMax (через Process.Start()) на выполнение скрипта, в процессе работы всплывает предупреждение в виде MessageBox с...

35
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 11:18  [ТС]
Помогите знающие пожалуйста, проблему никак не могу решить.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
15.03.2020, 11:39
Для начала надо определить что вы считаете дочерними окнами потому как в официальной терминологии дочерние окна это компоненты размещенные на форме (кнопки, текстовые поля и т.д.).

Добавлено через 8 минут
Ечли имеются ввиду все окна процесса, тогда так:
1. Найти id процесса по идентификатору окна используя
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

2. Найти все окна процесса:
https://stackoverflow.com/a/2584672

3. Применить код для скрытия к каждому из найденных окон.
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 11:47
Цитата Сообщение от piu2020 Посмотреть сообщение
имя у второго окна одинаковое с основным.
Так он у Вас первое находит и всё. Нужно продолжать поиск, по-моему через FindWindowEx
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 13:04  [ТС]
стало выводить:

ad_msg_wnd
Default IME
Gefault IME
Default IME



использую

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
 private const uint WM_GETTEXT = 0x000D;
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam,
            StringBuilder lParam);
 
 
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
 
        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
            IntPtr lParam);
 
        static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
        {
            var handles = new List<IntPtr>();
 
            foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
                EnumThreadWindows(thread.Id,
                    (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);
 
            return handles;
        }
 
 
 [STAThread]
        static void Main(string[] args)
        {
            foreach (var handle in EnumerateProcessWindowHandles(
       Process.GetProcessesByName("TeamViewer").First().Id))
            {
                StringBuilder message = new StringBuilder(1000);
                SendMessage(handle, WM_GETTEXT, message.Capacity, message);
                Console.WriteLine(message);
                
            }
 
            Console.ReadLine();
 
        }
Добавлено через 5 минут
немного не пойму как применить код скрытия ко всем найденным окнам процесса, у меня они такие получились:
ad_msg_wnd
Default IME
Gefault IME
Default IME

через ShowWindow ?)
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 13:10
Цитата Сообщение от piu2020 Посмотреть сообщение
стало выводить:
Это то, что возвращает SendMessage. Вам нужно получить дескриптор нужного окна.

Добавлено через 3 минуты
Цитата Сообщение от piu2020 Посмотреть сообщение
как применить код скрытия ко всем найденным окнам процесса
Передать им сообщение. Вот у вас строка в первом коде

C#
1
ShowWindow(wdwIntPtr, ShowWindowEnum.Hide);
Это вы отправляете сообщение на сворачивание окну по его дескриптору.

Вам нужно подставить вместо wdwIntPtr нужный дескриптор (handle).
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 13:28  [ТС]
правильно я понимаю, в моем случае будет так?

C#
1
2
3
4
5
6
7
8
9
     foreach (var handle in EnumerateProcessWindowHandles(
       Process.GetProcessesByName("TeamViewer").First().Id))
            {
                StringBuilder message = new StringBuilder(1000);
                SendMessage(handle, WM_GETTEXT, message.Capacity, message);
 
              ShowWindow(handle, ShowWindowEnum.Hide);  //сворачивам окна
               
            }
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 13:34
По моему 4 и 5 строки лишние.
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 15:48  [ТС]
Дело в том что проверяю на несколько разных программ, работает, проверяю на той которая нужна - не сворачивается даже в трей, в чем может быть причина?
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 15:53
Цитата Сообщение от piu2020 Посмотреть сообщение
в чем может быть причина?
Посмотрите значение дескриптора. Если он определён, то имеет значение отличное от 0
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 16:48  [ТС]
значения дескрипторов есть:
1508482
3607130
1116480
1574094

Просто интересно, то что запускаю другие программы и с ними все работает
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
15.03.2020, 17:17
Цитата Сообщение от piu2020 Посмотреть сообщение
проверяю на той которая нужна - не сворачивается даже в трей, в чем может быть причина?
Это программа случаем не от имени администратора запущена?

Цитата Сообщение от piu2020 Посмотреть сообщение
как свернуть в трей все дочернии окна основной программы, сторонней.
Основную программу скрываю путем:
Т.е. первоначальный метод работал c этой программой но скрывал только основное окно, или как?
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 17:34
Цитата Сообщение от nicolas2008 Посмотреть сообщение
но скрывал только основное окно
Да. Скрывал только основное потому что вы находили только хэндл основного окна, и сворачивали только его.

Посмотрите что возвращает WIN API функция ShowWindow

На всякий случай параметры функции

SW_HIDE - Скрывает окно и активизирует другое окно.
SW_MAXIMIZE - Развертывает определяемое окно.
SW_MINIMIZE - Свертывает определяемое окно и активизирует следующее окно верхнего уровня в Z-последовательности.
SW_RESTORE - Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает в его первоначальных размерах и позиции. Прикладная программа должна установить этот флажок при восстановлении свернутого окна.
SW_SHOW - Активизирует окно и отображает его текущие размеры и позицию.
SW_SHOWDEFAULT - Устанавливает состояние показа, основанное на флажке SW_, определенном в структуре STARTUPINFO, переданной в функцию CreateProcess программой, которая запустила прикладную программу.
SW_SHOWMAXIMIZED - Активизирует окно и отображает его как развернутое окно.
SW_SHOWMINIMIZED - Активизирует окно и отображает его как свернутое окно.
SW_SHOWMINNOACTIVE - Отображает окно как свернутое окно. Активное окно остается активным.
SW_SHOWNA - Отображает окно в его текущем состоянии. Активное окно остается активным.
SW_SHOWNOACTIVATE - Отображает окно в его самом современном размере и позиции. Активное окно остается активным.
SW_SHOWNORMAL - Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает его в первоначальном размере и позиции. Прикладная программа должна установить этот флажок при отображении окна впервые.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение - ноль.

Добавлено через 3 минуты
nicolas2008, извините, перепутал вас с ТС
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 17:35  [ТС]
Первоначально когда я запускаю программу в диспетчеке показано 3 одинаковых процесса этой программы,
сразу же она появляется в трее и дополнительно открывается на рабочем столе, если я пошлю ей допустим закрытие:
C#
1
  SendMessage(handle, WM_CLOSE, 0, null);
то закроется либо в трее либо на рабочем столе, не закрывается все процессы, хотя у меня закрытие в цикле стоит.
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 17:47
Цитата Сообщение от piu2020 Посмотреть сообщение
хотя у меня закрытие в цикле стоит
Ну и что, что в цикле? вы посылаете сообщение одному и тому же окну. Для определения дескрипторов дочерних окон нужно использовать Win API FindWindowEx.

Добавлено через 3 минуты
Цитата Сообщение от piu2020 Посмотреть сообщение
диспетчеке показано 3 одинаковых процесса
На самом деле описатель есть у каждого элемента управления, кроме разве что Label-а, так как это "недоокно".

Добавлено через 33 секунды
Так, что-то всплывает в памяти. Где-то слышал краем уха, что Win API не совсем корректно работают с программами, созданными в .NET. То ли там классы окон какие-то кривые, то ли еще что. Но это так, к сведению.
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 17:58  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Для определения дескрипторов дочерних окон нужно использовать Win API FindWindowEx.
можете пожалуйста привести пример как это правильнее сделать
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 18:14
Цитата Сообщение от piu2020 Посмотреть сообщение
как это правильнее сделать
Нужно сначала найти дескриптор основного окна с помощью FindWindow,
затем найти одно из дочерних при помощи FindWindowEx, передав ей в качестве параметра описатель основного окна.
Дескрипторы дочерних окон на одном уровне перебираются с помощью Win API GetNextWindow.
Так можно достучаться до любого контрола и послать ему сообщение.
Для контроля правильности найденного дескриптора, или определения класса окна можно воспользоваться сторонними программами, например SPY++
Миниатюры
Свернуть дочерние окна сторонней программы  
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 18:36  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
определения класса окна можно воспользоваться сторонними программами, например SPY++
Хорошо, могу ли я через spy++ определить класс, допустим я определил на второй форме класс общей формы #32770 (Dialog)

получится сразу к нему обратиться через FindWindow?

C#
1
2
IntPtr wdwIntPtr = FindWindow("#32770 (Dialog)", null);
SendMessage(wdwIntPtr , WM_CLOSE, 0, null);
или мне все равно нужно через FindWindowEx это делать?
0
dive
 Аватар для I can
4969 / 4664 / 847
Регистрация: 13.04.2015
Сообщений: 9,862
15.03.2020, 18:56
Цитата Сообщение от piu2020 Посмотреть сообщение
получится сразу к нему обратиться через FindWindow?
Нет. Вы не можете знать, что по классу получите нужный дескриптор.

Добавлено через 4 минуты
Класс нужно указывать в третьем параметре FindWindowEx

Добавлено через 1 минуту
Цитата Сообщение от piu2020 Посмотреть сообщение
привести пример
Готового нет. Если не горит, то попозже могу набросать пример. Надеюсь гуглить пробовали ?
0
0 / 0 / 0
Регистрация: 14.03.2020
Сообщений: 18
15.03.2020, 19:22  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Надеюсь гуглить пробовали ?
Да вот сейчас пытаюсь) пробую таким образом
C#
1
2
3
IntPtr wdwIntPtr = FindWindow(null, "TeamViewer");
IntPtr childWindow = FindWindowEx(wdwIntPtr, new IntPtr(0), "ComboBox", null);
SendMessage(childWindow, WM_CLOSE, 0, null);
пока не выходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.03.2020, 19:22
Помогаю со студенческими работами здесь

Изменение заголовка окна сторонней программы
Добрый день. Нужно изменить заголовок окна сторонней программы. Код: using System; using System.Collections.Generic; using...

Обращение к класам окна сторонней программы
Доброго времени суток, помоги пожалуйста решить проблему вот в двух словах что делаю: после того как нашел и проверил мне необходимо...

Скрытие окна запускаемой сторонней программы
Я решил вынести оставшийся вопрос отдельно. До этого уже обсуждали остальные мои вопросы. Не все захочется всё читать и вникать 0 дан ли...

Изменить тайтл окна сторонней программы, зная его дескриптор
Как изменить тайтл окна программы? Не своего приложения, а сторонней программы запущенной на компе. Дискриптор запущенного окна и...

При перерисовке главного окна мигают дочерние окна
При перерисовке главного окна мигают дочерние окна. Для отрисовки главного окна используется двойная буферизация, как и в дочерних окнах....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru