WinAPI Q&A из #5-2004
От: Аноним  
Дата: 29.12.04 04:36
Оценка: 4 (4)
Статья:
WinAPI Q&A
Автор(ы): Burd, Alex Fedotov, Alexey Goncharov, Andrew S
Дата: 27.12.2002
- Как реализовать функцию "свернуть все окна"?
— Вид прототипа диалоговой процедуры
— С помощью SetWindowRgn я скруглил углы моего диалога, но теперь нет возможности схватить за эти круглые края и изменить размер диалога. Как это сделать?
— Как запустить "My computer" и "Recycle Bin" из другого приложения? Заранее благодарен




Авторы:
Alex Fedotov
Andrew S
Alexey Goncharov
Burd

Аннотация:
— Как реализовать функцию "свернуть все окна"?
— Вид прототипа диалоговой процедуры
— С помощью SetWindowRgn я скруглил углы моего диалога, но теперь нет возможности схватить за эти круглые края и изменить размер диалога. Как это сделать?
— Как запустить "My computer" и "Recycle Bin" из другого приложения?
Re: WinAPI Q&A из #5-2004
От: kero Россия  
Дата: 22.06.06 12:31
Оценка:
>Q. Как реализовать функцию "свернуть все окна"?
>A. Например, так:
>
HWND wnd = FindWindow("Shell_TrayWnd", NULL);
>if (wnd != NULL)
>    ::SendMessage(wnd, WM_COMMAND, 0x019f, 0); //Свернуть все окна

??
Top-level окна без WS_MINIMIZEBOX так не свернуть
(по крайней мере на XP)
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: WinAPI Q&A из #5-2004
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 30.06.06 11:45
Оценка:
Здравствуйте, kero, Вы писали:

>>Q. Как реализовать функцию "свернуть все окна"?

>>A. Например, так:
>>
HWND wnd = FindWindow("Shell_TrayWnd", NULL);
>>if (wnd != NULL)
>>    ::SendMessage(wnd, WM_COMMAND, 0x019f, 0); //Свернуть все окна

K>??
K>Top-level окна без WS_MINIMIZEBOX так не свернуть
K>(по крайней мере на XP)

Каждое приложение формирует свое окно таким образом чтобы пользователю было удобно с ним работать. Если программист не предусмотрел сворачивание окна в ответ на обработку стандартных событий, значит так и надо... Поэтому такое поведение правильное, как на меня.
Любая задача имеет решение, даже когда решения не существует
Re[3]: WinAPI Q&A из #5-2004
От: ekamaloff Великобритания  
Дата: 30.06.06 12:46
Оценка:
Здравствуйте, Burd, Вы писали:

B>Каждое приложение формирует свое окно таким образом чтобы пользователю было удобно с ним работать. Если программист не предусмотрел сворачивание окна в ответ на обработку стандартных событий, значит так и надо... Поэтому такое поведение правильное, как на меня.


Вопрос был:

Q. Как реализовать функцию "свернуть все окна"?


Т.е. сделать функцию, аналогичную виндовой, вызываемой к примеру нажатием Win+D.
Так вот, приведенный код не решает эту задачу, поскольку Win+D сворачиваем все, в независимости от того, что там программист предусмотрел или непредусмотрел, а код — нет.

PS: Кстати а не попробовать ли через SendInput. Хотя я попробовал:

  INPUT inputs[4];
    memset(inputs, 0, sizeof(inputs));
    inputs[0].type = INPUT_KEYBOARD;
    inputs[0].ki.wVk = VK_LWIN;
    inputs[1].type = INPUT_KEYBOARD;
    inputs[1].ki.wVk = 'd';
    inputs[2].type = INPUT_KEYBOARD;
    inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
    inputs[2].ki.wVk = 'd';
    inputs[3].type = INPUT_KEYBOARD;
    inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
    inputs[3].ki.wVk = VK_LWIN;
    SendInput(4, inputs, sizeof(INPUT));


