Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2011, 20:54   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию [Проблема] Программное изменение заголовка чужого окна по хендлу процесс(EnumWindows)

всем привет!

Суть проблемы:
При помощи:
Код:
EnumThreadWindows(PI.dwThreadId, @MiniWindowProc, 0); //манипулируем с окном...
минимизирую стандартный калькулятор, зупущенный через CreateProcess.
И вот что наблюдаю:
Вооружившись отладчиком просмотрел процесс, 1 раз пробегаем по @MiniWindowProc:
Код:
function MiniWindowProc(hwnd: THandle; lParam: LPARAM): Boolean; stdcall;
begin
  Result := True;
  if GetWindowLong(hwnd, GWL_STYLE) and WS_CAPTION = WS_CAPTION then
  begin
    ShowWindow(hwnd, SW_SHOWMINIMIZED);
  end;
end;
Минимизируется калькулятор просто прекрасно. Вроде бы всё ок! Но с какого-то перепуга, пробегаем по той же @MiniWindowProc второй раз! Но т.к. у нас нет окна на рабочем столе(потому что оно свёрнуто), сворачивает ещё откулда-то взявшееся окно с названием: CalcMsgPumpWnd(Оказалось это класс окна калькулятора)

Итого на панели задач у нас 1 калькулятор, и 2 его хз что, но имя тоже калькулятор.

Собственно почему @MiniWindowProc выполняется 2-3 раза вместо 1го?
И как от этого вылечиться?

P.S. Нет, все таки ставить пробелы в коде через строку это видимо очень новая и забавная фича форума.

Последний раз редактировалось Человек_Борща; 08.01.2011 в 21:00.
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 21:03   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у него есть еще одно какое то скрытое окно.
можно попробывать проверять на наличие расширенного стиля WS_EX_APPWINDOW
именно такое окно обычно главное в программе(но не всегда вродь)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.01.2011, 21:11   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Если так:
Код:
function MiniWindowProc(hwnd: THandle; lParam: LPARAM): Boolean; stdcall;
begin
  Result := True;
  if GetWindowLong(hwnd, GWL_STYLE) and WS_CAPTION = WS_CAPTION or WS_EX_APPWINDOW then
  begin
    ShowWindow(hwnd, SW_SHOWMINIMIZED);
  end;
end;
то сворачивание не работает. Как правильно?
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 21:13   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я же сказал, расширенные стили(GWL_EXSTYLE)
Код:
GetWindowLong(hwnd, GWL_STYLE) and WS_CAPTION = WS_CAPTION or WS_EX_APPWINDOW
такое в принципе работать не должно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.01.2011, 21:17   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

хм, тогда ShowWindow(,SW_MINIMIZED);
не работает... ????
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 21:20   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как ты проверял на расширенный стиль?
показывай.
(если тебе надо и простой стиль WS_CAPTION проверять, и расширенный WS_EX_APPWINDOW то это две проверки)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.01.2011, 21:50   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Как сделать вторую проверку? (Не понимаю)
Вот что есть:
Код:
function MiniWindowProc(hwnd: THandle; lParam: LPARAM): Boolean; stdcall;
begin
  Result := True;
  if GetWindowLong(hwnd, GWL_EXSTYLE) and WS_CAPTION = WS_CAPTION or WS_EX_APPWINDOW then
  begin
    ShowWindow(hwnd, SW_SHOWMINIMIZED);
  end;
end;
и всеравно не работает(не сворачивает).
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 22:06   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
GetWindowLong(hwnd, GWL_STYLE) and WS_CAPTION = WS_CAPTION
Код:
GetWindowLong(hwnd, GWL_EXSTYLE) and WS_EX_APPWINDOW= WS_EX_APPWINDOW
обьеденим через И
и получим:
Код:
(GetWindowLong(hwnd, GWL_STYLE) and WS_CAPTION=WS_CAPTION)and(GetWindowLong(hwnd, GWL_EXSTYLE) and WS_EX_APPWINDOW=WS_EX_APPWINDOW)
примерно так
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 08.01.2011 в 22:50.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.01.2011, 22:40   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

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

Ставлю +
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать высоту (px) заголовка окна zotox Win Api 1 26.11.2010 16:08
Замена заголовка чужого окна dacorp Общие вопросы Delphi 3 13.06.2010 00:05
Изменение заголовка страницы ruavia3 Microsoft Office Excel 2 18.05.2009 18:21
Как изменить цвет заголовка окна CraZZy RabbIt Общие вопросы Delphi 3 20.02.2009 15:47
Область заголовка окна HunterMan Win Api 3 14.04.2008 15:37