Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.10.2008, 15:14   #1
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию Как место меню закрытия окна вставить что-то свое?

Здравствуйте.

Как можно перехватить действие: нажатие правой кнопкой мыши по ярлыку программы в панеле Windows? Это есть на картинке. И показать вместо этого меню что-то свое (например тоже меню, но свое, улучшенное).

Кто что может, подскажите. Спасибо!
Изображения
Тип файла: jpg Безымянный.JPG (14.7 Кб, 148 просмотров)
лучший подарок женщине-программисту
chandrasecar вне форума
Старый 06.10.2008, 15:44   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Незнаю прямых ходов, т.к. не искал не разбирался, но может поставить хук на создания окна, потом полученный в хуке хендл проверить на стиль WS_POPUP если етот стиль есть то проверить координаты окна и с областью панели задач... если где-то там прерываем окно и показываем свое.
BOBAH13 вне форума
Старый 06.10.2008, 15:57   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Можно переделать это меню, добавить/убрать пункты...

Тока в делфи "меню окна" и меню "кнопки на панели" разное.
Доступ к первому GetSystemMenu(form1.handle, false);
ко в торому GetSystemMenu(application.handle, false);
пыщь

Последний раз редактировалось JTG; 06.10.2008 в 16:04.
JTG вне форума
Старый 07.10.2008, 12:39   #4
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Спасибо. Как я понял с помощью ф-ции GetSystemMenu можно только урезать меню или расширить, варьируя параметрами False и True. А как это меню убрать совсем и чтобы вместо щелчка правой кнопкой вылезала, скажем, новая форма?
лучший подарок женщине-программисту
chandrasecar вне форума
Старый 07.10.2008, 19:12   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
Лампочка

Цитата:
Незнаю прямых ходов, т.к. не искал не разбирался, но может поставить хук на создания окна, потом полученный в хуке хендл проверить на стиль WS_POPUP если етот стиль есть то проверить координаты окна и с областью панели задач... если где-то там прерываем окно и показываем свое.
Мсье знает толк в извращениях

Итак, при помощи МНТм (метод научного тыка мышью), а также МНИ (метод научной интуиции), было установлено: при правом/левом клике по кнопке на панели задач приходит вот такая серия сообщений окну (application.handle, а не form.handle)

$B001 ? <- Тут нажали мышь
$0046 WM_WINDOWPOSCHANGING
$001C WM_ACTIVATEAPP
$B000 ? <- Тут отпустили мышь
$007F WM_GETICON
$0313 ?
$00AE ?
$00AE ?
$00AE ?
$00AE ?
$0211 WM_ENTERMENULOOP
$0020 WM_SETCURSOR
$00AE ?
$00AE ?
$00AE ?
$0116 WM_INITMENU
$0117 WM_INITMENUPOPUP
$0121 WM_ENTERIDLE

B000, B001, 0313, 00AE... - в заголовках не нашёл, странно, м.б. какие-то "дельфийские" штуки Перекрыв 0313 меню перестало появляться

Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    function HookProc(var Message: TMessage): Boolean;
  public
    { Public declarations }
  end;

...........

procedure TForm1.FormCreate(Sender: TObject);
begin
  application.HookMainWindow(HookProc);
end;

function TForm1.HookProc(var Message: TMessage): Boolean;
begin
  Result := False;
  if message.Msg = $0313 then
     begin
       MessageBox(0,'ПОЗДРАВЛЯЮ! Эпический велосипед изобретён успешно!'+#13#13+
                  'Супер-навороченное меню будет вот тут. Вам предстоит:'+#13+
                  '1. Отрисовывать его в нужном месте (около мыши)'+#13+
                  '2. Отслеживать повторное появление этого сообщения пока "меню" активно',
                  'Лямпапам', mb_ok+mb_iconinformation);
       result:=true; //не передаём сообщение окну
     end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  application.UnhookMainWindow(HookProc)
end;
Блин. В delphi 7 работает, в 2007 нет
пыщь

Последний раз редактировалось JTG; 07.10.2008 в 19:43.
JTG вне форума
Старый 07.10.2008, 22:29   #6
ForzaJuve
Пользователь
 
Регистрация: 27.09.2008
Сообщений: 38
По умолчанию

а не подскажите случайно как переписать етот хук не длЯ данной проги а глобально для всех прог?
ForzaJuve вне форума
Старый 07.10.2008, 22:40   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Не подскажу, ибо он даже для одной проги непонятно как работает
пыщь
JTG вне форума
Старый 07.10.2008, 22:58   #8
ForzaJuve
Пользователь
 
Регистрация: 27.09.2008
Сообщений: 38
По умолчанию

не для 1 проги понятно ты отлавливаеш сообщения а как их глобально отловить?
ForzaJuve вне форума
Старый 08.10.2008, 09:21   #9
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

JTG, большое спасибо! Скажите, а как эту же фишку сделать с другим меню Формы? Посмотрите скрин.

Заранее благодарен!
Изображения
Тип файла: bmp 1111.bmp (73.1 Кб, 145 просмотров)
лучший подарок женщине-программисту

Последний раз редактировалось chandrasecar; 08.10.2008 в 09:24.
chandrasecar вне форума
Старый 08.10.2008, 11:46   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
 private
    { Private declarations }
    procedure CaptionRClick(var Message: TMessage); message WM_NCRBUTTONDOWN;
    procedure CaptionLClick(var Message: TMessage); message WM_NCLBUTTONDOWN;
........

procedure TForm1.CaptionRClick(var Message: TMessage);
begin
   //если кликнули правой по шапке или иконке окна
   if (Message.wParam = HTCAPTION) or (Message.wParam = HTSYSMENU) then 
  begin
    ShowMessage('Правый клик по заголовку');
  end
  else inherited;  //остальное передаём окну
end;

procedure TForm1.CaptionLClick(var Message: TMessage);
begin
 //если кликнули по иконке окна
    if (Message.wParam = HTSYSMENU) then
  begin
    ShowMessage('Клик по иконке окна');
  end
  else inherited;
end;
пыщь

Последний раз редактировалось JTG; 08.10.2008 в 11:58. Причина: * поправочка
JTG вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сохранить значение Edit после закрытия tarakan1983 Помощь студентам 14 11.09.2008 08:25
Обработка события закрытия окна в С# Kriziun Общие вопросы .NET 2 14.04.2008 14:06
Перехват закрытия окна GAGARIN-NEW Общие вопросы Delphi 3 11.11.2007 12:30
TWebBrowser-как перехватить команду скрипта для закрытия окна и не дать ему закрыться Вовик Компоненты Delphi 5 03.10.2007 12:17
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13