![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
Делаю обозреватель окошек, что-то вроде Spy++ из поставки VS. Появилась идея для каждого окошка в дереве рисовать иконку. Получаю иконку при помощи WM_GETICON, для большинства окон все ОК. Проблема с апплетами панели управления (к примеру, Свойства: Экран) для них иконку получить не удается, но в списке задач, который появляется по Alt+Tab иконка показывается. Какие идеи?
з.ы. В случае если WM_GETICON не помогает использую GetClassLong, но для апплетов это тоже результатов не дает. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
В мсдн нашел следующее:
Соотв. мне кажется, что тот же alt+tab посылает WM_GETICON А если поставить глобальный хук на WM_GETICON и нажать аль+таб, то он вывалится? Не пробовал? -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
Оказалось, что у окна просто нет иконки
![]() -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
Иконка содержится в ресурсах *.cpl
Т.е. тебе придется узнать имя модуля и там смотреть ресурсы... Это сообщение отредактировал(а) p0s0l - 11.9.2003, 05:54 -------------------- С уважением, г-н Посол. |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
Имя модуля по окну я узнать могу, но:
1. Имя модуля всегда rundll32.exe. Но это еще можно как-то обойти, т.е. посмотреть загружены ли в контексте rundll32 модуль чье имя имеет расширение cpl. Но опять же вопрос: а если показывается несколько апплетов одновременно. 2. В одном *.cpl файле может быть несколько апплетов и у каждого своя иконка. Не ясно как по окну узнать, какой из апплетов загружен. з.ы. есть наверно очень простой путь..., известный только MS ![]() ![]() ![]() -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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 не уверен:
Может быть надо будет писать хэндл родительского окна... -------------------- С уважением, г-н Посол. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
Как раз через CplApplet(CPL_NEWINQUIRE) система и узнает иконку, когда запускает нужный апплет... Я так думаю... -------------------- С уважением, г-н Посол. |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
буду пробовать...
p0s0l, ты думаешь, что info.szName всегда равно заголовку окна? -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
млин, приплыли, делал-делал и вдруг читаю:
Т.е. szName это подпись под иконкой в панели управления, совсем не заголовок окна ![]() ![]() ![]() проблема начинает становиться интересной ![]() -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
Хук не ставил, но судя по Spy++, который мониторит сообщения к окнам по Alt+Tab ни чего не приходит. Spy++ использует хуки, так что можно считать, что хук ставил ![]() что же делать ![]() -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
Да уж...
Если рубить, дак рубить... Можно запустить апплет (CPlApplet(hwnd, CPL_DBLCLK,...), а через долю секунды его закрыть, но перед этим посмотрев, какое дочернее окно появилось у окна hwnd. Чтобы это каждый раз не перезапускалось - запускай каждый апплет только 1 раз и запоминай заголовок диалога... Правда, геморрно все это... Но другого способа пока не вижу. -------------------- С уважением, г-н Посол. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |