свернуь все окна приложений на рабочем столе
От: Аноним  
Дата: 02.08.04 15:34
Оценка:
приветствую всех!
люди помогите найти решение след. проблеммы...
заранее оговорюсь, что просмотрел весь форум по WINAPI и не нашел редения данной проблеммы, встречал только решение частных случаев (типа свернуть одно ОПРЕДЕЛЕННОЕ окно).
у меня в программе должна быть реализована функция "свернуть все окна".
я пытался решить эту проблемму с помощью фун. EnumWindow но она перебирает HWND не только окон приложений, а также невибимых окон приложений (например тех что в трее) и когда я его(такое окно) минимизирую, посылкой
SendMessage(hwnd,MW_SYSCOMMAND,(MAKEWPARAM(SC_CLOSE,0),0);
оно(они) становиться ВИДИМЫМ!!!
Но мне этого никак не нужно.
Подсткажите как определить:
1) что хэндл окна являеться хэндлом именно видимого окна приложения.(наприме Word или Окно папки)
2) или ваш вариант всертывания всех окон
заранее благодарен за любой ответ
Как свернуть все окна приложений на рабочем столе
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 02.08.04 15:38
Оценка: 31 (4)
#Имя: FAQ.winapi.minimizeall
А>у меня в программе должна быть реализована функция "свернуть все окна".

    HWND wnd = ::FindWindow( "Shell_TrayWnd", NULL );

    if ( wnd != NULL )
        ::SendMessage( wnd, WM_COMMAND, 0x019f, 0 ); //Свернуть все окна
Любая задача имеет решение, даже когда решения не существует
Re: свернуь все окна приложений на рабочем столе
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.08.04 15:38
Оценка: -1
Здравствуйте, Аноним, Вы писали:

а если сэмулировать нажатие клавиш Win+M или Win+D?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: свернуь все окна приложений на рабочем столе
От: Аноним  
Дата: 02.08.04 15:41
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>а если сэмулировать нажатие клавиш Win+M или Win+D?


пробовал... не получилось у меня!
Re[2]: свернуь все окна приложений на рабочем столе
От: Аноним  
Дата: 02.08.04 15:44
Оценка:
Здравствуйте, Burd, Вы писали:

B>
B>wnd = ::FindWindow( "Shell_TrayWnd", NULL );    
        
B>if ( wnd != NULL )
B>  ::SendMessage( wnd, WM_COMMAND, 0x019f, 0 ); /Свернуть все окна
B>


Много уважаемы мистре Burd огромное вам спасибо!!!!
но можно тогда еще один вопросик...
Что за константа 0x019f и почему енто собщение нуна посылать Shell_TrayWnd это наверное ярлычок свернуть све окна???(предположение)
Re[3]: свернуь все окна приложений на рабочем столе
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 02.08.04 15:53
Оценка:
A>Что за константа 0x019f

Недокументированая. Как можно узнать? С помощь программки работы с окнами (spy++). Перехватить сообщение, которое генерится при нажатии кнопок 'свернуть все окна'. Замечу, что приведеный мной код — это не эмуляция нажатия.

А>и почему енто собщение нуна посылать Shell_TrayWnd это наверное ярлычок свернуть све окна???(предположение)


Нет. Кто принимает окна, которые сворачиваются? Панель задач — вот это она их и сворачивает. Правда, сворачивает процесс с названием explorer.exe, но окно Shell_TrayWnd создается в нем.
Любая задача имеет решение, даже когда решения не существует
Re[3]: свернуь все окна приложений на рабочем столе
От: .Mistery Беларусь  
Дата: 02.08.04 15:55
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Burd, Вы писали:


B>>
B>>wnd = ::FindWindow( "Shell_TrayWnd", NULL );    
        
B>>if ( wnd != NULL )
B>>  ::SendMessage( wnd, WM_COMMAND, 0x019f, 0 ); /Свернуть все окна
B>>


А>Много уважаемы мистре Burd огромное вам спасибо!!!!

А>но можно тогда еще один вопросик...
А>Что за константа 0x019f и почему енто собщение нуна посылать Shell_TrayWnd это наверное ярлычок свернуть све окна???(предположение)

Я понимаю, что "Аноним" может быть недостаточно опытен в WinAPI но это не является оправданием таких дурацких предположений!
Посмотрите хотябы справку по FindWindow! А потом заодно и раздел Windowing в MSDN!

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re[4]: свернуь все окна приложений на рабочем столе
От: Аноним  
Дата: 02.08.04 15:55
Оценка:
Здравствуйте, Burd, Вы писали:

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


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


А>>и почему енто собщение нуна посылать Shell_TrayWnd это наверное ярлычок свернуть све окна???(предположение)


B>Нет. Кто принимает окна, которые сворачиваются? Панель задач — вот это она их и сворачивает. Правда, сворачивает процесс с названием explorer.exe, но окно Shell_TrayWnd создается в нем.


большое сэнкю! как это я не догадасля spy++ врубить! (стормозил)
еще рас спасибо
Re[4]: свернуь все окна приложений на рабочем столе
От: Аноним  
Дата: 02.08.04 15:58
Оценка:
Здравствуйте, .Mistery, Вы писали:

M>Здравствуйте, <Аноним>, Вы писали:


А>>Здравствуйте, Burd, Вы писали:


B>>>
B>>>wnd = ::FindWindow( "Shell_TrayWnd", NULL );    
        
B>>>if ( wnd != NULL )
B>>>  ::SendMessage( wnd, WM_COMMAND, 0x019f, 0 ); /Свернуть все окна
B>>>


А>>Много уважаемы мистре Burd огромное вам спасибо!!!!

А>>но можно тогда еще один вопросик...
А>>Что за константа 0x019f и почему енто собщение нуна посылать Shell_TrayWnd это наверное ярлычок свернуть све окна???(предположение)

M>Я понимаю, что "Аноним" может быть недостаточно опытен в WinAPI но это не является оправданием таких дурацких предположений!

M>Посмотрите хотябы справку по FindWindow! А потом заодно и раздел Windowing в MSDN!

M>Удачи!


Мда, оправдания здесь бесполезны...Спасибо загляну!
Re[2]: свернуь все окна приложений на рабочем столе
От: Аноним  
Дата: 02.08.04 17:16
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>а если сэмулировать нажатие клавиш Win+M или Win+D?

еще вариант — сделать ShellExecute("Show Desktop.scf" )
Свернуть все окна приложений на рабочем столе
От: aGrey Литва  
Дата: 02.08.04 17:53
Оценка: 45 (4) +1
#Имя: FAQ.winapi.minimizeall2
Вариантов конечно много, но, есть таки и "легальный" способ...
На C++ это будет выглядеть так:

#include <windows.h>
#include <shldisp.h> // ole32.lib uuid.lib

BOOL SHMinimizeAll(BOOL fUndo) {

LONG lRes = -1, lNCo = CoInitialize(NULL);

if(lNCo == S_OK || lNCo == S_FALSE)
{
    IShellDispatch * pIShDisp = NULL;

    CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER,
        IID_IShellDispatch, (LPVOID*)&pIShDisp);

    if(pIShDisp != NULL)
    {
        if(fUndo) lRes = pIShDisp->MinimizeAll();
        else      lRes = pIShDisp->UndoMinimizeALL();

        pIShDisp->Release();
    }

    CoUninitialize();
}

return (lRes == S_OK);    }


А можно и на JavaScript

new ActiveXObject('Shell.Application').MinimizeAll()
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.