и ничего не получилось.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: WinAPI Q&A из #5-2004
От: Andrew S Россия http://alchemy-lab.com
Дата: 30.06.06 13:05
Оценка: 4 (1)
B>>Каждое приложение формирует свое окно таким образом чтобы пользователю было удобно с ним работать. Если программист не предусмотрел сворачивание окна в ответ на обработку стандартных событий, значит так и надо... Поэтому такое поведение правильное, как на меня.

E>Вопрос был:


E>

E>Q. Как реализовать функцию "свернуть все окна"?


E>Т.е. сделать функцию, аналогичную виндовой, вызываемой к примеру нажатием Win+D.

E>Так вот, приведенный код не решает эту задачу, поскольку Win+D сворачиваем все, в независимости от того, что там программист предусмотрел или непредусмотрел, а код — нет.

"Свернуть все окна" на самом деле не сворачивает их, а перемещает за пределы десктопа (в чем можно убедиться, посмотрев их координаты в Spy++).
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: WinAPI Q&A из #5-2004
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 30.06.06 13:48
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Т.е. сделать функцию, аналогичную виндовой, вызываемой к примеру нажатием Win+D.

E>Так вот, приведенный код не решает эту задачу, поскольку Win+D сворачиваем все,


Я делал для Win+M, а не для Win+D
Любая задача имеет решение, даже когда решения не существует
Re[5]: WinAPI Q&A из #5-2004
От: kero Россия  
Дата: 01.07.06 02:31
Оценка:
Здравствуйте, Burd, Вы писали:

B>Я делал для Win+M, а не для Win+D


А что же не "доделали" и для Win+SHIFT+M: ...WM_COMMAND,01a0,0

Но меня вот что заинтересовало в исходной ветке
Автор: Burd
Дата: 02.08.04
:

A>>Что за константа 0x019f


B>Недокументированая. Как можно узнать? С помощь программки работы с окнами (spy++). Перехватить сообщение, которое генерится при нажатии кнопок 'свернуть все окна'.


Вопрос: на какой оси Вы это ловили и какой версией спая ?
У меня сейчас под рукой только XP, так вот на ней Spy++v.7 соответствующих WM_COMMAND не улавливает...
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[5]: WinAPI Q&A из #5-2004
От: kero Россия  
Дата: 01.07.06 06:33
Оценка: 9 (2)
Здравствуйте, 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).

(Visible/Hidden Enabled/Disabled)


P.S. Это все на XP.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: WinAPI Q&A из #5-2004
От: kero Россия  
Дата: 01.07.06 17:32
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Кстати а не попробовать ли через SendInput. Хотя я попробовал: [...] и ничего не получилось.


А через superseded так сразу :
keybd_event(VK_LWIN,0,0,0)
keybd_event('D',0,0,0)
keybd_event('D',0,KEYEVENTF_KEYUP,0)
keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0)
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[6]: WinAPI Q&A из #5-2004
От: kero Россия  
Дата: 02.07.06 23:58
Оценка: 2 (1)
Что-то не отпускает WM_COMMAND для Shell_TrayWnd, спасибо Burd

Вот он, аналог Win+D:
PostMessage (hWnd(Shell_TrayWnd),WM_COMMAND,0x0197,0)

Короче, открываем Explorer в редакторе ресурсов, смотрим раздел Menu и видим:

"&Выполнить...", 401, MFT_STRING, MFS_ENABLED                 
"Завер&шение сеанса %s...", 402, MFT_STRING, MFS_ENABLED      
"&Каскадом", 403, MFT_STRING, MFS_ENABLED                     
"Окна &каскадом",  403                                        
"Окна свер&ху вниз",  404                                     
"С&верху вниз", 404, MFT_STRING, MFS_ENABLED                  
"Окна с&лева направо",  405                                   
"С&лева направо", 405, MFT_STRING, MFS_ENABLED                
"Показать &рабочий стол",  407                                
"&Настройка даты/времени",  408                               
"Отстыковать &компьютер", 410, MFT_STRING, MFS_ENABLED        
"Панель &задач и меню \"Пуск\"", 413, MFT_STRING, MFS_ENABLED 
"Сво&йства",  413                                             
"&Отменить",  416                                             
"Д&испетчер задач",  420                                      
"Н&астройка уведомлений...",  421                             
"&Закрепить панель задач",  424                               
"&Справка и поддержка", 503, MFT_STRING, MFS_ENABLED          
"П&анель управления", 505, MFT_STRING, MFS_ENABLED            
"&Завершение работы...", 506, MFT_STRING, MFS_ENABLED         
"Пр&интеры и факсы", 510, MFT_STRING, MFS_ENABLED             
"Отклю&чить...", 5000, MFT_STRING, MFS_ENABLED
...

Т.е. wParam в WM_COMMAND для Shell_TrayWnd — это просто-напросто ID итема меню эксплорера.

А "недокументированая константа 0x019f" (415) — это ID выброшенного из меню итема:
итем выбросили, а обработка ID осталась... гипотеза, конечно

P.S. Но остается вопрос к Burd: Вы правда перехватывали WM_COMMAND с wParam=19f при нажатии кнопки 'свернуть все окна' ?
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[6]: WinAPI Q&A из #5-2004
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 03.07.06 05:17
Оценка:
Здравствуйте, kero, Вы писали:


K>Вопрос: на какой оси Вы это ловили и какой версией спая ?

K>У меня сейчас под рукой только XP, так вот на ней Spy++v.7 соответствующих WM_COMMAND не улавливает...


Ловил я на 2000 винде, но эта фича работает и в Win9x, так как фрагмент работал без проблем. Не думаю что для ХР будет какая-то разница. Свертыванием окон занимается панель задач... А онаВот оно и принимает сообщение.
А нащет Ctrl+D — попробую найти...
Любая задача имеет решение, даже когда решения не существует
Re[7]: WinAPI Q&A из #5-2004
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 03.07.06 05:20
Оценка:
Здравствуйте, Burd, Вы писали:

B>Ловил я на 2000 винде, но эта фича работает и в Win9x, так как фрагмент работал без проблем. Не думаю что для ХР будет какая-то разница. Свертыванием окон занимается панель задач... А онаВот оно и принимает сообщение.

B>А нащет Ctrl+D — попробую найти...

Ой, Вы уже ответили ... Что-то типа этого я и ожидал получить )... Рад что вопрос решен...
Любая задача имеет решение, даже когда решения не существует
Re[7]: WinAPI Q&A из #5-2004
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 03.07.06 06:59
Оценка:
Здравствуйте, kero, Вы писали:

K>P.S. Но остается вопрос к Burd: Вы правда перехватывали WM_COMMAND с wParam=19f при нажатии кнопки 'свернуть все окна' ?


Не совсем так... Я отлавливал WM_COMMAND от другой програмки, которая уже имела кнопку 'Свернуть все окна'... Из панели задач я перехватывать не пробовал... Видно, зря ... Подумал, наивный, что так же работает и там...
Любая задача имеет решение, даже когда решения не существует
Re[7]: WinAPI Q&A из #5-2004
От: kero Россия  
Дата: 06.07.06 20:56
Оценка: 5 (1)
K>Вот он, аналог Win+D:
K>
PostMessage (hWnd(Shell_TrayWnd),WM_COMMAND,0x0197,0)

Однако ведь и Win+D не свернет WS_EX_TOPMOST-окно без WS_MINIMIZEBOX...
Так что если надо свернуть и такие окна — вот набросок решения:
перед WM_COMMAND(407,0) меняем Z-order упомянутого выше WorkerW.
Внимание: ярлычок этого триггера на панель Quick Launch лучше не класть
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[8]: WinAPI Q&A из #5-2004
От: kero Россия  
Дата: 13.07.06 10:18
Оценка:
K>Так что если надо свернуть и такие окна — вот набросок решения

Однако на форумах не умирает и обратный вопрос: как сделать, чтоб мое окно не сворачивалось ?
Наверное, уместно на него здесь же и ответить.

Можно так: WS_EX_TOPMOST-окно без WS_MINIMIZEBOX + тупой цикл с SetWindowPos(*HWND_TOPMOST*).

А можно иначе.
Поскольку операция "Свернуть все окна" действует только на WS_VISIBLE top-level окна — превращаем окно в "якобы top-level":
заменяем через SetParent родителя на Progman и получаем что-то вроде этого.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.