Аннотация:
— Как реализовать функцию "свернуть все окна"?
— Вид прототипа диалоговой процедуры
— С помощью SetWindowRgn я скруглил углы моего диалога, но теперь нет возможности схватить за эти круглые края и изменить размер диалога. Как это сделать?
— Как запустить "My computer" и "Recycle Bin" из другого приложения?
K>?? K>Top-level окна без WS_MINIMIZEBOX так не свернуть K>(по крайней мере на XP)
Каждое приложение формирует свое окно таким образом чтобы пользователю было удобно с ним работать. Если программист не предусмотрел сворачивание окна в ответ на обработку стандартных событий, значит так и надо... Поэтому такое поведение правильное, как на меня.
Любая задача имеет решение, даже когда решения не существует
Здравствуйте, Burd, Вы писали:
B>Каждое приложение формирует свое окно таким образом чтобы пользователю было удобно с ним работать. Если программист не предусмотрел сворачивание окна в ответ на обработку стандартных событий, значит так и надо... Поэтому такое поведение правильное, как на меня.
Вопрос был:
Q. Как реализовать функцию "свернуть все окна"?
Т.е. сделать функцию, аналогичную виндовой, вызываемой к примеру нажатием Win+D.
Так вот, приведенный код не решает эту задачу, поскольку Win+D сворачиваем все, в независимости от того, что там программист предусмотрел или непредусмотрел, а код — нет.
PS: Кстати а не попробовать ли через SendInput. Хотя я попробовал:
B>>Каждое приложение формирует свое окно таким образом чтобы пользователю было удобно с ним работать. Если программист не предусмотрел сворачивание окна в ответ на обработку стандартных событий, значит так и надо... Поэтому такое поведение правильное, как на меня.
E>Вопрос был:
E>
E>Q. Как реализовать функцию "свернуть все окна"?
E>Т.е. сделать функцию, аналогичную виндовой, вызываемой к примеру нажатием Win+D. E>Так вот, приведенный код не решает эту задачу, поскольку Win+D сворачиваем все, в независимости от того, что там программист предусмотрел или непредусмотрел, а код — нет.
"Свернуть все окна" на самом деле не сворачивает их, а перемещает за пределы десктопа (в чем можно убедиться, посмотрев их координаты в Spy++).
Здравствуйте, ekamaloff, Вы писали:
E>Т.е. сделать функцию, аналогичную виндовой, вызываемой к примеру нажатием Win+D. E>Так вот, приведенный код не решает эту задачу, поскольку Win+D сворачиваем все,
Я делал для Win+M, а не для Win+D
Любая задача имеет решение, даже когда решения не существует
:
A>>Что за константа 0x019f
B>Недокументированая. Как можно узнать? С помощь программки работы с окнами (spy++). Перехватить сообщение, которое генерится при нажатии кнопок 'свернуть все окна'.
Вопрос: на какой оси Вы это ловили и какой версией спая ?
У меня сейчас под рукой только XP, так вот на ней Spy++v.7 соответствующих WM_COMMAND не улавливает...
Здравствуйте, Andrew S, Вы писали:
AS>"Свернуть все окна" на самом деле не сворачивает их, а перемещает за пределы десктопа (в чем можно убедиться, посмотрев их координаты в Spy++).
На самом деле операция "Свернуть все окна" на разные top-level окна действует по-разному.
1) У одних окон (например, многих дельфийских) — просто сбрасывается бит WS_VISIBLE.
2) Другие, если у них установлен бит WS_MINIMIZEBOX, перемещаются за пределы десктопа; при этом все-таки сворачиваются в полоску (ее при желании можно увидеть, например, через WM_PRINT).
3) А для окон без бита WS_MINIMIZEBOX у виндов припасен трюк с Z-order-ом (через Spy++ того не отследить, но можно вот этим).
Вот фрагмент дерева окон до "свертывания" (речь о свертывании типа Win+D):
Z-ord hWnd Tree Status Width Height X Y Exec.file Class Text
0 00010014 Desktop > VE 0 1280 1024 0 0 csrss.exe #32769 ""
42 001701ba w > HE 0 1280 1024 0 0 explorer.exe WorkerW ""
226 00010086 w > VE 0 1280 1024 0 0 explorer.exe Progman "Program Manager"
227 00010090 .w VE 0 1280 994 0 0 explorer.exe SHELLDLL_DefView ""
228 00010092 ..w VE 0 1280 994 0 0 explorer.exe SysListView32 "FolderView"
229 00040250 ...w HE 0 0 0 0 0 explorer.exe SysHeader32 ""
А вот что происходит при "свертывании":
Z-ord hWnd Tree Status Width Height X Y Exec.file Class Text
0 00010014 Desktop > VE 0 1280 1024 0 0 csrss.exe #32769 ""
42 001701ba w > VE 0 1280 1024 0 0 explorer.exe WorkerW ""
43 00010090 .w VE 0 1280 994 0 0 explorer.exe SHELLDLL_DefView ""
44 00010092 ..w VE 0 1280 994 0 0 explorer.exe SysListView32 "FolderView"
45 00040250 ...w HE 0 0 0 0 0 explorer.exe SysHeader32 ""
229 00010086 w > VE 0 1280 1024 0 0 explorer.exe Progman "Program Manager"
Top-level окна между 45 и 229 — "свернуты" (т.е. Z-адвинуты под 'десктоп'-SysListView32 c hWnd=00010092).
K>Вопрос: на какой оси Вы это ловили и какой версией спая ? K>У меня сейчас под рукой только XP, так вот на ней Spy++v.7 соответствующих WM_COMMAND не улавливает...
Ловил я на 2000 винде, но эта фича работает и в Win9x, так как фрагмент работал без проблем. Не думаю что для ХР будет какая-то разница. Свертыванием окон занимается панель задач... А онаВот оно и принимает сообщение.
А нащет Ctrl+D — попробую найти...
Любая задача имеет решение, даже когда решения не существует
Здравствуйте, Burd, Вы писали:
B>Ловил я на 2000 винде, но эта фича работает и в Win9x, так как фрагмент работал без проблем. Не думаю что для ХР будет какая-то разница. Свертыванием окон занимается панель задач... А онаВот оно и принимает сообщение. B>А нащет Ctrl+D — попробую найти...
Ой, Вы уже ответили ... Что-то типа этого я и ожидал получить )... Рад что вопрос решен...
Любая задача имеет решение, даже когда решения не существует
Здравствуйте, kero, Вы писали:
K>P.S. Но остается вопрос к Burd: Вы правда перехватывали WM_COMMAND с wParam=19f при нажатии кнопки 'свернуть все окна' ?
Не совсем так... Я отлавливал WM_COMMAND от другой програмки, которая уже имела кнопку 'Свернуть все окна'... Из панели задач я перехватывать не пробовал... Видно, зря ... Подумал, наивный, что так же работает и там...
Любая задача имеет решение, даже когда решения не существует
Однако ведь и Win+D не свернет WS_EX_TOPMOST-окно без WS_MINIMIZEBOX...
Так что если надо свернуть и такие окна — вот набросок решения:
перед WM_COMMAND(407,0) меняем Z-order упомянутого выше WorkerW.
Внимание: ярлычок этого триггера на панель Quick Launch лучше не класть
K>Так что если надо свернуть и такие окна — вот набросок решения
Однако на форумах не умирает и обратный вопрос: как сделать, чтоб мое окно не сворачивалось ?
Наверное, уместно на него здесь же и ответить.
Можно так: WS_EX_TOPMOST-окно без WS_MINIMIZEBOX + тупой цикл с SetWindowPos(*HWND_TOPMOST*).
А можно иначе.
Поскольку операция "Свернуть все окна" действует только на WS_VISIBLE top-level окна — превращаем окно в "якобы top-level":
заменяем через SetParent родителя на Progman и получаем что-то вроде этого.