Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.137.218] |
|
Сообщ.
#1
,
|
|
|
Как получить ID "Обновить" меню, всплывающего на Актив десктопе.
|
Сообщ.
#2
,
|
|
|
Было бы неплохо уточнить для чего этот ID понадобился, тогда была бы возможность дать более конкретный ответ. У меня на машине это ID равен 28931, это можно узнать с помощью Spy++ отследив комманды от меню окну ""SHELLDLL_DefView окна "Program Manager" Progman в момент нажатия на этот пункт, или найти в ресурсах shell32.dll меню(215) и получить ID из него.
|
Сообщ.
#3
,
|
|
|
Хочу послать его в WM_COMMAND, для обновления десктопа.
|
Сообщ.
#4
,
|
|
|
Простенький пример в котором я порчу и обновляю десктоп
<br> HWND test=FindWindow("Progman","Program Manager");<br> //или если надо обновить все окна HWND test=GetDesktopWindow();<br><br> //Портим изображение<br> HDC dc=GetWindowDC(test);<br> BitBlt(dc, 0, 0, 444, 444, dc, 10, 10, SRCCOPY);<br> ReleaseDC(test,dc);<br><br> //Востанавливаем<br> RedrawWindow(test,NULL,NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);<br> Так что если надо всего лишь обновить десктоп то проще послать ему не WM_COMMAND а просто дать комманду перерисоватся. |
Сообщ.
#5
,
|
|
|
К сожалению "просто" не получается. :'(
И твой пример не подходит, нет портит он хорошо ;D(правда не актив десктоп) А вот восстановить... Может,конечно, он что-то восстанавливает,но не заметно. Реально - только "Обновить" из меню. |
Сообщ.
#6
,
|
|
|
Может не совсем в тему, но есть такое понятие как HWND_DESKTOP.
#define HWND_DESKTOP ((HWND)0) /*определен в winuser.h*/ и соответственно HDC hDC = GetDC( HWND_DESKTOP );// или BeginPaint... если есть желание ченьть попортить... т.е. можно послать WM_PAINT или InvalidateRect или еще чего... |
Сообщ.
#7
,
|
|
|
А.. понял надо перечитать страницу для активного десктопа а не обновить его - тогда следущий код
<br>#include <wininet.h><br>#include <ShlObj.h><br><br> ...<br><br> CoInitialize(NULL);<br> IActiveDesktop* pIActiveDesktop = NULL;<br> HRESULT hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,IID_IActiveDesktop, (void**) &pIActiveDesktop);<br> if (FAILED(hr)) pIActiveDesktop = NULL;<br> if (pIActiveDesktop != NULL) {<br> pIActiveDesktop->ApplyChanges(AD_APPLY_ALL| AD_APPLY_SAVE | AD_APPLY_REFRESH | AD_APPLY_FORCE );<br> pIActiveDesktop->Release();<br> pIActiveDesktop = NULL;<br> }<br> CoUninitialize();<br><br> ...<br> Я конечно догадываюсь как можно програмно вычислить этот несчастный ID для WM_COMMAND но это будет настолько фаршно и некорректно, что как мне кажется лучше использовать варианты предоставленные самой системой. |
Сообщ.
#8
,
|
|
|
Боюсь,для ВБ, это слишком круто. ???
|
Сообщ.
#9
,
|
|
|
Цитата Alexei, 03.04.03, 17:23:51 Боюсь,для ВБ, это слишком круто. ??? Боюсь тогда любой предложенный мной способ на эту тему будет слишком крут для VB. Я сам в VB слишком плохо разбираюсь чтобы давать советы по переносу этого кода с C++, но может быть в VB если поискать найдутся анологичные интерфейсы для взаимодействия с шелом. |
Сообщ.
#10
,
|
|
|
А по-простому, как у людей, АПИшными функциями незя?
С некоторым скрипом, я их пристраиваю к ВБ, и при СИшном описании. |
Сообщ.
#11
,
|
|
|
Приведенный код испульзует АПИ CoInitialize, CoCreateInstance, CoUninitialize. Или я не прав?
|
Сообщ.
#12
,
|
|
|
Цитата Vasya2000, 05.04.03, 08:04:20 Приведенный код испульзует АПИ CoInitialize, CoCreateInstance, CoUninitialize. Или я не прав? Только не Win, a Com.Или я не прав? Эти функции зовутся из ВБ, но хотелось бы получить подробное описание того, что делается в примере.Типа: трудно искать черную кошку в темной комнате, в особенности, если ее в глаза не видел ! |
Сообщ.
#13
,
|
|
|
Я конечно понимаю что VB это круто и всё такое но может скомпилить и поместить C++ код в DLL и вызвать его оттуда(полагаю в VB это-то хоть можно).
|
Сообщ.
#14
,
|
|
|
Да. Если понимать с-суть, то может и все возможно сделать на ВБ.
Самая большая проблема - указатели на указатели,наверно. |