Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Системное меню окна у себя дома... [D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]


DeadMeat ©   (2003-04-01 16:11:00) 

Люди... как на своей форме вызвать системное меню какого либо окна..., естественно handle того окна в комплекте присутствует... мне надо повесить его на кнопку например (SpeedButton)... Просто у меня есть кое-что на эту тему, но работает оно с ошибкой,... в смысле элементы меню показываются не те... Заранее спасибо...


DVM   (2003-04-06 19:08:00) [1]

Точно не знаю, но думаю, что состоянием пунктов этого меню управляет система. Если окно поменяло свое состояние, то пункты в этом меню не соответствуют действительности, пока система их не обновит. Но она обновляет меню только когда оно вызывается щелчком мыши на соответствующем месте окна. Любой другой способ вызова этого меню показывает нам "устаревшее" меню.

Наверняка есть недокументированный способ заставить меню обновится, но я его, к сожалению, не знаю. Им должен пользоваться Explorer. Это догадки, но скорее всего верные.


DeadMeat   (2003-04-06 18:59:00) [2]

А вот об этом я не думал, надо проверить... Просто интересно: а почему, после того когда я вызову это меню вручную, оно отображается в проге правильно?...


dvm   (2003-04-06 16:31:00) [3]


> При всём моём уважении к тебе, как к программеру, DVM, твой
> код работает с ошибками (как этот так и тот)...

А про то, чтобы правильно работало, меня никто и не спрашивал:)
Оба раза спрашивали про меню.

А если хочешь правильно, то надо собственноручно гасить и включать соответствующие пункты этого меню. Другого способа НЕТ!
Делается просто: узнаешь состояние окна и меняешь пункты меню.

Можешь посмотреть исходники LiteStep, там как раз так и сделано.


DeadMeat   (2003-04-04 21:04:00) [4]

> Morfein
Может я что-то делаю не так, но у меня не работает... Меню не показывается...

> DVM

У меня такое ощущение, что я тебе отвечал уже в ветке Shell (была такая, длиннная, длиннная).....

Ты совершенно прав. Кстати интересная была тема, почему про неё забыли... Но я отвлёкся... При всём моём уважении к тебе, как к программеру, DVM, твой код работает с ошибками (как этот так и тот)... А точнее он выдаёт неправельные пункты меню, например если окно развёрнуто то пункт Развернутьбудет активен, а вместе с ним и все остальные... Также если окно в нормальном положении, то пункт восстановитьтакже активен... Но если вызвать системное меню того окна вручную (т.е. мышкой или клавой), то после этого все пункты в проге отображаются нормально... Я пытался сделать тоже самое но через API (в смысле чё нить типа инициализировать), но без успешно... Я не знаю, может я делаю чё не так:

procedure TForm1.Button1Click(Sender: TObject);
var
LItem : LongWord;
LMenu : HMENU;
handle1:hwnd;
begin
handle1:=findwindow (nil,"Мой компьютер");//или чё нить в этом роде...
if handle1<>0 then
begin
LMenu := GetSystemMenu(Handle1,false);
LItem := LongWord(Windows.TrackPopupMenu(LMenu, TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD,100, 100, 0 , Handle, nil));
if LItem>0 then SendMessage(Handle1,WM_SYSCOMMAND,LItem,0);
end;
end;


DVM   (2003-04-01 20:48:00) [5]


> DeadMeat

У меня такое ощущение, что я тебе отвечал уже в ветке Shell (была такая, длиннная, длиннная).

Здесь Handle - хендл того окна от которого системное меню.
Handle2 - твоя программа.

procedure TForm1.Button1Click(Sender: TObject);
var
LItem : LongWord;
LMenu : HMENU;
begin
LMenu := GetSystemMenu(Handle,false);
LItem := LongWord(Windows.TrackPopupMenu(LMenu, TPM_LEFTBUTTON or
TPM_RIGHTBUTTON or TPM_RETURNCMD,
100, 100, 0 , Handle2, nil));
if LItem>0 then SendMessage(Handle,WM_SYSCOMMAND,LItem,0);
end;

Координаты появления ставишь сам (100,100).



Morfein   (2003-04-01 20:36:00) [6]


var
x, y : dword;
menu : hMenu;

...
...

menu:=getMenu(handle_того_окна_в_комплекте);
TrackPopupMenu(menu, TPM_LEFTALIGN + TPM_LEFTBUTTON, x, y, 0, handle_того_окна_в_комплекте, nil);


DeadMeat   (2003-04-01 17:38:00) [7]

Своё всегда роднее и КРУЧЕ ... А если честно, то надо... очень надо...


Clickmaker   (2003-04-01 16:53:00) [8]

А чем системное меню какого-либо окна круче твоего "домашнего"?


Наверх

Титульная страница Поиск, карта сайта Написать письмо