Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Вниз

Системное меню окна у себя дома...   Найти похожие ветки 

 
DeadMeat   (2003-04-01 16:11) [0]

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


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

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


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

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


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


var
x, y : dword;
menu : hMenu;

...
...

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


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


> 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).




 
DeadMeat   (2003-04-04 21:04) [5]

> 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-06 16:31) [6]


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

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

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

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



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

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


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

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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
7-13498
Владимир-В
2003-04-03 14:56
2003.06.05
Работа с компонентами Async Pro


14-13470
GigoVich
2003-05-03 20:39
2003.06.05
Карточная Игра - Реально то что возможно...


4-13508
DVM
2003-04-07 10:15
2003.06.05
Посоветуйте как можно еще оптимизировать кусок кода


3-13032
Praco
2003-05-16 11:23
2003.06.05
При восстановлении из бэкапа часть индексов неактивны


1-13186
AlexCool
2003-05-26 13:10
2003.06.05
Напечатать документ Word в Canvas?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский