Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обозреватель окошек 
:(
    Опции темы
stab
  Дата 10.9.2003, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Делаю обозреватель окошек, что-то вроде Spy++ из поставки VS. Появилась идея для каждого окошка в дереве рисовать иконку. Получаю иконку при помощи WM_GETICON, для большинства окон все ОК. Проблема с апплетами панели управления (к примеру, Свойства: Экран) для них иконку получить не удается, но в списке задач, который появляется по Alt+Tab иконка показывается. Какие идеи?

з.ы. В случае если WM_GETICON не помогает использую GetClassLong, но для апплетов это тоже результатов не дает.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Baa
Дата 10.9.2003, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



В мсдн нашел следующее:
Цитата

An application sends the WM_SETICON message to associate a new large or small icon with a window. The system displays the large icon in the ALT+TAB dialog box, and the small icon in the window caption.

Соотв. мне кажется, что тот же alt+tab посылает WM_GETICON
А если поставить глобальный хук на WM_GETICON и нажать аль+таб, то он вывалится? Не пробовал?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
stab
Дата 11.9.2003, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Оказалось, что у окна просто нет иконки smile.gif т.е. она равна NULL, нет иконки и у класса. Не ясно откуда тогда Alt+Tab берет иконку :/


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 11.9.2003, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Иконка содержится в ресурсах *.cpl
Т.е. тебе придется узнать имя модуля и там смотреть ресурсы...


Это сообщение отредактировал(а) p0s0l - 11.9.2003, 05:54


--------------------
С уважением, г-н Посол.
PM   Вверх
stab
Дата 11.9.2003, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Имя модуля по окну я узнать могу, но:

1. Имя модуля всегда rundll32.exe. Но это еще можно как-то обойти, т.е. посмотреть загружены ли в контексте rundll32 модуль чье имя имеет расширение cpl. Но опять же вопрос: а если показывается несколько апплетов одновременно.
2. В одном *.cpl файле может быть несколько апплетов и у каждого своя иконка. Не ясно как по окну узнать, какой из апплетов загружен.

з.ы. есть наверно очень простой путь..., известный только MS smile.gif Весь msdn перерыл ни че не нашел похожего sad.gif инет тоже по возможности весь просмотрел smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 11.9.2003, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Порывшись в хелпе WinAPI, вот что придумал, правда, не знаю, что из этого получится...
Короче, если проблема стоит в том, что в одном cpl несколько апплетов, то можно попробовать так:
1)Подключаешь *.cpl как обычную dll. (LoadLibrary или GetModuleHandle)
2)Получаешь адрес процедуры "CplApplet" (GetProcAddress)
3)Вызываешь int n = CplApplet(0, CPL_GETCOUNT, 0, 0), которая возвращает кол-во диалогов в cpl
4)for (int i=0; i<n; i++)
{
NEWCPLINFO info;
info.dwSize = sizeof(info);
CplApplet(0, CPL_NEWINQUIRE, i, &info);
// тут проверка
}
5)В проверке ^^^ сверяй info.szName с именем окна, для которого ты пытаешься узнать иконку.
Если строки совпадают, то в info.hIcon сидит HICON иконки...

PS: Только насчет первого параметра в CplApplet не уверен:
Цитата
hwndCPl

Identifies the main window of the controlling application.

Может быть надо будет писать хэндл родительского окна...



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 11.9.2003, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Цитата
.ы. есть наверно очень простой путь..., известный только MS  Весь msdn перерыл ни че не нашел похожего  инет тоже по возможности весь просмотрел 

Как раз через CplApplet(CPL_NEWINQUIRE) система и узнает иконку, когда запускает нужный апплет... Я так думаю...




--------------------
С уважением, г-н Посол.
PM   Вверх
stab
Дата 11.9.2003, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



буду пробовать...

p0s0l, ты думаешь, что info.szName всегда равно заголовку окна?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 11.9.2003, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



млин, приплыли, делал-делал и вдруг читаю:

Цитата
szName
Null-terminated string that contains the dialog box name. The name is intended to be displayed below the icon.


Т.е. szName это подпись под иконкой в панели управления, совсем не заголовок окна sad.gif sad.gif sad.gif


проблема начинает становиться интересной smile.gif решение явно не на виду.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 11.9.2003, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата
А если поставить глобальный хук на WM_GETICON и нажать аль+таб, то он вывалится?


Хук не ставил, но судя по Spy++, который мониторит сообщения к окнам по Alt+Tab ни чего не приходит. Spy++ использует хуки, так что можно считать, что хук ставил smile.gif

что же делатьconfused.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 12.9.2003, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Да уж...
Если рубить, дак рубить...
Можно запустить апплет (CPlApplet(hwnd, CPL_DBLCLK,...), а через долю секунды его закрыть, но перед этим посмотрев, какое дочернее окно появилось у окна hwnd.
Чтобы это каждый раз не перезапускалось - запускай каждый апплет только 1 раз и запоминай заголовок диалога...

Правда, геморрно все это... Но другого способа пока не вижу.



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.